找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3433|回复: 1
收起左侧

单片机可燃气体报警系统设计

[复制链接]
ID:755744 发表于 2020-6-13 13:31 | 显示全部楼层 |阅读模式
可燃气体报警系统整体设计框图如图1所示,主控制器由不间断电源UPS供电。当空气中的可燃气体浓度达到或超过设定值时,一般设定高限为20%LEL,高高限为40%LEL,检测电路即产生与空气中被测气体浓度成线性关系的“气——电”信号,再对该信号(模拟信号)进行分析处理,通过A/D转化变为数字信号传至控制器。最后由单片机驱动LED数码管触摸屏的彩色液晶显示屏,显示气体浓度值,最后由蜂鸣器完成报警过程。经延时、判断,确认为事故泄漏后,发出声光报警,启动应急处理程序,关闭燃气管道电磁阀,切断进口气源,启动通风换气设备(轴流风机)进行排气。当气体浓度降低到安全点后,关闭通风换气设备,停止报警,打开气体管道电磁阀,达到安全保护目的。 并且系统具有自诊断功能,若检测到气敏元件损坏,系统关闭阀门,并启动故障报警信号,黄色报警灯闪亮,提示用户更换气敏传感器。并考虑了要实现现场气体浓度显示,超限预警及自动处理等功能。
51hei.png
可燃气体报警器设计框图如图2所示。当环境中有可燃气体存在时,传感器将会产生一定的电压变化ΔV,考虑到安装的需要,处理器与可燃气体传感器会有一段距离,所以将电压信号ΔV转化成4~20mA电流信号,为保证检测到的信号有较远的传输距离,此电流通过采样电阻,最后通过A/D转化电路,将模拟信号转化为数字信号,通过数码显示管显示出来。
51hei.png
可燃气体报警系统中的核心元件是传感器。在初次使用时,对传感器需进行调零,以便使数码管显示的气体浓度为0%,当环境中存在可燃气体时,差分放大电路将传感器生成的电压信号百度ΔV转化为4~20mA电流信号,然后送至单片机采样端口。
检测电路由补偿元件和检测元件配对组成电桥的两个臂,遇到可燃气体时,检测元件电阻升高,桥路输出电压变量,此变量与气体浓度成正比增大,补偿元件起参比及温度补偿作用,其特点是桥路输出电压呈线性,具有良好的重复性、响应速度快,元件工作稳定、可靠,本文在设计系统,采用MC102作为气体传感器,它对1%浓度的甲烷,其灵敏度为20-40mA。
三、程序实现
3.1程序实现时应考虑的问题
控制器设计 
1.控制器设计框图 
主控制器是设计的难点,也是系统的最主要部分。一方面:实时的显示浓度信息,判断接受数据,进行声光报警,连锁控制阀门和排风设备的动作;另一方面:及时响应显示终端,实现查询、设定等功能,同时还要实现故障自诊断功能。主控制器主要包括通讯模块、人机界面、存储、打印、报警,电源等功能模块。智能显示终端通过串口通讯方式,用32KB的EEPROM存储系统参数及历史记录等关机保存数据,用32KB的RAM存储实时浓度信息。24V到5V电压转化通过电源电路部分实现。同时也检测市电、备电及充电状况等,其主控制器结构图如图3。
  1. #include<reg51.h>    //包含单片机寄存器的头文件
  2. #include<intrins.h>  //包含_nop_()函数定义的头文件
  3. unsigned char flag=0; //紧急报警标示位
  4. unsigned char flag1=0; //传感器检测报警标示位
  5. unsigned int after_AD_val=0;    //储存浓度数值范围是100-10000
  6. unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f共阴极
  7. unsigned int TIME_1;
  8. sbit CS=P1^0;       //将CS位定义为P3.4引脚0xc0,
  9. sbit CLK=P1^1;      //将CLK位定义为P1.0引脚
  10. sbit DIO=P1^2;       //将DIO位定义为P1.1引脚
  11. sbit K1=P2^4;
  12. sbit LED1=P2^0;                 //警情指示灯
  13. sbit LED2=P2^1;                 //正常指示灯
  14. sbit BEEP=P2^2;

  15. sbit wei1=P3^0;
  16. sbit wei2=P3^1;
  17. sbit wei3=P3^2;
  18. sbit wei4=P3^3;
  19. unsigned int wan,qian,bai,shi,ge;
  20. void delay1ms()
  21. {
  22.    unsigned char i,j;        
  23.          for(i=0;i<10;i++)
  24.           for(j=0;j<33;j++)
  25.            ;                 
  26. }
  27. void delay2ms()
  28. {
  29.    unsigned char i,j;        
  30.          for(i=0;i<120;i++)
  31.           for(j=0;j<33;j++)
  32.            ;                 
  33. }

  34. void delaynms(unsigned char n)
  35. {
  36.    unsigned char i;
  37.         for(i=0;i<n;i++)
  38.            delay1ms();
  39. }
  40. void key()
  41. {
  42.         if(K1==0)
  43.         {
  44.                 delaynms(5);
  45.                 if(K1==0)
  46.                 {
  47.                         while(!K1);
  48.                         flag++;
  49.                         if(flag==2)
  50.                         flag=0;
  51.                 }
  52.         }
  53. }
  54. /*****************************************************

  55. 函数功能:报警子程序

  56. *****************************************************/
  57. void baojing()
  58. {
  59.         if(flag==1||flag1==1)
  60.         {
  61.                 LED2=1;
  62.                 LED1=0;
  63.                 BEEP=0;
  64.                 delaynms(10);
  65.                 BEEP=1;
  66.                 delaynms(10);
  67.         }
  68.         if(flag==0&&flag1==0)
  69.         {
  70.                 LED2=0;
  71.                 LED1=1;
  72.                 BEEP=1;
  73.         }
  74. }
  75. void display()
  76. {
  77. //unsigned sel;
  78.         wan=after_AD_val/10000;
  79.         qian=(after_AD_val/1000)%10;
  80.         bai=(after_AD_val/100)%10;
  81.         shi=(after_AD_val/10)%10;
  82.         ge=after_AD_val%10;
  83.         //sel=0x01;
  84. //P0=table[wan];
  85.         // P3=sel;
  86.         //        delaynms(3);
  87.         //P3=0x00;
  88. //sel=sel<<1;
  89.          P0=table[qian];
  90.         wei1=1;
  91. delaynms(1);
  92.         wei1=0;
  93. //sel=sel<<1;
  94. P0=table[bai];
  95. wei2=1;
  96. delaynms(3);
  97.         wei2=0;
  98. //sel=sel<<1;
  99. P0=table[shi];
  100. wei3=1;
  101. delaynms(3);
  102. wei3=0;
  103. //sel=sel<<1;
  104. P0=table[ge];
  105. wei4=1;
  106. delaynms(3);
  107. wei4=0;
  108. //sel=sel<<1;
  109. }

  110. /*****************************************************
  111. 函数功能:将模拟信号转换成数字信号
  112. ***************************************************/
  113. unsigned int  A_D()
  114. {
  115.   unsigned char i,dat;
  116.    CS=1;   //一个转换周期开始
  117.    CLK=0;  //为第一个脉冲作准备
  118.    CS=0;  //CS置0,片选有效

  119.    DIO=1;    //DIO置1,规定的起始信号  
  120.    CLK=1;   //第一个脉冲
  121.    CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平
  122.    DIO=1;   //DIO置1, 通道选择信号  
  123.    CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
  124.    CLK=0;   //第二个脉冲下降沿
  125.    DIO=0;   //DI置0,选择通道0
  126.    CLK=1;    //第三个脉冲
  127.    CLK=0;    //第三个脉冲下降沿
  128.    DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1
  129.    CLK=1;    //第四个脉冲
  130.    for(i=0;i<8;i++)  //高位在前
  131.     {
  132.       CLK=1;         //第四个脉冲
  133.       CLK=0;
  134.       dat<<=1;       //将下面储存的低位数据向右移
  135.                 dat|=(unsigned char)DIO;          //将输出数据DIO通过或运算储存在dat最低位
  136.     }                                 
  137.     CS=1;          //片选无效
  138.          return dat;         //将读书的数据返回     
  139.   }
  140. /*****************************************************

  141.   函数功能:警情检测子程序

  142. *****************************************************/
  143. unsigned int  jq()
  144. {
  145.         unsigned int AD_val;    //储存A/D转换后的值
  146.         AD_val=A_D();    //进行A/D转换
  147.         if(AD_val>=30)   
  148.         flag1=1;
  149.         else
  150.         flag1=0;
  151.         
  152.         after_AD_val=(9900/256)*AD_val+100;
  153.         
  154. return AD_val;
  155. }
  156. /*****************************************************
  157. 函数功能:主函数
  158. ***************************************************/
  159. void timer1() interrupt 3
  160. {        
  161.         
  162.   TH1=(65536-65535)/256;
  163.         TL1=(65536-65535)%256;
  164.         TIME_1++;
  165.         
  166.         if(TIME_1 > 8)
  167.         {TIME_1=0;
  168.         jq();
  169.         }
  170. }
  171.         

  172. main(void)
  173. {        
  174.         LED2=1;
  175.         LED1=1;
  176.         BEEP=1;
  177.         EA=1;
  178.         TMOD=0X10;
  179.         TH1=(65536-60000)/256;
  180.         TL1=(65536-60000)%256;
  181.         ET1=1;
  182.         TR1=1;
  183.          
  184.     while(1)
  185.       {
  186. //jq();
  187.                         display();        
  188.                   key();
  189.                   baojing();
  190.                                 
  191.                                 
  192.           }
  193. }
复制代码
Word格式文档51黑下载地址:
设计1.doc (718.89 KB, 下载次数: 54)
回复

使用道具 举报

ID:328014 发表于 2020-6-20 02:22 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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