家用厨房可燃气体报警控制器优秀论文.docx
《家用厨房可燃气体报警控制器优秀论文.docx》由会员分享,可在线阅读,更多相关《家用厨房可燃气体报警控制器优秀论文.docx(20页珍藏版)》请在冰豆网上搜索。
家用厨房可燃气体报警控制器优秀论文
家用厨房可燃气体报警器
【摘要】本文设计了一种对环境中CO、H2、CH4等有毒可燃气体浓度进行实时数据采集和处理,并能在浓度超标时报警和排气的电路。
该电路通过单片机实现其控制功能。
整个报警器电路由四大部分组成:
采集模块、放大模块、模数转换模块、单片机。
报警器的主要工作流程为:
用传感器(气体传感器)将所需的模拟信号采集放大后传送给A/D转换器,再经模数转换后将数字信号传送至8051单片机,然后通过单片机内部的数据处理,判断是否需要启动蜂鸣器进行报警。
该报警器能广泛应用于居民家庭和企事业单位,从而大大降低由有毒可燃气体所引起的中毒、火灾、爆炸等事故的发生率,保障了人们的生命和财产安全,具有重要的实用价值。
【关键词】可燃气体;报警器;单片机;数据采集;浓度测量
[Abstract]InaspecialenvironmentthispaperintroducesadesignofCOH2,suchasCH4toxiccombustiblegasconcentrationrealtimedataacquisitionandprocessing,andintheconcentrationsexceedthestandardwarninganddischargecircuit.ThecircuitthroughtheMCUtocontrolitsfunctions.Thealarmcircuitiscomposedoffourparts:
AcquisitionModule,AnAmplifyingModule,A/DConversionModule,MCU.Thealarmcircleworkprocessis:
sensors(sensor)willberequiredfortheanalogsignalsamplingamplifyingbacktoA/Dconverter,andthenafteranalog-to-digitalconversiontodigitalsignalto8051MCU,andthenthroughtheMCUinternaldataprocessing,judgingwhethertostartthealarmbuzzer.Thealarmcanbewidelyusedinhouseholdsandenterprisesandinstitutions,therebygreatlyreducingthetoxiccombustiblegaspoisoning,fire,explosionandotheraccidents,toprotectpeople'slivesandpropertysafety,ithasimportantpracticalvalue.
[Keywords]CombustibleGas;Alarm;MCU;DataAcquisition;ConcentrationMeasurement
可燃气体报警器由探测器与报警仪构成,广泛应用于石油燃气化工油库等存在可燃气体的石油化工行业,用以检测室内外危险场所的泄漏情况,是保证生产和人身安全的重要仪器当被测场所存在可燃气体时,探测器降气信号转换成电压信号或电流信号传送到报警仪表,仪器显示出可燃气体爆炸下限的百分比浓度值当可燃气体浓度超过报警设定值时发出声光报警信号提示,值班人员及时采取安全措施,避免燃爆事故发生。
随着人们生活水平的提高,越来越多的人对生活空间的安全和舒适性有了更高的要求。
家用燃气报警器能实时监测可燃气体的泄露情况,一旦发生泄露,即空气中可燃气体达到一定浓度,则报警器立即进行声、光报警,有效防止事故的发生,满足人们对燃气安全的需要。
本设计的任务就是开发一种以性能、参数稳定的气体传感器为探测器并采用89C51单片机进行控制的可燃气体探测报警器。
当空气中有可燃气体在挥发且气体浓度达到或超过设定值时,探测器即产生与空气中被测气体浓度成线性关系的电压信号,该信号经过处理后传至控制器并显示气体浓度值,随即发出声、光报警信号,还可以输入相关控制信号,启动相应控制装置,避免重大事故发生。
其主要分为五个模块,包括:
信号采集模块、A/D转换模块、信号处理模块、显示模块和报警排气模块。
下面对其一一介绍。
其主要组成框图如下图:
如上图所示,本报警器的工作过程如下:
由传感器将所需的模拟信号采集放大后传送给A/D转换器,A/D转换器经模数转换后将数字信号传送至8051单片机,再由单片机通过内部的数据处理,将气体浓度显示在显示器上,最终判断是否需要启动蜂鸣器进行报警并打开排气扇。
本报警器的研制成功,可为广大居民家庭和企、事业单位提供一个准确、可靠的可燃气体浓度检测手段,使人们能及时发现可燃气体的泄露,从而保障了人们的生命和财产安全。
1、信号采集模块
现代电子技术和计算机为信息转换与处理提供了十分完善的手段,使检测与控制技术发展到一个崭新的阶段,但如果没有各种精确可靠的传感器去检测原始数据并提供真实的信息,那么,计算机也无法发挥其应有的作用。
传感器能够把自然界的各种物理量和化学量等精确地变换为电信号,再经电子电路或计算机进行处理,从而对这些量进行监测或控制。
本报警器选用气体传感器,以实现对被监测环境中与可燃气体浓度值相关的模拟量的数据采集。
利用专用可燃气体检验传感器采集信号,对于传感器输出的模拟信号,一般要用运算放大器对其进行调理或放大,以满足A/D转换器对输入模拟量幅值及极性的要求。
在本报警器电路中,同样要对传感器的输出信号进行放大调理。
2、A/D转换模块
由于采集放大后的信号是模拟信号,本设计采用的是8051单片机来控制处理,且单机只能处理数字信号,所以传感器采集的模拟信号经放大调理后,要先传给A/D转换器,进行模数转换。
最常用的A/D转换器有积分型和逐次逼近型两种。
常用的双积分A/D转换器具有较强的抗干扰能力,转换精度比较高,价格也便宜,但转换速度较慢(每秒几次~几十次)。
逐次逼近型A/D转换器一般具有较快的转换速度(每秒万次~几十万次),价格适中,与微机接口方便,但抗干扰能力不如积分型。
综合考虑选用ADC0809,ADC0809是利用CMOS工艺8通道,8位逐次逼近式A/D模数转换器。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
是目前国内应用最广泛的8位通用A/D芯片。
3、信号处理模块
主要利用AT89C51单片机的最小系统来对信号进行处理从而根据信号的浓度来控制蜂鸣器、排气扇及显示器的工作。
其主要操作是由程序控制。
主控单元电路如下图所示,
微处理器采用AT89C51。
A/D转换芯片采用ADC0809,ADC0809的时钟信号CLK由89C51的ALE信号提供。
系统晶振采用4MHz,图中加在ADC0809的ALE(及START)端的正脉冲宽度大于250ns,满足ADC0809对ALE引脚信号的要求。
检测到的气体浓度信号即电压信号经放大、滤波后送到ADC0809的模拟量输入端IN0。
由于单片机为8位处理器,当输入电压为5V时,ADC0809输出数值为255(FFH),因此单片机最大数值分辨率为0.0196V,测试时电压数值的变化一般以0.02V的电压幅度变化。
如果要获得更高的精度,应采用12位的A/D转换器,但对于报警器而言这种精度完全满足要求。
根据所测得的电压值基本上要比标准值偏大0.01~0.02V,可以通过校正ADC0809的基准电压来解决,因为该系统设计时直接用+5V的供电电源作为基准电压,所以电压可能有偏差。
另外,也可用软件编程来校正测量值。
ADC0809的直流输入阻抗为1MΩ,能满足一般的电压测试需要,另外经测试ADC0809在2~5MHz的时钟频率下工作,于是采用74LS373分频器,使其输出时钟频率使ADC0809正常工作。
4、继电器控制电路
排风扇是通过继电器控制电路如下图所示。
该电路由继电器K1和K2、排气扇、电磁阀等组成。
当泄漏气体浓度达到一定值时,通过软件将P0.1置1,VT4长期导通此时三极管VT4、VT5均导通,继电器K1、K2工作,其常开触点闭合,排气扇工作,进行换气,电磁阀电路接通,将气体管道关闭。
当气体浓度下降到某一值时,也可以通过软件将P0.1清零,此时三极管VT5截止,继电器K2停止工作,常开触点断开。
关闭排风扇和电磁阀电路,排风扇停止工作,气体管道打开。
电磁继电器:
接点宜采用双接点结构。
继电器应用封闭式,不得由一接点同时控制探测器内部及外部电路。
电子元器件:
应进行三防(防潮、防霉、防盐雾)处理。
音响器件:
在额定电压下,音响器件在距其正前方1m处的声压级(A计权)应小于70dB,不大于115dB,在85%额定工作电压条件下,音响器件应能发出声响。
开关和按键:
开关和按键应坚固、耐用并清晰地标注出其功能。
探测器外壳应选用不燃烧材料和难燃烧材料(氧指数≥32)。
5、蜂鸣器报警模块
起原理图如下,通过AT89C51程序控制,当浓度超过某一预设值时输出有效信号,此信号经三极管放大后使蜂鸣器工作。
与此同时给继电器一个有效信号使排风扇工作,从而达到控制险情的目的。
软件设计:
软件设计采用单片机C语言设计,总程序设计包括:
A/D转换模块设计、显示模块设计、按键设置模块设计等。
:
主程序为:
#include
#include
#include
#include
#include
#include
#include
//#include
sbitBEEP=P0^4;
sbitMOtor=P0^1;
ucharAD_V[11]={0};
intadd_v=0;
voidrang(uchar*AD,charlen);
voidbutton(void);
voidmain()
{
floatCH4=0.0;
charstr_v[10]="";
chari=0;
intj=0,k=0;
charstr[10]="";
BEEP=0;
MOtor=1;
Com_Init();
L1602_init();
send_char("haha\n");
//WriteDB(0x80,11);
while
(1)
{
intk=0;
add_v=0;
L1602_string(1,1,"GSS");
send_char("读取\n");
for(i=0;i<11;i++)
{
AD_V[i]=get_AD();
CH4=(5.0*AD_V[i])/255;
sprintf(str_v,"V=%.3f\r\n",CH4);//写入发送消息命令
send_char(str_v);
}
send_char("排序\n");
rang(AD_V,11);
for(i=0;i<11;i++)
{
CH4=(5.0*AD_V[i])/255;
sprintf(str_v,"V=%.3f\r\n",CH4);//写入发送消息命令
send_char(str_v);
}
for(i=2;i<9;i++)
{
add_v+=AD_V[i];
}
AD_V[0]=add_v/7;
send_char("平均\n");
CH4=CH4=(5.0*AD_V[0])/255;
sprintf(str_v,"V=%.3f\r\n",CH4);//写入发送消息命令
send_char(str_v);
if(CH4<=2.0)
strcpy(str,"<1%");
elseif(CH4>=4.0)
{
strcpy(str,">99%");
MOtor=0;
for(k=10;k;k--)
{
for(j=200;j>0;j--)
{
BEEP=~BEEP;//输出频率1KHz
delay500();//延时500us
}
for(j=200;j>0;j--)
{
BEEP=~BEEP;//输出频率500Hz
delay500();//延时1ms
delay500();
}
}
MOtor=1;
}
else
{
sprintf(str,"=%2d",(int)(100*((CH4-2.0)/2.0)));
strcat(str,"%\r\n");
}
L1602_string(2,1,str_v);
send_char(str_v);
L1602_string(2,9,str);
L1602_string(2,9,str);
L1602_string(2,13,"");
//send_char("读取时间\r\n");
//AD_V[1]=ReadDB(0x81);
//sprintf(str,"time:
%X\r\n",AD_V[1]);
//send_char(str);
}
}
voidrang(uchar*AD,charlen)
{
inti=0,j=0,temp;
for(j=0;j<(len-1);j++)
for(i=0;i<(len-1-j);i++)
{
if(AD[i]>AD[i+1])
{
temp=AD[i];
AD[i]=AD[i+1];
AD[i+1]=temp;
}
}
}
voidbutton(void)
{
charj;
for(j=200;j>0;j--)
{
BEEP=~BEEP;//输出频率1KHz
//delay500();//延时500us
delay_us(10);
}
//send_char("1\n");
for(j=200;j>0;j--)
{
BEEP=~BEEP;//输出频率500Hz
//delay500();//延时1ms
//delay500();
delay_us(10);
delay_us(10);
}
}
液晶显示程序:
*文件名:
液晶1602显示.c
*描述:
该程序实现了对液晶1602的控制。
*创建人:
东流,2009年4月10日
*版本号:
2.0
***********************************************************************/
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//#defineLed_Delay10
//这三个引脚参考资料
//sbitE=P2^7;//1602使能引脚
//sbitRW=P2^6;//1602读写引脚
//sbitRS=P2^5;//1602数据/命令选择引脚
/********************************************************************
*名称:
enable(uchardel)
*功能:
1602命令函数
*输入:
输入的命令值
*输出:
无
***********************************************************************/
voidenable(uchardel)
{
P2=del;
RS=0;
RW=0;
E=0;
delay(Led_Delay);
E=1;
delay(Led_Delay);
}
/********************************************************************
*名称:
write(uchardel)
*功能:
1602写数据函数
*输入:
需要写入1602的数据
*输出:
无
***********************************************************************/
voidwrite(uchardel)
{
P2=del;
RS=1;
RW=0;
E=0;
delay(Led_Delay);
E=1;
delay(Led_Delay);
}
/****************************************************************
*名称:
L1602_init()
*功能:
1602初始化,请参考1602的资料
*输入:
无
*输出:
无
***********************************************************************/
voidL1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
/********************************************************************
*名称:
L1602_char(ucharhang,ucharlie,charsign)
*功能:
改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下
L1602_char(1,5,'b')
*输入:
行,列,需要输入1602的数据
*输出:
无
***********************************************************************/
voidL1602_char(ucharhang,ucharlie,charsign)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
write(sign);
}
/********************************************************************
*名称:
L1602_string(ucharhang,ucharlie,uchar*p)
*功能:
改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下
L1602_string(1,5,"abcdef;")
*输入:
行,列,需要输入1602的数据
*输出:
无
***********************************************************************/
voidL1602_string(ucharhang,ucharlie,uchar*p)
{
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
enable(a);
while
(1)
{
if(*p=='\0')break;
write(*p);
p++;
}
}
延时程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
/********************************************************************
*名称:
delay()
*功能:
延时,延时时间大概为140US。
*输入:
无
*输出:
无
***********************************************************************/
voiddelay(ucharj)
{
inti;
for(i=0;i<=100;i++)
for(j;j;j--)
;
}
voiddelay_us(ucharj)
{
inti;
for(i=0;i<=10;i++)
for(j;j;j--)
;
}
voiddelay500(void)
{
uchari;
for(i=230;i>0;i--);
}
串口通信程序:
#include
#include
voidCom_Init(void)
{
//串口中断
TI=0;
RI=0;
SCON=0x50;//选用方式1
TMOD=0x21;
TMOD=(TMOD&0xf0);//MODE1
TH1=0xfd;//波特率为9600
TL1=0xfd;
PCON=0x00;//倍频0x80
//IE=0xb0;//EAXXET2ESET0EX0ET1EX1
TR1=1;//enableTIMER1
ES=1;//开串口开断
EA=1;
}
voidsend_char(char*p)
{
ES=0;
while
(1)
{
TI=0;//TI清零
SBUF=*p;
while(!
TI);//如果发送完毕,硬件会置位TI
p++;
if(*p=='\0')
{
TI=0;
break;//在每个字符串的最后,会有一个'\0'
}
//TI=0;
}
ES=1;}
ADC0809控制程序:
#include
#include
#include
#include
#include
#defineucharunsignedc