以煙霧傳感器和單片機(jī)為核心設(shè)計(jì)的煙霧報(bào)警系統(tǒng)需要實(shí)現(xiàn)報(bào)警、濃度顯示、濃度報(bào)警限設(shè)置、溫度顯示及溫度報(bào)警限設(shè)定等功能。系統(tǒng)硬件設(shè)計(jì)部分包括煙霧信號(hào)采集電路、單片機(jī)控制電路、按鍵設(shè)置報(bào)警閾值電路、濃度顯示電路和聲光報(bào)警電路。系統(tǒng)軟件設(shè)計(jì)包括系統(tǒng)初始化、煙霧溫度采集及處理、煙霧溫度顯示、按鍵處理、報(bào)警等子程序設(shè)計(jì)。最后軟硬件聯(lián)合調(diào)試完成功能要求。
電路原理圖如下:
51hei.png (43.84 KB, 下載次數(shù): 39)
下載附件
2022-5-8 23:52 上傳
制作出來(lái)的實(shí)物圖如下:
1.jpg (181.5 KB, 下載次數(shù): 46)
下載附件
2022-5-8 23:54 上傳
2.JPG (1.75 MB, 下載次數(shù): 38)
下載附件
2022-5-8 23:54 上傳
3.JPG (2.15 MB, 下載次數(shù): 45)
下載附件
2022-5-8 23:54 上傳
單片機(jī)源程序如下:
- #include <STC12C5A60S2.H>
- #include "oled.h"
- #include "adc.h"
- #include "temp.h"
- #include "key.h"
- #define u8 unsigned char
- #define u32 unsigned int
- sbit Temp_LED = P3^5;
- sbit Solu_LED = P3^6;
- sbit Beep = P3^2;
- u8 layout_static = 1;
- u32 Temp_max = 200;
- u32 Temp_min = 150;
- u32 Solu_max = 60;
- u32 Solu_min = 40;
- int system_temp;
- void DisplayTemp(u32 Temp)
- {
- OLED_ShowNum(48,2,Temp/10,2,16);
- OLED_ShowNum(72,2,Temp%10,1,16);
- }
- void DisplayMQ2(u32 MQ2Val)
- {
- OLED_ShowNum(48,4,MQ2Val/10,2,16);
- OLED_ShowNum(72,4,MQ2Val%10,1,16);
- }
- void LcdDisplay(int temp) //lcd顯示
- {
- float tp;
- if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
- {
- //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算由?.5,還是在小數(shù)點(diǎn)后面。
-
- }
- else
- {
- tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- }
- system_temp = temp/10;
- }
- void OLED_MyInit()
- {
- OLED_Init(); //初始化OLED
- OLED_Clear();
- OLED_ShowCHinese(0,0,0);//超
- OLED_ShowCHinese(18,0,1);//可
- OLED_ShowCHinese(36,0,2);//愛(ài)
- OLED_ShowCHinese(54,0,3);//的
- OLED_ShowCHinese(72,0,4);//沈
- OLED_ShowCHinese(90,0,5);//萌
- OLED_ShowCHinese(108,0,6);//萌
-
- OLED_ShowString(0,2,"Temp:",16);
- OLED_ShowNum(48,2,00,2,16);//21
- OLED_ShowString(64,2,".",16);
- OLED_ShowNum(72,2,0,1,16);//21
- OLED_ShowString(0,4,"Solu:",16);
- OLED_ShowNum(48,4,0,2,16);//21
- OLED_ShowString(64,4,".",16);
- OLED_ShowNum(72,4,0,1,16);//21
- OLED_ShowString(84,4,"%",16);
-
- OLED_ShowString(0,6,"KEY1:System Set",16);
- }
- void layout_switch(u8 layout_static,u8 clear_static)
- {
- if(clear_static==1)OLED_Clear();
- switch(layout_static)
- {
- case 1:
- OLED_ShowCHinese(0,0,0);//超
- OLED_ShowCHinese(18,0,1);//可
- OLED_ShowCHinese(36,0,2);//愛(ài)
- OLED_ShowCHinese(54,0,3);//的
- OLED_ShowCHinese(72,0,4);//沈
- OLED_ShowCHinese(90,0,5);//萌
- OLED_ShowCHinese(108,0,6);//萌
-
- OLED_ShowString(0,2,"Temp:",16);
- OLED_ShowNum(48,2,21,2,16);//21
- OLED_ShowString(64,2,".",16);
- OLED_ShowNum(72,2,0,1,16);//21
- OLED_ShowString(0,4,"Solu:",16);
- OLED_ShowNum(48,4,0,2,16);//21
- OLED_ShowString(64,4,".",16);
- OLED_ShowNum(72,4,0,1,16);//21
- OLED_ShowString(84,4,"%",16);
-
- OLED_ShowString(0,6,"KEY1:System Set",16);
- break;
- case 2:
- OLED_ShowCHinese(0,0,0);//超
- OLED_ShowCHinese(18,0,1);//可
- OLED_ShowCHinese(36,0,2);//愛(ài)
- OLED_ShowCHinese(54,0,3);//的
- OLED_ShowCHinese(72,0,4);//沈
- OLED_ShowCHinese(90,0,5);//萌
- OLED_ShowCHinese(108,0,6);//萌
-
- OLED_ShowString(0,4,"Temp max set",16);
- OLED_ShowString(0,6," Max:",16);
- OLED_ShowNum(48,6,Temp_max/10,2,16);//21
- OLED_ShowString(64,6,".",16);
- OLED_ShowNum(72,6,Temp_max%10,1,16);//21
- break;
- case 3:
- OLED_ShowCHinese(0,0,0);//超
- OLED_ShowCHinese(18,0,1);//可
- OLED_ShowCHinese(36,0,2);//愛(ài)
- OLED_ShowCHinese(54,0,3);//的
- OLED_ShowCHinese(72,0,4);//沈
- OLED_ShowCHinese(90,0,5);//萌
- OLED_ShowCHinese(108,0,6);//萌
-
- OLED_ShowString(0,4,"Temp min set",16);
- OLED_ShowString(0,6," Min:",16);
- OLED_ShowNum(48,6,Temp_min/10,2,16);//21
- OLED_ShowString(64,6,".",16);
- OLED_ShowNum(72,6,Temp_min%10,1,16);//21
- break;
- case 4:
- OLED_ShowCHinese(0,0,0);//超
- OLED_ShowCHinese(18,0,1);//可
- OLED_ShowCHinese(36,0,2);//愛(ài)
- OLED_ShowCHinese(54,0,3);//的
- OLED_ShowCHinese(72,0,4);//沈
- OLED_ShowCHinese(90,0,5);//萌
- OLED_ShowCHinese(108,0,6);//萌
-
- OLED_ShowString(0,4,"Solu max set",16);
- OLED_ShowString(0,6," Max:",16);
- OLED_ShowNum(48,6,Solu_max/10,2,16);//21
- OLED_ShowString(64,6,".",16);
- OLED_ShowNum(72,6,Solu_max%10,1,16);//21
- OLED_ShowString(84,6,"%",16);
- break;
- case 5:
- OLED_ShowCHinese(0,0,0);//超
- OLED_ShowCHinese(18,0,1);//可
- OLED_ShowCHinese(36,0,2);//愛(ài)
- OLED_ShowCHinese(54,0,3);//的
- OLED_ShowCHinese(72,0,4);//沈
- OLED_ShowCHinese(90,0,5);//萌
- OLED_ShowCHinese(108,0,6);//萌
-
- OLED_ShowString(0,4,"Solu min set",16);
- OLED_ShowString(0,6," Min:",16);
- OLED_ShowNum(48,6,Solu_min/10,2,16);//21
- OLED_ShowString(64,6,".",16);
- OLED_ShowNum(72,6,Solu_min%10,1,16);//21
- OLED_ShowString(84,6,"%",16);
- break;
- default:
- break;
- }
- }
- int main(void)
- {
- u32 MQ2Val;
-
- InitADC(); //初始化ADC
-
- OLED_MyInit();
-
- while(1)
- {
- MQ2Val = GetADCResult(0)*100;
- MQ2Val = MQ2Val/255;
- MQ2Val = MQ2Val * 10;
- if(MQ2Val==1000)MQ2Val=990;
-
- LcdDisplay(Ds18b20ReadTemp());
-
- if((system_temp<Temp_min)||(system_temp>Temp_max))
- {
- Temp_LED = 0;//報(bào)警
- Beep = 0;
- }else
- {
- Temp_LED = 1;//不報(bào)警
- }
-
- if((MQ2Val<Solu_min)||(MQ2Val>Solu_max))
- {
- Solu_LED = 0;//報(bào)警
- Beep = 0;
- }else
- {
- Solu_LED = 1;//不報(bào)警
- }
-
- //如果報(bào)警燈都沒(méi)亮。
- if((Solu_LED == 1)&&(Temp_LED == 1))
- {
- Beep = 1;
- }
-
-
- if(layout_static == 1)
- {
- DisplayMQ2(MQ2Val);
- DisplayTemp(system_temp);
- }
- switch(KeyScan())
- {
- case 1://Set
- layout_static++;//視圖切換
- if(layout_static == 6)
- {
- layout_static = 1;
- }
- layout_switch(layout_static,1);
- break;
-
- case 2://up
- if(layout_static == 2)
- {
- if(Temp_max!=990)//不超過(guò)99℃
- Temp_max=Temp_max+10;
- }else if(layout_static == 3)
- {
- if(Temp_min<Temp_max-10)//不超過(guò)最大值減1,保持區(qū)間
- Temp_min=Temp_min+10;
- }else if(layout_static == 4)
- {
- if(Solu_max!=990)//不超過(guò)99℃
- Solu_max=Solu_max+10;
- }else if(layout_static == 5)
- {
- if(Solu_min<Solu_max-10)//不超過(guò)最大值減1,保持區(qū)間
- Solu_min=Solu_min+10;
- }
- layout_switch(layout_static,0);
- break;
-
- case 3://down
- if(layout_static == 2)
- {
- if(Temp_max>Temp_min+10)
- Temp_max=Temp_max-10;
- }else if(layout_static == 3)
- {
- if(Temp_min!=10)
- Temp_min=Temp_min-10;
- }else if(layout_static == 4)
- {
- if(Solu_max>Solu_min+10)
- Solu_max=Solu_max-10;
- }else if(layout_static == 5)
- {
- if(Solu_min!=10)
- Solu_min=Solu_min-10;
- }
- layout_switch(layout_static,0);
- break;
-
- default:
- break;
- }
- }
- }
復(fù)制代碼
51hei.png (2.68 KB, 下載次數(shù): 40)
下載附件
2022-5-8 23:56 上傳
Keil代碼和原理圖2個(gè)文件下載:
01.7z
(140.65 KB, 下載次數(shù): 21)
2022-5-8 23:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|