以烟雾传感器和单片机为核心设计的烟雾报警系统需要实现报警、浓度显示、浓度报警限设置、温度显示及温度报警限设定等功能。系统硬件设计部分包括烟雾信号采集电路、单片机控制电路、按键设置报警阈值电路、浓度显示电路和声光报警电路。系统软件设计包括系统初始化、烟雾温度采集及处理、烟雾温度显示、按键处理、报警等子程序设计。最后软硬件联合调试完成功能要求。
电路原理图如下:
制作出来的实物图如下:
单片机源程序如下:
- #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) //当温度值为负数
- {
- //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算由?.5,还是在小数点后面。
-
- }
- else
- {
- tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
- //如果温度是正的那么,那么正数的原码就是补码它本身
- temp=tp*0.0625*100+0.5;
- //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
- //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
- //算加上0.5,还是在小数点后面。
- }
- 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);//爱
- 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);//爱
- 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);//爱
- 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);//爱
- 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);//爱
- 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);//爱
- 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;//报警
- Beep = 0;
- }else
- {
- Temp_LED = 1;//不报警
- }
-
- if((MQ2Val<Solu_min)||(MQ2Val>Solu_max))
- {
- Solu_LED = 0;//报警
- Beep = 0;
- }else
- {
- Solu_LED = 1;//不报警
- }
-
- //如果报警灯都没亮。
- 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)//不超过99℃
- Temp_max=Temp_max+10;
- }else if(layout_static == 3)
- {
- if(Temp_min<Temp_max-10)//不超过最大值减1,保持区间
- Temp_min=Temp_min+10;
- }else if(layout_static == 4)
- {
- if(Solu_max!=990)//不超过99℃
- Solu_max=Solu_max+10;
- }else if(layout_static == 5)
- {
- if(Solu_min<Solu_max-10)//不超过最大值减1,保持区间
- 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;
- }
- }
- }
复制代码
Keil代码和原理图2个文件下载:
01.7z
(140.65 KB, 下载次数: 21)
|