此次設計是火災報警系統,主要功能是實現當出現火災的時候,通過煙霧報警器和溫度報警器進行報警,并帶動電機運轉進行排煙或者灑水。本單片機系統采用AT89C51單片機控制,整個硬件系統由A/D轉換、LCD顯示、按鍵鍵盤、溫度傳感器、煙霧傳感器、LED燈、電機、繼電器等模塊組成。系統中設置了4個按鍵,其中1個是復位鍵,其余的3個鍵,其中一個是設置鍵,另外兩個是加減鍵,用來設置溫度、煙霧閾值,用程序來控制實現不同的功能: (1)LCD液晶顯示屏實時顯示當前的煙霧值和溫度值; (2)溫度和煙霧的報警值可以通過按鍵設定 (3)當前溫度值超過上限時,藍燈亮,蜂鳴器響; (4)當前煙霧值超過上線時,黃燈亮,蜂鳴器響,電機運轉; (5)四個按鍵功能:設置鍵、加鍵、減鍵、復位按鍵; (6)通過繼電器驅動模塊,當煙霧或可燃氣體濃度超過報警值時啟動繼電器,繼電器帶動風扇轉動模擬排煙。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- void main (void)
- {
- u8 key;
- // uint ppm;
- uchar adc = 0;
- float voltage = 0;
- wendu=check_wendu(); //初始化時調用溫度讀取函數 防止開機85°C
- Init1602(); //調用初始化顯示函數
- LCD_Write_String(0,0,"SET T:00 Y:0.00%"); //開機界面
- LCD_Write_String(1,0,"NOW T:00 Y:0.00%");
- delay_ms(1000);
- wendu=check_wendu(); //初始化時調用溫度讀取函數 防止開機85°C
-
- while (1) //主循環
- {
- key=Key_Scan(); //按鍵掃描
- adc = Adc0832(0); //讀取adc值
- voltage = adc * 5/255; //將adc值換算成電壓
- yanwu=(39*adc+100)/100; //0-255轉化為1-100的線性關系顯示,由于顯示問題,ppm100-10000除100,顯示1-100
- wendu=check_wendu(); //讀取溫度值
-
-
- //========================================================================
- //循環的主程序,進行數據讀取,switch循環選擇對應的模式進行按鍵設置
- //LED、蜂鳴器、風扇均為低電平有效
- //========================================================================
-
- if(key==KEY_SET)
- {
- Mode++;
- }
- switch(Mode) //判斷模式的值
- {
- case 0: //監控模式
- {
- Display_1602(yushe_wendu,yushe_yanwu,wendu,yanwu); //顯示預設溫度,預設煙霧,溫度值,煙霧值
- if(yanwu>=yushe_yanwu) //煙霧值大于等于預設值時
- {
- if(flag)
- {
- Led_Blue=1; //煙霧指示燈滅
- Fan=1; //風扇停止
- Buzzer=1; //蜂鳴器不響
- }
- else
- {
- Buzzer=0; //蜂鳴器報警
- delay_ms(100);
- Buzzer=1;
- Led_Blue=0; //煙霧指示燈亮
- Fan=0; //風扇運行
- }
- }
- else //煙霧值小于預設值時
- {
- Led_Blue=1; //關掉報警燈
- Fan=1;
- Buzzer=1;
- }
- if(wendu>=(yushe_wendu*10)) //溫度大于等于預設溫度值時(為什么是大于預設值*10:因為我們要顯示的溫度是有小數點后一位,是一個3位數,25.9°C時實際讀的數是259,所以判斷預設值時將預設值*10)
- {
- if(flag)
- {
- Led_Yellow=1; //煙霧指示燈
- Buzzer=1;
- }
- else
- {
- Buzzer=0; //打開蜂鳴器報警
- delay_ms(100);
- Buzzer=1;
- Led_Yellow=0; //打開溫度報警燈
- }
- }
- else //溫度值小于預設值時
- {
- Led_Yellow=1; //關閉報警燈
- Buzzer=1; //關閉蜂鳴器
- }
- if((yanwu<yushe_yanwu)&&(wendu<(yushe_wendu*10))) //當煙霧小于預設值并且溫度也小于預設值時
- {
- Buzzer=1; //停止報警
- }
- break;
- }
- case 1: //預設溫度模式
- {
- SelectPosition(0,5) ; //指定位置
- write_com(0x0d); //陰影閃爍
- if(key==KEY_ADD) //加鍵按下
- {
- yushe_wendu++; //預設溫度值(閥值)加1
- if(yushe_wendu>=99) //當閥值加到大于等于99時
- yushe_wendu=99; //閥值固定為99
- LCD_Write_Char(0,6,yushe_wendu,2) ;//顯示預設溫度
- }
- if(key==KEY_MINUS) //減鍵按下
- {
- if(yushe_wendu<=1) //當溫度上限值減小到1時
- yushe_wendu=1; //固定為1
- yushe_wendu--; //預設溫度值減一,最小為0
- LCD_Write_Char(0,6,yushe_wendu,2) ;//顯示預設溫度
- }
- break; //執行后跳出switch
- }
- case 2: //預設煙霧模式
- {
- SelectPosition(0,10) ; //指定位置
- write_com(0x0d); //打開顯示 無光標 光標閃爍
- if(key==KEY_ADD) //加鍵按下
- {
- if(yushe_yanwu>=100) //當閥值加到大于等于99時
- yushe_yanwu=99; //閥值固定為98
- yushe_yanwu++; //預設煙霧值(閥值)加1,最大為99
- LCD_Write_Char(0,13,yushe_yanwu,2) ;//顯示預設煙霧
- }
- if(key==KEY_MINUS) //減鍵按下
- {
- if(yushe_yanwu<=1) //當煙霧上限值減小到1時
- yushe_yanwu=1; //固定為1
- yushe_yanwu--; //預設溫度值減一,最小為0
- LCD_Write_Char(0,13,yushe_yanwu,2) ;//顯示預設煙霧
- }
- break;
- }
- default :
- {
- write_com(0x38); //屏幕初始化
- write_com(0x0c); //打開顯示 無光標 無光標閃爍
- Mode=0; //恢復正常模式
- break;
- }
- }
- }
- }
復制代碼
Keil代碼與Proteus仿真下載:
火災報警仿真代碼.7z
(99.27 KB, 下載次數: 218)
2022-1-18 16:17 上傳
點擊文件名下載附件
包含proteus、keil程序
|