找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1822|回复: 0
收起左侧

基于51单片机的火灾报警系统程序与电路原理图

[复制链接]
ID:900636 发表于 2022-5-8 22:22 | 显示全部楼层 |阅读模式
以烟雾传感器和单片机为核心设计的烟雾报警系统需要实现报警、浓度显示、浓度报警限设置、温度显示及温度报警限设定等功能。系统硬件设计部分包括烟雾信号采集电路、单片机控制电路、按键设置报警阈值电路、浓度显示电路和声光报警电路。系统软件设计包括系统初始化、烟雾温度采集及处理、烟雾温度显示、按键处理、报警等子程序设计。最后软硬件联合调试完成功能要求。

电路原理图如下:
51hei.png

制作出来的实物图如下:
1.jpg 2.JPG 3.JPG

单片机源程序如下:

  1. #include <STC12C5A60S2.H>
  2. #include "oled.h"
  3. #include "adc.h"
  4. #include "temp.h"
  5. #include "key.h"

  6. #define  u8 unsigned char
  7. #define  u32 unsigned int


  8. sbit Temp_LED = P3^5;
  9. sbit Solu_LED = P3^6;
  10. sbit Beep = P3^2;

  11. u8 layout_static = 1;

  12. u32 Temp_max = 200;
  13. u32 Temp_min = 150;

  14. u32 Solu_max = 60;
  15. u32 Solu_min = 40;

  16. int system_temp;

  17. void DisplayTemp(u32 Temp)
  18. {
  19.         OLED_ShowNum(48,2,Temp/10,2,16);
  20.         OLED_ShowNum(72,2,Temp%10,1,16);
  21. }

  22. void DisplayMQ2(u32 MQ2Val)
  23. {
  24.         OLED_ShowNum(48,4,MQ2Val/10,2,16);
  25.         OLED_ShowNum(72,4,MQ2Val%10,1,16);
  26. }

  27. void LcdDisplay(int temp)          //lcd显示
  28. {

  29.         float tp;  
  30.         if(temp< 0)                                    //当温度值为负数
  31.           {
  32.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  33.                 temp=temp-1;
  34.                 temp=~temp;
  35.                 tp=temp;
  36.                 temp=tp*0.0625*100+0.5;       
  37.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  38.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  39.                 //算由?.5,还是在小数点后面。

  40.           }
  41.         else
  42.           {                       
  43.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  44.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  45.                 temp=tp*0.0625*100+0.5;       
  46.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  47.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  48.                 //算加上0.5,还是在小数点后面。
  49.         }
  50.         system_temp = temp/10;

  51. }




  52. void OLED_MyInit()
  53. {
  54.         OLED_Init();                        //初始化OLED
  55.         OLED_Clear();
  56.         OLED_ShowCHinese(0,0,0);//超
  57.         OLED_ShowCHinese(18,0,1);//可
  58.         OLED_ShowCHinese(36,0,2);//爱
  59.         OLED_ShowCHinese(54,0,3);//的
  60.         OLED_ShowCHinese(72,0,4);//沈
  61.         OLED_ShowCHinese(90,0,5);//萌
  62.         OLED_ShowCHinese(108,0,6);//萌
  63.        
  64.         OLED_ShowString(0,2,"Temp:",16);
  65.         OLED_ShowNum(48,2,00,2,16);//21
  66.         OLED_ShowString(64,2,".",16);
  67.         OLED_ShowNum(72,2,0,1,16);//21


  68.         OLED_ShowString(0,4,"Solu:",16);
  69.         OLED_ShowNum(48,4,0,2,16);//21
  70.         OLED_ShowString(64,4,".",16);
  71.         OLED_ShowNum(72,4,0,1,16);//21       
  72.         OLED_ShowString(84,4,"%",16);
  73.        
  74.         OLED_ShowString(0,6,"KEY1:System Set",16);       
  75. }
  76. void layout_switch(u8 layout_static,u8 clear_static)
  77. {
  78.         if(clear_static==1)OLED_Clear();
  79.         switch(layout_static)
  80.         {
  81.                 case 1:               
  82.                         OLED_ShowCHinese(0,0,0);//超
  83.                         OLED_ShowCHinese(18,0,1);//可
  84.                         OLED_ShowCHinese(36,0,2);//爱
  85.                         OLED_ShowCHinese(54,0,3);//的
  86.                         OLED_ShowCHinese(72,0,4);//沈
  87.                         OLED_ShowCHinese(90,0,5);//萌
  88.                         OLED_ShowCHinese(108,0,6);//萌
  89.                        
  90.                         OLED_ShowString(0,2,"Temp:",16);
  91.                         OLED_ShowNum(48,2,21,2,16);//21
  92.                         OLED_ShowString(64,2,".",16);
  93.                         OLED_ShowNum(72,2,0,1,16);//21


  94.                         OLED_ShowString(0,4,"Solu:",16);
  95.                         OLED_ShowNum(48,4,0,2,16);//21
  96.                         OLED_ShowString(64,4,".",16);
  97.                         OLED_ShowNum(72,4,0,1,16);//21       
  98.                         OLED_ShowString(84,4,"%",16);
  99.                        
  100.                         OLED_ShowString(0,6,"KEY1:System Set",16);       
  101.                         break;
  102.                 case 2:
  103.                         OLED_ShowCHinese(0,0,0);//超
  104.                         OLED_ShowCHinese(18,0,1);//可
  105.                         OLED_ShowCHinese(36,0,2);//爱
  106.                         OLED_ShowCHinese(54,0,3);//的
  107.                         OLED_ShowCHinese(72,0,4);//沈
  108.                         OLED_ShowCHinese(90,0,5);//萌
  109.                         OLED_ShowCHinese(108,0,6);//萌
  110.                        
  111.                         OLED_ShowString(0,4,"Temp max set",16);

  112.                         OLED_ShowString(0,6," Max:",16);
  113.                         OLED_ShowNum(48,6,Temp_max/10,2,16);//21
  114.                         OLED_ShowString(64,6,".",16);
  115.                         OLED_ShowNum(72,6,Temp_max%10,1,16);//21
  116.                         break;
  117.                 case 3:
  118.                         OLED_ShowCHinese(0,0,0);//超
  119.                         OLED_ShowCHinese(18,0,1);//可
  120.                         OLED_ShowCHinese(36,0,2);//爱
  121.                         OLED_ShowCHinese(54,0,3);//的
  122.                         OLED_ShowCHinese(72,0,4);//沈
  123.                         OLED_ShowCHinese(90,0,5);//萌
  124.                         OLED_ShowCHinese(108,0,6);//萌
  125.                        
  126.                         OLED_ShowString(0,4,"Temp min set",16);

  127.                         OLED_ShowString(0,6," Min:",16);
  128.                         OLED_ShowNum(48,6,Temp_min/10,2,16);//21
  129.                         OLED_ShowString(64,6,".",16);
  130.                         OLED_ShowNum(72,6,Temp_min%10,1,16);//21       
  131.                         break;
  132.                 case 4:
  133.                         OLED_ShowCHinese(0,0,0);//超
  134.                         OLED_ShowCHinese(18,0,1);//可
  135.                         OLED_ShowCHinese(36,0,2);//爱
  136.                         OLED_ShowCHinese(54,0,3);//的
  137.                         OLED_ShowCHinese(72,0,4);//沈
  138.                         OLED_ShowCHinese(90,0,5);//萌
  139.                         OLED_ShowCHinese(108,0,6);//萌
  140.                        
  141.                         OLED_ShowString(0,4,"Solu max set",16);

  142.                         OLED_ShowString(0,6," Max:",16);
  143.                         OLED_ShowNum(48,6,Solu_max/10,2,16);//21
  144.                         OLED_ShowString(64,6,".",16);
  145.                         OLED_ShowNum(72,6,Solu_max%10,1,16);//21       
  146.                         OLED_ShowString(84,6,"%",16);
  147.                         break;
  148.                 case 5:
  149.                         OLED_ShowCHinese(0,0,0);//超
  150.                         OLED_ShowCHinese(18,0,1);//可
  151.                         OLED_ShowCHinese(36,0,2);//爱
  152.                         OLED_ShowCHinese(54,0,3);//的
  153.                         OLED_ShowCHinese(72,0,4);//沈
  154.                         OLED_ShowCHinese(90,0,5);//萌
  155.                         OLED_ShowCHinese(108,0,6);//萌
  156.                        
  157.                         OLED_ShowString(0,4,"Solu min set",16);

  158.                         OLED_ShowString(0,6," Min:",16);
  159.                         OLED_ShowNum(48,6,Solu_min/10,2,16);//21
  160.                         OLED_ShowString(64,6,".",16);
  161.                         OLED_ShowNum(72,6,Solu_min%10,1,16);//21
  162.                         OLED_ShowString(84,6,"%",16);
  163.                         break;
  164.                 default:
  165.                         break;
  166.         }
  167. }

  168. int main(void)
  169. {       

  170.         u32 MQ2Val;
  171.        
  172.         InitADC();                                //初始化ADC
  173.          
  174.         OLED_MyInit();
  175.        
  176.         while(1)
  177.         {               
  178.                 MQ2Val = GetADCResult(0)*100;
  179.                 MQ2Val = MQ2Val/255;
  180.                 MQ2Val = MQ2Val * 10;
  181.                 if(MQ2Val==1000)MQ2Val=990;
  182.                
  183.                 LcdDisplay(Ds18b20ReadTemp());
  184.                
  185.                 if((system_temp<Temp_min)||(system_temp>Temp_max))
  186.                 {
  187.                         Temp_LED = 0;//报警
  188.                         Beep = 0;
  189.                 }else
  190.                 {
  191.                         Temp_LED = 1;//不报警
  192.                 }
  193.                
  194.                 if((MQ2Val<Solu_min)||(MQ2Val>Solu_max))
  195.                 {
  196.                         Solu_LED = 0;//报警
  197.                         Beep = 0;
  198.                 }else
  199.                 {
  200.                         Solu_LED = 1;//不报警
  201.                 }
  202.                
  203.                 //如果报警灯都没亮。
  204.                 if((Solu_LED == 1)&&(Temp_LED == 1))
  205.                 {
  206.                         Beep = 1;
  207.                 }
  208.                
  209.                
  210.                 if(layout_static == 1)
  211.                 {
  212.                         DisplayMQ2(MQ2Val);
  213.                         DisplayTemp(system_temp);
  214.                 }
  215.                 switch(KeyScan())
  216.                 {
  217.                         case 1://Set
  218.                                 layout_static++;//视图切换
  219.                                 if(layout_static == 6)
  220.                                 {
  221.                                         layout_static = 1;
  222.                                 }
  223.                                 layout_switch(layout_static,1);
  224.                                 break;
  225.                        
  226.                         case 2://up
  227.                                 if(layout_static == 2)
  228.                                 {
  229.                                         if(Temp_max!=990)//不超过99℃
  230.                                         Temp_max=Temp_max+10;
  231.                                 }else if(layout_static == 3)
  232.                                 {
  233.                                         if(Temp_min<Temp_max-10)//不超过最大值减1,保持区间
  234.                                         Temp_min=Temp_min+10;                                       
  235.                                 }else if(layout_static == 4)
  236.                                 {
  237.                                         if(Solu_max!=990)//不超过99℃
  238.                                         Solu_max=Solu_max+10;                                       
  239.                                 }else if(layout_static == 5)
  240.                                 {
  241.                                         if(Solu_min<Solu_max-10)//不超过最大值减1,保持区间
  242.                                         Solu_min=Solu_min+10;                                                                       
  243.                                 }
  244.                                 layout_switch(layout_static,0);
  245.                                 break;
  246.                        
  247.                         case 3://down
  248.                                 if(layout_static == 2)
  249.                                 {
  250.                                         if(Temp_max>Temp_min+10)
  251.                                         Temp_max=Temp_max-10;
  252.                                 }else if(layout_static == 3)
  253.                                 {
  254.                                         if(Temp_min!=10)
  255.                                         Temp_min=Temp_min-10;
  256.                                 }else if(layout_static == 4)
  257.                                 {
  258.                                         if(Solu_max>Solu_min+10)
  259.                                         Solu_max=Solu_max-10;                                       
  260.                                 }else if(layout_static == 5)
  261.                                 {
  262.                                         if(Solu_min!=10)
  263.                                         Solu_min=Solu_min-10;                                       
  264.                                 }
  265.                                 layout_switch(layout_static,0);
  266.                                 break;
  267.                        
  268.                         default:
  269.                                 break;
  270.                 }

  271.         }          

  272. }
复制代码
51hei.png

Keil代码和原理图2个文件下载:
01.7z (140.65 KB, 下载次数: 20)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表