基于单片机的天然气泄漏报警系统设计与实现

文章目录

  • 主要介绍
  • 一、天然气泄露报警系统的整体设计方案
  • 2.2.1天然气泄漏报警器工作原理
  • 2.2.2天然气泄漏报警器的结构
  • 二、电源电路设计
  • 三、系统软件设计与实现
  • 4.1 主程序框图
  • 实物
  • 程序源码
  • 四 结论
  • 五、 文章目录

  • 主要介绍

      此设计主要利用了MQ-5传感器采集气体的浓度信号,由系统设置浓度和电压之间的关系,令浓度与电压发生转换、能够显示出当下天然气浓度与声光提示报警构成的报警装置。该检测系统能够检测出当下天然气的浓度,检测出的天然气浓度不超过设定报警设定值的时候,数码管显示器仅显示测出的可燃气体浓度;如果传感器检测出天然气浓度高于系统设定的报警阈值时,系统会给出声光报警,并且还附带语音提醒。结果表明整套系统表现出良好的检测性能和安全性能。

    关键词:天然气;气体泄漏报警;MQ-5传感器;安全

    一、天然气泄露报警系统的整体设计方案

    2.2.1天然气泄漏报警器工作原理

      此设计中的天然气泄漏报警器以STC89C52单片机为操控核心,感知空气中天然气浓度的任务则由MQ-5传感器来执行。MQ-5传感器得到的数据发送给ADC0809转换芯片,ADC0809在将数据转化为单片机能够处理的数据,单片机将数据进行处理之后在将浓度值展示在数码管上再进行判定,如果被测气体浓度超出了报警值,报警器将继电器吸合,LED同时通电,并且喇叭开始发出提示音提示报警;如果浓度没有超过预定的值,数码管上只显示环境中被测气体的浓度值,没有其他的动作。

    2.2.2天然气泄漏报警器的结构

      家用电器渐渐发展的更加成熟了,开始向智能化、连接网络、信息共享的方向发展。首先保证报警器对于家庭用户来说的安全性能,更要顺应社会发展潮流,在以前的报警器的基础上对其进行了硬件结构的优化:
      此系统集处理数据、显示浓度和控制报警这三个优点。可以细分为电源、传感器、信号调试、A/D转换、核心控制单片机等模块。每一个模块都不可缺少,构成了这样一个完善的系统,系统结构框图如图2.1所示。

    图2.1 天然气泄露检测报警系统结构框图

    二、电源电路设计

      

    如图3.11,本设计用USB供电,用自锁开关和DC插座为单片机提供5V电源。

    图3.11 电源电路

    三、系统软件设计与实现

    4.1 主程序框图

    本次主程序设计首先初始化LCD1602液晶显示器,由MQ-5气敏传感器测得的模拟量交给ADC0809转换,下一步读取转换出的数值,在LCD1602液晶显示器中显示具体的数值是多少,判断设置的状态,接下来语音播报当前的数值,判断当前数值是否超出安全值,若超过限值,则继续语音播报常开继电器断开,变成闭合,下一步判断录音键是否按下,如果按下则开始注意切换新的语音文件,扫描设置的限定值,最终回到读取数值的阶段。不停的循环检测。主程序流程图如图4.2所示。

    图4.2 主程序流程图

    实物

    程序源码

    #include <reg52.h>
    #include <intrins.h>
    //显示函数
    #include <display.h>
    #include <4004.h>
    
    //宏定义
    #define uint unsigned int 
    #define uchar unsigned char
    #define Data_ADC0809 P1
     
    //管脚声明
    //sbit LED_R= P2^2; //黄指示灯
    //sbit LED_G= P2^0; //绿色指示灯
    //sbit FENG = P2^5; //喇叭
    //ADC0809
    sbit ST=P3^3;
    sbit EOC=P3^1;
    sbit OE=P3^2;
    //按键
    sbit Key1=P2^5;	//设置按键
    sbit Key2=P2^4; //加
    sbit Key3=P2^3;	//减
    sbit Key4=P2^2;
    sbit jdq=P3^0;
    
    bit bdata flag;//指示灯和喇叭闪烁报警标志位
    uchar set;	  //设置标志位
    
    
    //函数声明
    extern uchar ADC0809();
    extern void Key();
    
    //天然气含量变量
    uchar temp=0;
    
    uchar WARNING=25; // 初始报警值
    
    void delay_2S(void)   //4S
    {
        uchar a;
    	uchar b,c;
        for(c=90;c>0;c--)
            for(b=171;b>0;b--)
                for(a=16;a>0;a--);
        _nop_();  //if Keil,require use intrins.h
    }
    //初始化函数
    /*void init()	 
    {
    	TMOD=0x01; //定时器0方式1
     	TL0=0xb0;
     	TH0=0x3c;  //赋初值
     	EA=1;	//开总中断
    	ET0=1;	//允许定时器0中断
     	TR0=1;	//定时器0开
    }  */
     //主函数
    void main()
    {
    	uchar p=0;
    	uint sum;
    	Init1602();	//1602初始化
    //	init();	 //初始化函数
    	while(1)//主循环
    	{
    		for(p=0;p<20;p++)
    		{
    			temp=ADC0809();	//读取天然气值
    			sum=sum+temp;
    		}
    		temp=sum/20;
    		sum=0;
    		
    		if(set==0) //如果没有按下设置(默认set是0,就是正常显示状态)
    		Display_1602(temp,WARNING,Mode);	 //显示CH4值
    		//开始语音播报
    	if(set==0)
    	{
    			//现在浓度
    			playbit=1;
    			playcout=1;
    			playsound();
    			delay_2S();
    			delay_2S();
    			DDstop();	
    			//第一位
    			playbit=1;
    			playcout=(temp/100)+2;
    			playsound();
    			delay_2S();
    			DDstop();	
    			//第二位
    			playbit=1;
    			playcout=(temp%100/10)+2;
    			playsound();
    			delay_2S();
    			DDstop();	
    			//第三位
    			playbit=1;
    			playcout=(temp%100%10)+2;
    			playsound();
    			delay_2S();
    			DDstop();
    /*			//米
    			playbit=1;
    			playcout=12;
    			playsound();
    			delay_2S();
    			DDstop();	*/
    
    		if(temp<WARNING&&set==0)	//如果实际的CH4值小于报警值且在正常显示状态下
    		{
    			jdq=1;
    //			flag=0;	 //执行下面flag=0的(主要就是绿灯闪,关喇叭和继电器)
    			//浓度正常
    			playbit=1;
    			playcout=12;
    			playsound();
    			delay_2S();
    			delay_2S();
    			DDstop();
    		}
    		else if(temp>WARNING&&set==0)  //如果实际的天然气值大于报警值且在正常显示状态下
    		{
    			jdq=0;
    //			flag=1;	//执行下面flag=1的(主要就是红灯闪,开喇叭和继电器)
    			//浓度超标
    			playbit=1;
    			playcout=13;
    			playsound();
    			delay_2S();
    			delay_2S();
    			DDstop();
    		}
    		delay_2S();	
    		//录音键按下
    		if(Key4==0)
    		{
    			Mode=1;
    			jdq=1;
    			while(Mode!=14)
    			{
    				//按键判断
    				if(Key4==0)
    				{
    					Mode++;
    					Display_1602(0,0,Mode);
    					while(Key4==0);
    					//开始录音
    					playbit=0;
    					recbit=1;
    				//	playcout=Mode-1;
    					reccout=Mode-1;;
    					playsound();
    					if(Mode==2||Mode==14||Mode==13)
    					delay_2S();
    					delay_2S();
    					DDstop();	  
    
    					delayms(100);	
    
    					//开始放音
    					playbit=1;
    					recbit=0;
    					playcout=Mode-1;
    				//	reccout=Mode-1;;
    					playsound();
    					if(Mode==2||Mode==14||Mode==13)
    					delay_2S();
    					delay_2S();
    					DDstop();
    				}		  
    			}
    			Init1602();//初始化显示
    			Mode=0;
    
    		}
    		}
    		Key();//按键扫描
    	}
    }
    //ADC0809读取信息
    uchar ADC0809()
    {
    	uchar temp_=0x00;
    	//初始化高阻太
    
    	OE=0;
    	//转化初始化
    	ST=0;
    	//开始转换
    	ST=1;
    	ST=0;
    	//外部中断等待AD转换结束
    	while(EOC==0)
    	//读取转换的AD值
    	OE=1;
    	temp_=Data_ADC0809;
    	OE=0;
    	return temp_;
    }
    //按键函数
    void Key()
    {
    	if(Key1==0)	//如果设置按键按下
    	{
    		while(Key1==0);//等待按键释放
    //		FENG=0;	//喇叭响
    		set++;	//设置的变量加1
    		jdq=1;
    		flag=0;	//绿灯闪
    		TR0=0;	//关定时器0
    	}
    	if(set==1)//此时设置报警值
    	{
    		write_com(0x38);//屏幕初始化
    		write_com(0x80+0x40+13);//位置
       		write_com(0x0f);//打开显示 无光标 光标闪烁
       		write_com(0x06);//当读或写一个字符是指针后一一位
    //		FENG=1;	//喇叭关
    
    	}
    	else if(set>=2)	//又按了下设置
    	{
    		set=0;	//正常显示状态
    		write_com(0x38);//屏幕初始化
    		write_com(0x0c);//打开显示 无光标 无光标闪烁
    //		FENG=1;	//喇叭关
    		flag=1;	//红灯闪
    		TR0=1;	//定时器0开
    	}
    	if(Key2==0&&set!=0)	  //在设置的状态下按下加
    	{
    		while(Key2==0);	  //等待按键释放
    //		FENG=0;		//喇叭响
    		WARNING++;	//报警值加1
    		if(WARNING>=255)  //如果报警值大于等于255
    		WARNING=0;		 //报警值归零
    		write_com(0x80+0x40+11);
    		write_date('0'+WARNING/100); 
    		write_date('0'+WARNING/10%10);
    		write_date('0'+WARNING%10);	   //显示报警值
    		write_com(0x80+0x40+13);//调整位置
    //		FENG=1;	 //喇叭关
    	}
    	if(Key3==0&&set!=0)	 //在设置的状态下按下减
    	{
    		while(Key3==0);	 //等待按键释放
    //		FENG=0;		 //喇叭响
    		WARNING--;	 //报警值减1
    		if(WARNING<=0)	//如果报警值小于等于0
    		WARNING=255;	//那么报警值为255
    		write_com(0x80+0x40+11);
    		write_date('0'+WARNING/100);
    		write_date('0'+WARNING/10%10);
    		write_date('0'+WARNING%10);
    		write_com(0x80+0x40+13);//调整位置
    //		FENG=1;	 //喇叭关
    	}
    }
    /*
    void  time1_int(void) interrupt 1 //定时器中断0
    {
    	uchar count;
    	TL0=0xb0;
     	TH0=0x3c;  //重赋初值50ms
      	count++;  ///溢出值加1
    	if(count==10)  //如果时间到半秒
    	{
    		if(flag==0)	  //如果flag为0
    		{
    			LED_G=0;  //绿灯亮
    			LED_R=1;  //红灯灭
    			FENG=1;	  //喇叭关
    		}
    		if(flag==1)	   //如果flag为1
    		{
    			LED_G=1;   //绿灯关
    			LED_R=0;   //红灯亮
    			FENG=0;	   //喇叭开
    		}
    	}
    
       	if(count==20)	  //如果时间到1秒
       	{
    		count=0;	  //溢出值清零
    		if(flag==0)	 //如果flag为0
    		{
    			LED_G=1;	//绿灯关
    			LED_R=1;	//红灯灭
    			FENG=1;	   //喇叭关
    		}
    		if(flag==1)	   //如果flag为1
    		{
    			LED_G=1;   //绿灯关
    			LED_R=1;	//红灯灭
    			FENG=1;	   //喇叭关
    		}
    	}
    } */
    
    

    四 结论

    本文设计的天然气泄漏检测报警系统以具有各种优点的STC89C52单片机作为主控芯片,以其不是特别昂贵的造价和优秀的处理能力,利用了它丰富又易于控制的各种端口,程序编写简单容易上手,只需要一个一个调用即可,完成了此次的设计任务。系统能够实时监测和显示空气中的天然气浓度,周围天然气气体超标,系统给出声光报警;若没有超标,则仅在1602液晶显示器上显示当前浓度。
    本设计在电路方案中采用模块化设计,易于实现功能扩展,能够满足特殊应用领域的功能和可靠性需求。在硬件调试中,采用的电路使用了很多模块化设计。设备不多,调试不难。电路除了集成电路以外,对各电子部件也没有特别的要求。
    在调试软件时,发现一些程序只是满足条件而被执行,这增加了步骤调试的难度,在这种情况下,可以选择程序调试的总括断点设置来完全进行调试。而且,在写文章的时候忘记了切换输入方式,汉语标点令程序的编译出现了错误,逐一改进后完成了调试。
    在未来的工作中,可以试着将GPRS模块添加到报警器中,使报警器能够实现远程通信功能,访问消防系统,及时向相关部门通知紧急事件的发声,适当扩充功能,进一步完善天然气报警器的功能,提高安全性,提高易用性。

    五、 文章目录

    目 录
    摘 要 I
    Abstract II
    1 引 言 1
    2天然气泄露检测报警系统的方案设计 4
    2.1 方案选择 4
    2.2 天然气泄露报警系统的整体设计方案 5
    2.2.1天然气泄漏报警器工作原理 5
    2.2.2天然气泄漏报警器的结构 5
    3天然气泄露报警的硬件部分设计 7
    3.1 STC89C52单片机 7
    3.2 传感器的选择 10
    3.3 LCD1602液晶显示电路 11
    3.4 键盘电路 12
    3.5 A/D转换电路 13
    3.6 报警电路 15
    3.6.1 灯光提示电路 15
    3.6.2 声音报警电路 15
    3.7 电源电路设计 17
    3.8 继电器电路 17
    4 天燃气泄漏检测报警系统的软件部分 19
    4.1 软件介绍 19
    4.2 主程序框图 20
    4.3 A/D转换程序流程图 21
    4.5 系统调试 22
    结 论 24
    附录1 源程序清单 25
    参考文献 33
    致谢 35

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于单片机的天然气泄漏报警系统设计与实现

    发表评论