仿真圖proteus 8.9
程序編譯器:keil 5
編程語言:C語言
設計編號:C0097
1.主要功能
基于STM32的火災煙霧報警器Proteus仿真設計
1. 煙霧采集傳感器選用MQ-2,由于該傳感器輸出的是模擬信號,STM32內部ADC將模擬信號轉為數(shù)字信號。
2. 溫度采集使用DS18B20數(shù)字傳感器,溫度測量范圍-55到128℃,測量精度±0.1℃;
3. 顯示設備使用1602液晶,可以在屏幕上顯示實時煙霧濃度值、溫度值,以及報警值等信息;
4. 報警模塊則采用蜂鳴器和LED燈組成,兩個LED分別代表了煙霧報警指示和溫度報警指示,無論哪個檢測元素超標,蜂鳴器都會鳴叫報警;
5. 設計采用3個按鍵作為操作輸入設備,可以用來調節(jié)報警閾值的大??;
6.串口實時發(fā)送溫度檢測值、煙霧濃度測量值和報警信息給PC機。
主要硬件設備:STM32F103+LCD1602+DS18B20+蜂鳴器
資料下載鏈接:
通過百度網(wǎng)盤分享的文件:KEY_C0097
https://pan.baidu.com/s/1uSK6K6QSeRwRePmlgmFkuQ?pwd=f05a
提取碼:f05a
2.仿真
打開仿真工程,雙擊proteus中的單片機,選擇hex文件路徑,然后開始仿真。
STM32單片機實時檢測DS18B20溫度測量及顯示溫度測量范圍-55℃到128℃,測量精度±0.1℃,串口實時傳輸檢測溫度給PC機。圖示溫度閾值100℃,煙霧濃度報警值40%。
下圖煙霧濃度報警值40%,檢測煙霧濃度超出范圍,聲光報警,串口有相應提示。
溫度和煙霧報警閾值可以通過按鍵設置。LCD1602會有對應的指示。
3. 程序
程序是用keil5 mdk版本打開的,如果打開有問題,核實下keil的版本。程序是HAL版本編寫的,有stm32cubemx配置文件。有注釋可以結合講解視頻理解。
關鍵代碼
int main(void)
{
/* USER CODE BEGIN 1 */
char data_str1[20];
// char data_str2[20];
char data_str2[]="L:000C H:000C ";
float temp;
char str[20]; //溫度值轉換為字符串的存放數(shù)組
float adc_temp;
uint32_t adcv; //存放ADC轉換結果
ADC_ChannelConfTypeDef sConfig = {0}; //建立sConfig結構體
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
// printf("DS18B20測溫實驗nr");
HAL_UART_Transmit(&huart1, (uint8_t *)&"DS18B20_MQ-2rn", 13, 10); //串口1發(fā)送字符串,數(shù)組長度為10,
LCD_Init(); //LCD1602初始化
temp_H=100;smoke_H=10; //默認報警值 //默認溫度閾值20-40
// DS18B20_Get_Temp();
// HAL_TIM_Base_Start_IT(&htim2); //初始化定時器
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(500);
sConfig.Channel = ADC_CHANNEL_8; //選擇通道1
HAL_ADCEx_Calibration_Start(&hadc1); //開啟adc前校準一下ADC
HAL_ADC_ConfigChannel(&hadc1, &sConfig); //選擇ADC1的通道1
HAL_ADC_Start(&hadc1); //啟動ADC1
HAL_ADC_PollForConversion(&hadc1, 30); //等待ADC1轉換結束,超時設定為10ms
adcv = HAL_ADC_GetValue(&hadc1); //讀取ADC1的轉換結果
sprintf(str,"adc_value=%drn",adcv);
// HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 20);//串口1發(fā)送字符串,數(shù)組長度為strlen(str),超時20ms
memset(str,0,strlen(str));
// adc_temp=(float)adcv*(3.3/4095);
// adc_temp= pow(11.5428*35.904*adc_temp/(25.5-5.1*adc_temp),(1/0.6549));//計算公式源自https://blog.csdn.net/qq_35952136/article/details/95589074
adc_temp=(float)adcv*(100.0/4095);
#if 0
sprintf(str,"%0.2f",adc_temp);
HAL_UART_Transmit(&huart1, (uint8_t *)&"vote=", 5, 10); //串口1發(fā)送字符串,數(shù)組長度為12,超時10ms
HAL_UART_Transmit(&huart1, (uint8_t *)str, 6, 10); //串口1發(fā)送字符串,數(shù)組長度為5,超時10ms
HAL_UART_Transmit(&huart1, (uint8_t *)&"Vrn", 3, 10); //串口1發(fā)送字符串,數(shù)組長度為2,超時10ms
#else
sprintf(str,"smoke=%0.1f%%rn",adc_temp);
HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 10);//串口1發(fā)送字符串,數(shù)組長度為strlen(str),超時20ms
memset(str,0,strlen(str));
#endif
HAL_ADC_Stop(&hadc1); //停止ADC1
temp=DS18B20_Get_Temp();//獲取溫度值
sprintf(str,"temp=%0.1fCrn",temp);
HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 10); //串口1發(fā)送字符串,數(shù)組長度為6,超時10ms
memset(str,0,strlen(str));
if(setnum==0){//正常模式
// sprintf(data_str1,"temp=%0.1fC n",temp); //寫字符到data_str1
sprintf(data_str1,"T=%0.1fC G=%0.1f%% n",temp,adc_temp);
sprintf(data_str2,"TH:%d C GH:%d %% n",temp_H,smoke_H);//寫字符到data_str2
if(adc_temp>(float)smoke_H){
LED2=LED_ON;
HAL_UART_Transmit(&huart1, (uint8_t *)&"SMOKE!!rn", 10, 10); //串口1發(fā)送字符串,數(shù)組長度為10,超時10ms
}else{
LED2=LED_OFF;
}
if(temp>(float)temp_H){
LED1=LED_ON;
HAL_UART_Transmit(&huart1, (uint8_t *)&"TEMP!!rn", 10, 10); //串口1發(fā)送字符串,數(shù)組長度為10,超時10ms
}else{
LED1=LED_OFF;
}
if (LED1==LED_ON||LED2==LED_ON){
BEEP=1;
}else{
BEEP=0;
}
}else if(setnum==1){ //設置高溫閾值
BEEP=0;LED1=LED2=LED_OFF;
sprintf(data_str1,"T=%0.1fC G=%0.1f%% n",temp,adc_temp);
sprintf(data_str2,"TH:%dC< GH:%d %% n",temp_H,smoke_H);
}else if(setnum==2){ //設置低溫閾值
sprintf(data_str1,"T=%0.1fC G=%0.1f%% n",temp,adc_temp);
sprintf(data_str2,"L:%d C H:%d%%< n",temp_H,smoke_H);
}
LCD_ShowString(0,0,data_str1); //LCD1602顯示第一行
LCD_ShowString(1,0,data_str2); //LCD1602顯示第二行
memset(str,0,strlen(data_str1));
}
/* USER CODE END 3 */
}
程序流程圖
4. 設計報告
10000+字設計報告,內容包括硬件設計、軟件設計、結論等。
隨著現(xiàn)代城市化步伐的迅猛推進,人口密集度與建筑物復雜性的雙重增加,使得火災安全問題愈發(fā)成為城市公共安全領域中的重大挑戰(zhàn)。在這個背景下,火災的早期預警機制顯得尤為重要,它不僅關乎到人們的生命安全,還直接影響到社會經(jīng)濟活動的平穩(wěn)運行與財產(chǎn)安全的有效保障。然而,傳統(tǒng)的火災報警系統(tǒng)大多僅依賴煙霧或溫度的單一參數(shù)進行監(jiān)測,這種設計方式在實際應用中暴露出了諸多局限性,如誤報頻率較高、響應不夠迅速、對環(huán)境變化的適應性差等,這些問題在很大程度上限制了傳統(tǒng)報警系統(tǒng)在實際應用中的效能。
鑒于此,開發(fā)一種集成了煙霧濃度監(jiān)測、溫度監(jiān)控以及實時報警功能于一體的新型智能火災煙霧報警器,成為了提升火災預防能力的關鍵所在。這種新型報警器不僅能夠有效克服傳統(tǒng)系統(tǒng)的不足,還能通過多參數(shù)綜合判斷,實現(xiàn)對火災風險的更為精準、及時的預警。本項目正是基于這一迫切需求而提出,旨在利用STM32微控制器這一高性能、低功耗的嵌入式系統(tǒng)核心,結合MQ-2煙霧傳感器的高靈敏度與穩(wěn)定性、DS18B20溫度傳感器的精確測量能力、1602液晶顯示屏的直觀信息顯示、蜂鳴器與LED指示燈的即時報警反饋,以及按鍵模塊的用戶交互功能,共同構建一個功能全面、性能優(yōu)越的智能火災預警系統(tǒng)。
在項目實施過程中,我們將充分利用Proteus這一先進的電子設計自動化(EDA)軟件,進行系統(tǒng)的電路設計與仿真驗證。通過Proteus的虛擬實驗平臺,我們可以對電路布局、信號傳輸、元件性能等進行全面而深入的測試,從而確保系統(tǒng)設計的合理性、可行性與可靠性。最終,我們的目標是實現(xiàn)一個能夠高效、準確地監(jiān)測火災隱患,及時發(fā)出預警信號,并為用戶提供清晰直觀的報警信息的智能火災煙霧報警器,為現(xiàn)代城市的安全防護貢獻一份力量。通過本次設計,我們希望能夠提高對單片機的理解和應用能力。通過實踐和探索,我們希望能夠掌握相關的硬件和軟件設計方法,為今后的學習和工作打下堅實的基礎。同時,我們也希望能夠通過這次設計,培養(yǎng)我們的團隊協(xié)作能力和創(chuàng)新精神。
5. 資料清單
0、常見使用問題及解決方法–必讀?。。?!
1、程序代碼
2、Proteus仿真
3、功能要求
4、開題報告
5、設計報告
6、框圖
7、講解視頻
Altium Designer 安裝破解
KEIL+proteus 單片機仿真設計教程
KEIL安裝破解
Proteus元器件查找
Proteus安裝
Proteus簡易使用教程
單片機學習資料
相關數(shù)據(jù)手冊
答辯技巧
設計報告常用描述
鼠標雙擊打開查找嘉盛單片機51 STM32單片機課程畢業(yè)設計.url