找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12491|回复: 12
收起左侧

MQ-2火灾烟雾报警系统单片机程序加电路原理图

  [复制链接]
ID:302200 发表于 2018-4-4 21:38 | 显示全部楼层 |阅读模式
需要的请下载不谢
MQ-2电路原理图如下:
0.png 0.jpg 0.png

MQ-2烟雾检测与报警单片机源程序如下:
  1. #include <AT89X52.h>
  2. #include <intrins.h>
  3. #include "DS18B20.h"   
  4. #define uint unsigned int
  5. #define uchar unsigned char   //宏定义
  6. #define SET P1_0    //定义调整键
  7. #define DEC P1_1    //定义减少键
  8. #define ADD P1_2    //定义增加键
  9. #define BEEP P3_4    //定义蜂鸣器
  10. #define hujiao P1_3
  11. sbit ADCS = P3^7;
  12. sbit ADCLK = P3^5;
  13. sbit ADDI = P3^6;
  14. sbit ADDO = P3^6;
  15. bit shanshuo_st;    //闪烁间隔标志
  16. bit beep_st;     //蜂鸣器间隔标志
  17. bit flag=0;//紧急呼叫标志
  18. sbit DIAN = P2^5;        //小数点
  19. uint abc;
  20. uchar x=4;      //计数器
  21. signed char m;     //温度值全局变量
  22. uchar n;      //温度值全局变量
  23. uchar set_st=0;     //状态标志
  24. signed char shangxian=30; //上限报警温度,默认值为38
  25. signed char xiaxian=5;   //下限报警温度,默认值为38
  26. uchar nongdu=4;
  27. uchar code LEDData[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};
  28. /*****延时子程序*****/
  29. void Delay(uint num)
  30. {
  31. while( --num );
  32. }
  33. /*****初始化定时器0*****/
  34. void InitTimer(void)
  35. {
  36. TMOD=0x1;
  37. TH0=0x4c;
  38. TL0=0x00;     //50ms(晶振11.0592M)
  39. }
  40. /*****定时器0中断服务程序*****/
  41. void timer0(void) interrupt 1
  42. {
  43. TH0=0x4c;
  44. TL0=0x00;
  45. x++;
  46. }
  47. /*****读取温度*****/
  48. void check_wendu(void)
  49. {
  50. uint a,b,c;
  51. c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差
  52. a=c/100;     //计算得到十位数字
  53. b=c/10-a*10;    //计算得到个位数字
  54. m=c/10;      //计算得到整数位
  55. n=c-a*100-b*10;    //计算得到小数位
  56. if(m<0){m=0;n=0;}   //设置温度显示上限
  57. if(m>99){m=99;n=9;}   //设置温度显示上限   
  58. }
  59. /*****显示开机初始化等待画面*****/
  60. Disp_init()   
  61. {
  62. P2 = 0xf7;      //显示-
  63. P0 = 0xbf;
  64. Delay(200);
  65. P0 = 0xef;
  66. Delay(200);   
  67. P0 = 0xfb;
  68. Delay(200);
  69. P0 = 0xfe;
  70. Delay(200);
  71. P0 = 0xff;         //关闭显示
  72. }
  73. /*****显示温度子程序*****/
  74. Disp_Temperature()     //显示温度
  75. {
  76. P2 =LEDData[m%10];      //显示C
  77. P0 = 0xbf;
  78. Delay(300);
  79. P2 =LEDData[m/10];    //显示个位
  80. P0 = 0xef;
  81. Delay(300);
  82. P2 =0xf7;    //显示十位
  83. P0 = 0xfb;
  84. Delay(300);
  85. P2 =LEDData[abc];    //显示百位
  86. P0 = 0xfe;
  87. Delay(300);
  88. P0 = 0xff;         //关闭显示
  89. }
  90. /*****显示报警温度子程序*****/
  91. Disp_alarm(uchar baojing)
  92. {
  93. P2 =0x3c;      //显示C
  94. P0 = 0xbf;
  95. Delay(200);
  96. P2 =LEDData[baojing%10]; //显示十位
  97. P0 = 0xef;
  98. Delay(200);
  99. P2 =LEDData[baojing/10]; //显示百位
  100. P0 = 0xfb;
  101. Delay(200);
  102. if(set_st==1)P2 =0x61;
  103. else if(set_st==2)P2 =0x3d; //上限H、下限L标示
  104. P0 = 0xfe;
  105. Delay(200);
  106. P0 = 0xff;         //关闭显示
  107. }
  108. Disp_nongdu(uchar baojing)//烟雾浓度报警显示
  109. {
  110. P2 =0xff;      
  111. P0 = 0xbf;
  112. Delay(200);
  113. P2 =0xff;
  114. P0 = 0xef;
  115. Delay(200);
  116. P2 =0xff;
  117. P0 = 0xfb;
  118. Delay(200);
  119. P2 =LEDData[baojing];//显示浓度
  120. P0 = 0xfe;
  121. Delay(200);
  122. P0 = 0xff;         //关闭显示
  123. }
  124. /*****报警子程序*****/
  125. void Alarm()
  126. {
  127. if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=1;
  128. else if(abc>=nongdu&&beep_st==1) BEEP=1;
  129. else BEEP=0;
  130. if(x>=10){beep_st=~beep_st;x=0;}
  131. }
  132. void Alarm1()
  133. {
  134. if(x>=10){beep_st=~beep_st;x=0;}
  135. if(beep_st==1)BEEP=1;
  136. else BEEP=0;
  137. }
  138. uchar ADC0832(bit mode,bit channel)     //AD转换,返回结果
  139. {
  140.         uchar i,dat,ndat;
  141.        
  142.         ADCS = 0;//拉低CS端
  143.         _nop_();
  144.         _nop_();
  145.        
  146.         ADDI = 1;        //第1个下降沿为高电平
  147.         ADCLK = 1;//拉高CLK端
  148.         _nop_();
  149.         _nop_();
  150.         ADCLK = 0;//拉低CLK端,形成下降沿1
  151.         _nop_();
  152.         _nop_();
  153.        
  154.         ADDI = mode;        //低电平为差分模式,高电平为单通道模式。       
  155.         ADCLK = 1;//拉高CLK端
  156.         _nop_();
  157.         _nop_();
  158.         ADCLK = 0;//拉低CLK端,形成下降沿2
  159.         _nop_();
  160.         _nop_();
  161.        
  162.         ADDI = channel;        //低电平为CH0,高电平为CH1       
  163.         ADCLK = 1;//拉高CLK端
  164.         _nop_();
  165.         _nop_();
  166.         ADCLK = 0;//拉低CLK端,形成下降沿3
  167.        
  168.         ADDI = 1;//控制命令结束(经试验必需)
  169.         dat = 0;
  170.         //下面开始读取转换后的数据,从最高位开始依次输出(D7~D0)
  171.         for(i = 0;i < 8;i++)
  172.         {
  173.                 dat <<= 1;
  174.                 ADCLK=1;//拉高时钟端
  175.                 _nop_();
  176.                 _nop_();
  177.                 ADCLK=0;//拉低时钟端形成一次时钟脉冲
  178.                 _nop_();
  179.                 _nop_();
  180.                 dat |= ADDO;
  181.         }
  182.         ndat = 0;            //记录D0
  183.         if(ADDO == 1)
  184.         ndat |= 0x80;
  185.         //下面开始继续读取反序的数据(从D1到D7)
  186.         for(i = 0;i < 7;i++)
  187.         {
  188.                 ndat >>= 1;
  189.                 ADCLK = 1;//拉高时钟端
  190.                 _nop_();
  191.                 _nop_();
  192.                 ADCLK=0;//拉低时钟端形成一次时钟脉冲
  193.                 _nop_();
  194.                 _nop_();
  195.                 if(ADDO==1)
  196.                 ndat |= 0x80;
  197.         }          
  198.         ADCS=1;//拉高CS端,结束转换
  199.         ADCLK=0;//拉低CLK端
  200.         ADDI=1;//拉高数据端,回到初始状态
  201.         if(dat==ndat)
  202.         return(dat);
  203.         else
  204.         return 0;   
  205. }
  206. /*****主函数*****/
  207. void main(void)
  208. {
  209.     uint z;
  210. InitTimer();    //初始化定时器
  211. EA=1;      //全局中断开关
  212. TR0=1;
  213. ET0=1;      //开启定时器0
  214. BEEP=0;
  215. check_wendu();
  216. check_wendu();
  217. for(z=0;z<300;z++)
  218. {
  219. Disp_init();        
  220. }
  221. while(1)
  222. {
  223. if(hujiao==0)
  224. {
  225.    Delay(2000);
  226.    do{}while(hujiao==0);
  227.    flag=~flag;
  228. }
  229. if(SET==0)
  230. {
  231.    Delay(2000);
  232.    do{}while(SET==0);
  233.    set_st++;x=0;shanshuo_st=1;
  234.    if(set_st>3)set_st=0;
  235. }
  236. if(set_st==0)
  237. {
  238.                 abc = ADC0832(1,0);  //差分模式,CH0-CH1
  239.                 abc = abc*19.607843; //转换为实际电压便于显示
  240.                 abc=abc/1000%10;
  241.     check_wendu();
  242.       Disp_Temperature();
  243. if(flag==1)Alarm1();
  244. else    Alarm();   //报警检测
  245. }
  246. else if(set_st==1)
  247. {
  248.    BEEP=0;    //关闭蜂鸣器
  249.         if(DEC==0)
  250.         {
  251.                 Delay(2000);
  252.                    do{}while(DEC==0);
  253.                 shangxian--;
  254.                 if(shangxian<xiaxian)shangxian=xiaxian;
  255.         }
  256.         if(ADD==0)
  257.         {
  258.                 Delay(2000);
  259.                    do{}while(ADD==0);
  260.                 shangxian++;
  261.                 if(shangxian>99)shangxian=99;
  262.         }
  263.    if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
  264.    if(shanshuo_st) {Disp_alarm(shangxian);}
  265. }
  266. else if(set_st==2)
  267. {
  268.    BEEP=0;    //关闭蜂鸣器
  269.         if(DEC==0)
  270.         {
  271.                 Delay(2000);
  272.                    do{}while(DEC==0);
  273.                 xiaxian--;
  274.                 if(xiaxian<0)xiaxian=0;
  275.         }
  276.         if(ADD==0)
  277. ……………………

  278. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
火灾报警系统程序 原理图.rar (521.84 KB, 下载次数: 347)
回复

使用道具 举报

ID:267227 发表于 2018-4-17 18:37 | 显示全部楼层
菜鸟想知道硬件怎么连
回复

使用道具 举报

ID:319334 发表于 2018-6-6 18:44 | 显示全部楼层
MQ2怎么连接,A、h引脚代表啥
回复

使用道具 举报

ID:445564 发表于 2018-12-14 11:20 | 显示全部楼层
不错不错!
回复

使用道具 举报

ID:445564 发表于 2018-12-14 11:22 | 显示全部楼层
可以拿来用吗?
回复

使用道具 举报

ID:445564 发表于 2018-12-17 19:05 | 显示全部楼层
画图用的什么软件?
回复

使用道具 举报

ID:353814 发表于 2018-12-25 23:26 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:454994 发表于 2019-1-4 00:02 | 显示全部楼层
砂锅打老虎 发表于 2018-12-17 19:05
画图用的什么软件?

protel
回复

使用道具 举报

ID:511172 发表于 2019-4-13 14:04 | 显示全部楼层
如果用mq-2接lm393比较器,用lcd1602显示温度跟湿度怎么编写程序
回复

使用道具 举报

ID:472360 发表于 2019-5-20 17:55 | 显示全部楼层
画的什么东西!?
回复

使用道具 举报

ID:543049 发表于 2019-5-30 09:55 | 显示全部楼层
真的需要这个
回复

使用道具 举报

ID:550820 发表于 2019-5-30 11:01 | 显示全部楼层
不错不错,感谢分享
回复

使用道具 举报

ID:497598 发表于 2020-2-1 17:53 | 显示全部楼层
原理图里没有MQ-2?我怎么没看到
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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