找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16904|回复: 7
打印 上一主题 下一主题
收起左侧

基于单片机的家用煤气报警器的设计文档

  [复制链接]
跳转到指定楼层
楼主
ID:331818 发表于 2018-5-18 09:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘要
基于自动控制理论,设计一种以单片机AT89C52为控制平台,QM-2N气敏传感器为CO浓度采样的家用型煤气报警器。本设计所包括的主要系统结构有:信号采集电路、信号转换电路、单片机系统、报警联动电路、数码管显示电路。传感器将采集到的浓度信息转换成电压信号,经过ADC0832芯片完成模拟信号到数字信号的转换,后送入AT89C52单片机中,单片机对送入的数字信号进行分析并判断是否达到报警条件,并将浓度信息在四位数码管中显示,当浓度低于预设警戒值时绿灯常亮,表示无危险的正常工作状态;当浓度超过预警值,单片机I/O端口输出电平控制信号,打开排气风扇,控制继电器衔铁吸合使电磁阀关闭,并伴随声、光报警。

摘要
Abstract
1 绪论
1.1 选题背景与意义
1.2 家用煤气报警器整体方案设计与选定
1.3 总体设计思路
1.3.1 煤气报警系统结构分析
1.3.2 煤气报警器设计流程
2 设计分析
2.1 功能要求
2.2 硬件选择
2.2.1 AT89C52单片机说明
2.2.2 气敏传感器
2.2.3 A/D转换器
2.2.4 LED数码管
2.2.5 继电器
2.3 软件选择
2.3.1 搭建电路仿真环境
2.3.2 搭建单片机程序开发环境
3 总体设计与实现
3.1系统总体框架
3.2 子模块的设计与实现
3.2.1 传感器及A/D转换模块
3.2.2 LED数码显示模块
3.2.3 声光报警模块
3.2.4 风扇控制模块
3.2.5 电磁阀控制模块
3.2.6 模拟浓度输入模块
4 仿真与调试
总结
参考文献
附录

1 绪论
1.1 选题背景与意义
近些年来随着我国各类能源的综合开发与利用,家用煤气的普及率逐年上升,但随之而来的煤气泄漏所引发的火灾、中毒、爆炸事故时有发生,这也在某种程度上增加了城市的不和谐和不安全因素。面对如此之多的煤气安全事故,从根源上解决实不可行,唯有建立一种准确有效的预防机制,在煤气泄漏还未造成危害时发出预警,给人们提供时间和相关措施去避免事故的发生,由此,煤气报警器应运而生。它能有效地对周围煤气泄漏及时预警,防止酿成煤气事故,保障人民生命和财产的安全。目前,市面上的该类产品大多只提供报警功能,当人们不在家时仍会造成很大隐患,考虑到此种因素,设计一种能够在泄漏发生时自动启动排气扇并关闭煤气通道的报警装置,能更大程度上地提供安全保障。有关资料显示,煤气报警器对CO事故发生避免率达到95%以上[1]。所以在此设计一种合适的家用煤气泄露报警器切实必要。
尽管在一般条件下,煤气是一种安全性高的燃气,但如果其在空气中含量达到特定浓度时,就会发生燃爆,煤气报警器就是在发生燃爆前提醒人们尽早的发现隐患,解决隐患[1]。在具体报警器设计当中,应对元器件的选择严格把关,保证系统的准确性,才有可能投入到居民的日常使用中。随着科学技术的不断进步以及人们对高功能产品的日益青睐,一种具备高度集成化、智能化的单片机得到了广泛的应用,它的发展前景是巨大的,无论在商业运营还是工业生产中,单片机可谓是无处不在,他的数量不仅远超过世界范围内计算机总和,甚至要比世界人口数还多。本设计是单片机联系实际的一个典型应用,基于单片机的煤气报警器是通过检测管道泄漏的CO浓度作为条件判断报警的[2];若这类气体泄漏达到爆炸极限时,可让单片机处理发出事故声光警报,同时起动排气扇或油烟机等通风设备,以免爆炸,造成巨大伤害。
1.2 家用煤气报警器整体方案设计与选定
为了实现煤气报警器所具备的各项功能,首先应制定一个充分又切合实际的设计方案,该方案要能考虑到设计中的各个环节,将自动化、智能化综合运用到实际设计中,发挥该设计的实际意义[3]。以下是两类比较典型的煤气报警器设计方案:
方案1:经由气敏传感器将采集的浓度模拟信号v送入比较器中,与其内部参考电压vr进行比对,在两者电压幅值相等的附近,输出电压会产生跃变,对应输出1或0,由电平来控制报警电路的运作。而比较器负端也可接电位器来调节参考电压vr,用于报警灵敏度的调节。
优点:电路简易。
缺点:可扩展性不足,实现的功能有限。
方案2:以单片机为控制核心,将气敏传感器采集的浓度模拟信号送入A/D转换后输出8位数字信号,经由单片机I/O输入并与程序预设警戒值比对,根据比对结果发出多个控制信号驱动一系列的联动措施。例如环境浓度显示,灯光指示,电磁阀控制等。
优点:高度可靠性、可控性、智能性。
缺点:相比方案1电路结构较复杂。
就当前发展的趋势来看,传感器的应用愈来愈偏向智能化,可控化。方案1中采用纯模拟电路,结构简单,但可控性差,所采用的运放比较器涉及到精度及稳定性,所以对预警浓度的控制不宜用在事故报警中。方案2中以单片机作为控制核心,对送入其内部的数字信号通过编写程序进行分析比较,具有深度的可调性,可控性,灵活性。且稳定性高。
1.3 总体设计思路
1.3.1煤气报警系统结构分析
根据方案2的设计思路,首先明确该报警器由三部分组成:浓度检测电路、单片机控制系统、报警电路。分析后拟定的该煤气报警器的工作结构如图1-1:


其中以单片机为核心,浓度检测为输入,报警电路为输出,只有三部分协同工作才能组成完整的煤气报警器系统。在具体的单元电路设计中,也要遵循布局合理,结构清晰的基本要求。
1.3.2煤气报警器设计流程
从初期制定煤气报警器的设计方案直到最后的实物成型,一般需要经历四个阶段:
1.硬件电路设计
在明确设计目标后,需要运用专业知识对家用型煤气报警器的各项功能进行实现,了解每项功能所对应的单元电路的组成[4]。由于现今计算机的大量普及,电子设计自动化类别的软件在相关行业中的应用愈加广泛,作为一种模拟环境下的电路设计,它发挥着十分重要的作用,本设计的第一部分也就是基于计算机下的煤气报警器电路的模拟。
2.元器件的选择
在模拟电路搭建过程中,考虑各单元电路所要用到的电子元器件的选择,对所选的芯片应掌握它各个引脚的功能,在实现同样功能的条件下,应尽量选取常用的、结构简单的、成本较低的元件,对于一件产品的接受程度一方面取决于功能,而另一方面往往取决于价格,综合考虑以上因素,完成模拟电路的设计,
3.MCU程序编写
要使模拟的煤气报警器电路在计算机环境中运行,需要设计单片机主程序来驱动仿真电路中的MCU,单片机通过设定的程序来实现对输入输出口的信息交互和控制,传感器采集到的信息才能送入,报警控制电路才能正常运行。将程序写入单片机后进行电路仿真模拟,通过观察各单元电路的工作情况进行硬件调试和程序修改。
4.实物的焊接
在确保仿真电路工作符合设计要求后,需要进行元器件的实物收集和焊接,元件的焊接平台选用15X9洞焊接板,它的优点是布线自由度高,但是焊点过多过于杂乱,主要用于实验阶段的实物设计,待实物通过各项标准,实际测试稳定后,可考虑用软件对设计原理图PCB封装后进行自动布线,制作特定的PCB焊接板。它的集成度高,布局清晰,安全性、稳定性优良,主要用于电子产品的量产化。

2 设计分析
2.1 功能要求
家用煤气报警器从检测到的浓度信号送入单片机控制芯片,到单片器同时发出若干条控制指令,各个单元电路协同配合,首先是气敏传感器通过对周围环境中co浓度进行实施检测,将输出的浓度信号送入A/D转换芯片完成对信号的数字化处理,再送入单片机I/O口完成数据交换和判断,此时根据判断结果单片机内部会产生不同的输出控制信号,决定煤气报警器处于安全工作状态还是告警情况,并将浓度信息实时显示到LED数码管中,当处于一般的正常工作状态时,电磁阀默认由控制器信号控制继电器来驱动打开,使煤气在管道内流通,若需要手动控制电磁阀开合,可以通过拨动开关来控制电磁阀状态;当处于报警状态时,执行声光报警并启动排气装置,将周围空气中的CO排出室外,同时通过控制器让继电器驱动电磁阀闭合,阻断煤气泄漏的根源,避免危险事故的发生[5-6]。
报警器发出声光报警提示,一方面灯光提示可以让人们更直观的察觉到煤气泄漏,给人们发出一种危险信号,同时声音报警传播的空间范围比较大,能有效地对室内人员传达信息,常用的蜂鸣器,集成了音乐芯片的音乐报警器等,本系统采用的是蜂鸣器报警。
系统报警功能模块如图2-1所示:

2.2 硬件选择
2.2.1AT89C52单片机说明
AT89C52是51系列中常用的单片机,作为AT89C51的升级版,它的片内集成8kb的可重复擦写的FLASH Memory型程序存储器只读程序存储器,是一种低压、高能的CMOS型8位微处理器,寿命高于1000写/擦循环,通称单片机(MCU)。它具有3个十六位的可编程计数(Counter)/定时器(Timer)中断,三十二条可编程的I/O线路,八个中断源,并集成了片内震荡器及时钟电路,与其他MCS-51相兼容[7-10]。它的常用封装形式如图2-2。
2.2.2气敏传感器
传感器(Sensor)是一种具备检测功能的集成器件,它能够感知周围所测量的信息,并能把此类信息依据特定的规则转化为电相关信号或其它要求形式的信息量,来提供信息的传送、处理、记载、控制、显示等要求。所以它作为实现自检功能及自控功能的重要环节。目前的传感器按输入量、原理、结构不同分为数十种,各类传感器广泛地用于工业生产和商业运营中[11]。
随着科技发展的日新月异,应用于家用设备的传感器也开始普及。煤气报警器就是一种利用传感器来监测一氧化碳有无泄漏,以预防煤气泄漏引发的爆炸和不完全燃烧所引起的煤气中毒,它属于气敏传感器的一种。从作用机理上,气敏型传感器主要分为两种:接触点燃式传感器以及半导体式气体传感器。
半导体气体传感器主要是通过把白金或钯等贵金属添加在SnO2等N型氧化物半导体上构成的。可燃性待测气体在它的表面发生化学反应改变金属氧化物的电导率,继而感知可燃性气体浓度变化。由于在特定的温度范围内才可以发生所需的此类反应,因此,传感器的电阻丝需加热[12-13]。
接触点燃式传感器是通过燃气和催化剂接触并发生燃烧,使敏感材料线圈的阻值产生变化继而感测燃气浓度。此类传感器,是由贵金属催化剂的多孔隙氧化铝贴附于白金线圈表面组成的。
本设计采用MQ-2型半导体气敏传感器, 它的探测区间广、灵敏系数高、响应迅速、稳定性优异、寿命久,适用于对液化气、烟雾、甲烷、氢气、酒精等的检测。可用于对本设计中煤气浓度的探测。
MQ-2型半导体气敏传感器的规格如下表2-1:
                    

MQ-2在标准环境下测试的灵敏度特性曲线如图2-5所示:


它的温湿度特性如图2-6所示:



它的基本电路如图2-6所示,由H-H组成加热电路,A和B为传感器提供了工作电压并且B作为信号输出。VRL 即为输出电压,可通过调节RL的阻值还进行浓度的动静态校准,在煤气报警值的设定方面,应严格按照煤气浓度爆炸下限的25% LEL进行设定,家用的煤气主要为焦炉煤气,据表2-2知:焦炉煤气的爆炸下限是4.5% VOL,所以报警器的设定值应为它的25% LEL[14]。
根据计算:
         
由传感器MQ2的参数可得煤气爆炸浓度设定值:
故煤气报警器的报警值应设定为2800ppm。
2.2.3A/D转换器
A/D转换器是一种能将输入模拟电压(电流)转换成与它成正比的数字信号。即把被控对象的各类模拟信号转换成计算机可以识别的数字信号。A/D转换器的种类很多,从原理上大致可分为四类:计数器式A/D转换器、逐次逼近式A/D转换器、并行A/D转换器、双积分式A/D转换器。
作为计数式A/D转换器,它的结构相对简易,但由于转换的速率过慢而很少采用,而并行A/D转换器,它的转换速度虽然很快但由于构造复杂价格较高,一般只适用在要求很高的场合,双积分式A/D转换器转换精度高,但是速度仍不够理想,多用于数字测量仪表中。本设计采用的ADC-0832型逐次逼近式A/D转换器精度较高,转换速度快,结构也比较简单[15]。
ADC-0832 是一种双通道、八位分辨率A/D转换模块,它的工作频率是250 千赫兹,转换时间是32微秒,因为它体积小,兼容性好,功耗低,总功耗仅为15mW,所以深受单片机爱好者及企业欢迎,它的封装及引脚图如图2-8所示:


ADC-0832的工作原理是:
将传感器采集到模拟电压Vin信号送入Ch0通道,A/D转换器片内有一个D/A转换器,首先向片内D/A转换器输入10000000,如果电压比较器:Vin > Vn( Vn为片内的D/A转换输出,Vin为A/D转换器的输入电压),则N位寄存器的第一位置1;(若Vin < Vn,则寄存器首位写0);再向D/A转换输入1100 0000(首位写0时,输入0111 1111),若Vin > Vn则寄存器第二位置1(若Vin < Vn,则写0);再向D/A转换输入1110 0000(或0011 1111),若Vin > Vn则寄存器第三位置1(若小于,则写0);顺次执行,直至寄存器第8位赋值结束,控制逻辑监测到比较放大器进行8次后,Eoc输入信号,让A/D转换器将结果通过锁存缓存器输出至D0~D9。
2.2.4LED数码管
LED数码显示管是由若干个独立的发光二极管构成,它的内部进行封装后组成一位形如“8”的元件,当数码管特定的段加上电压后,这些特定的段就会发亮,一般条件下,单一的发光二极管的电流低于30mA。将发光二极管的阳极并联,将并联端接到电源正极,此接法叫做共阳极数码管,相反地,发光二极管的阴极并联,将并联端接到电源负极,即为共阴数码管。四位数码管是由4个单数码管内部封装后显示4位数字,它的应用极其广泛,本设计选用3461AS四位数码管,用于实时显示周围环境中煤气浓度,它的引脚结构如下图2-9:   


2.2.5继电器
继电器作为一类电子控制元件,它包括控制系统(输入回路)、被控系统(输出回路),广泛地在自控电路中应用,它实际上是用“一个较小的电流控制大电流的开关”,起到安全保护功能,并能进行自动调整,转换电路。在单片机控制系统中,继电器装置作为单片机与其它高功率负载的中介,发挥控制作用。三极管起到放大作用。
本设计采用的是电磁式继电器,它是一种利用输入回路中电磁铁芯与衔铁之间的吸合作用,实现自动开关控制,它的平面结构如图,单片机对气敏传感器传入的值进行分析判断,依据结果来控制对应的引脚输出高低电平,决定继电器的电磁线圈内是否有电流流通,若有电流流通,衔铁吸合并驱动负载电路运行。
2.3 软件选择
2.3.1 搭建电路仿真环境
目前市场上的电路原理图绘制类软件有很多种,比较常用的有Protel99se、Multism、Proteus、DXP2000等。
Protel软件能够实现简易的模拟和数字电路的设计与仿真,拥有完善的PCB封装设计功能。Proteus软件能够进行直观的模拟、数字电路还有单片机仿真,更高级的ARM仿真,功能更加完善,并能胜任一般的PCB封装板设计。
本设计采用的是Proteus软件来进行原理图绘制与仿真,他能最大限度地模拟煤气报警器各单元的功能,效果直观,调试方便。
2.3.2 搭建单片机程序开发环境
单片机应用程序是让单片机完成一系列的人们行动的程序指令,最终具有某种特定的功能。Keil C51能兼容51系列的单片机,既可以用汇编语言调试开发也可以在C语言环境开发的工具。本设计采用C语言编写程序,结构简单,程序直观、易懂,后期调试修改方便。

3 总体设计与实现
3.1系统总体框架
根据系统的需求分析,该系统主要实现以下功能:
(1)浓度监测:由传感器来完成对周围环境中煤气浓度的采集并将模拟电压转换成8位浓度信号送入单片机分析判断。
(2)数码显示:直观地反映周围空气中煤气浓度,有助于人们提前发现隐患。
(3)声光报警:发出报警时,利用声音和灯光传达危险信号。
(4)风扇驱动:在报警发生时,驱动风扇工作将室内煤气浓度高的空气排出到室外。
(5)电磁阀通断:电磁阀门能手动控制,且能自动应急关闭,防止煤气进一步泄漏。
该系统的基本结构如图3-1:


程序设计的流程图如图3-2:


3.2 子模块的设计与实现
3.2.1 传感器及A/D转换模块
由于该设计采用的MQ-2传感器输出的是0-5V电压量,不能直接与单片机I/O口进行通信,在A / D的模拟信号转换成8位的数字信号后才能送入单片机内。此外,还应考虑到传感器在初始工作时应预热一段时间后,才能正常检测浓度,在本设计中,传感器通过随浓度正相关变化的电压检测输出5v以内可变电压,送至CHO通道,待ADC0832模拟信道转换完成后,输出8位数字信号。
程序设计:传感器部分,通过设定一个预热延时显示程序(void yure();),用于传感器初始工作时稳定浓度检测电路。带预热结束后,输出模拟信号对A/D模块输入通道进行选择:Di=0,Do=1对应Ch0单相输入通道,由单片机控制CS_置0驱动ADC0832程序将Vin送入,至第19 个脉冲信号时完成数据的输出,表示一次模数转换结束,将CS_端口置1后数据传入单片机内进行处理。
3.2.2 LED数码显示模块
为了能实时了解传感器的工作情况,直观地显示周围空气中煤气浓度的信息,可以在电路中加入一块四位数码显示管。该设计采用了3461AS共阴4位数码管,通过对送入单片机内的8位数字信号进行转换,然后控制段位引脚来完成数字0-9999PPM的显示,通过查表得到煤气发生爆炸的浓度底限,根据底限值的25%触发报警,计算后得,煤气报警器的报警浓度设定为2800ppm较为合适,当浓度值超过2800PPM时,触发报警电路。


程序设计:
将4位共阴极数码管的八个段引脚分别接到单片机AT89C52的P1.0-P0.7口,控制数码管段选(sbit dled=P1^0)的9个元素数组定义为uchar Display_Buffer[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};四个位引脚接到P2.0-P2.3口(sbit wled=P2^0)。
3.2.3 声光报警模块
声光报警模块包含两个LED和一个有源蜂鸣器,单独绿色灯亮时表示煤气浓度在安全范围之内,红色灯点亮时表示煤气浓度超过预设值,同时驱动蜂鸣器进行声音报警。
程序设计:两个工作状态指示灯分别接入P3.7、P3.6口(ledg=P3^7,Ledr
=P3^6),有源蜂鸣器接入P3.4口(buzzer=P3^4),当浓度高于设定值时有源蜂鸣器接入P3.4口(buzzer=P3^4),当浓度高于设定有源蜂鸣器接入P3.4口有源蜂鸣器接入P3.4口(buzzer=P3^4),当浓度高于设定值时,P3.7 P3.6置低电平,P3.4置高电平。浓度低于设定值时,输出相反电平。


3.2.4 风扇控制模块
风扇控制模块主要用于警报发生时,驱动风扇将周围中煤气浓度含量超标的空气排到室外,避免隐患的发生。当检测浓度高于预设值时,单片机特定口产生低电平信号,经过三极管放大后启动排气装置。当浓度低于设定值时,排气装置关闭。            
程序设计:通过P3.2口(sbit motor=P3^2)输出控制电平,当浓度高于设定值时,P3.2输出低电平,使三极管由截止区工作到饱和区,驱动负载回路。当浓度低于设定值时,P3.2输出高电平。
3.2.5 电磁阀控制模块
电磁阀装置是本设计报警电路的重要组成部分,当煤气浓度在安全范围内时,可以通过拨动开关手动控制电磁阀的导通与关断,当空气中煤气浓度高于预设值时,便会自动关闭电磁阀,直到浓度小于设定值,电磁阀导通。检测浓度高于预设值时,单片机P3.3口发出低电平信号,经过三极管放大后送入继电器使得继电器的输入回路导通,衔铁吸合,驱动电磁阀关断。待危险解除后,P3.3引脚输出高电平,驱动电磁阀打开。
程序设计:通过P3.3口(sbit relay=P3^3)输出控制电平,当浓度高于预设值时,P3.3发出高电平信号,使电磁继电器衔铁弹开,无法形成输出回路,电磁阀闭合。浓度低于设定值时,输出低电平。
3.2.6模拟浓度输入模块
    在本设计中,模拟浓度输入量是用来检测MCU控制模块和报警电路的工作是否在正常状态,通过多个按键将不同浓度的信号送入单片机I/O口判断并控制报警电路。一定程度上模拟了环境中不同浓度的煤气信号,便于进行装置调试。
程序设计:通过多路开关将报警器切换至测试模式,在该模式下,两个按钮开关(sbit key2=P1^6;sbit key3=P1^7)分别代表两个不同的煤气浓度值输入当key2闭合时,P1.6口处于低电平,MCU定义模拟量3800ppm输入,触发报警电路,key3闭合时,P1.7口处于低电平,MCU定义模拟量500ppm输入,转为安全工作状态。

4 仿真与调试
在Keil uVision4环境下完成程序编译,并将编写好的程序进行调试,选择Project-Build target,之后根据Build Output界面中的提示来完善程序,待符合要求后生成Hex文件,将Hex文件加载到Proteus仿真图中的单片机内,选择Source-Add Source Files单击New并选择编译完成的Hex文件并点击确定。
接下来进行Proteus仿真运行,选择Debug-Start Debuging,通过调节滑阻来模拟气敏传感器的输出量,观察检测电路和控制电路是否满足设计要求。

目前煤气已经成为生产生活中不可缺少的燃气资源,面对每年时有发生的煤气安全事故,每一起事故都给人民生活、社会安全造成了极大危害,从事故中反思总结,避免类似事件的发生,也是本次设计所要达到的目的。
本篇文档对该设计的内容做了明确的阐述,从选题背景与意义出发,拟定初步设计方案,确定设计思路来实现所制定的功能,从硬件选择到软件仿真,再到最后的实物焊接,贯彻了一个电子产品“构想-设计-生产”的关键环节。
虽然基本完成了该系统所要求实现的功能,但仍然存在着诸多不足之处,出于仿真的角度考虑,对单元电路的仿真设计与实际有一定的差别,仿真电路中主要针对的是功能的直观表现,简化了对单元电路的设计,而实物中还需要考虑电路保护、设备驱动能力等因素。
   其次,本设计只是家用煤气报警器中一个比较典型的设计,设计功能还有欠缺[16],若能将小区各户家中的煤气报警器实现无线通信,将危险情况第一时间传达给专业抢修人员,为避免事故提供了更佳的途径。

参考文献
[1]赵婷.美国烟雾报警器的统计文档[J].消防科学与技术,2010(3):183-184.
[2]陈文平.有关吸气式烟雾探测火灾报警系统设计的探讨[J].福建建设科技,2009(4):64-65.
[3]孙巨勇.基于单片机的烟雾报警器的设计探究[J].电子测试,2013(15):56-57.
[4]费红波,吉锤.可燃气体报警器及其检测标定系统的设计[J].江苏现代计量,2010(2):38-40.
[5]毛星.家用烟雾报警器[J].消防科学与技术,2012(9):940.
[6]王勇等.室内一氧化碳安全监控系统设计[J].工业仪表与自动化装置, 2011:20-50.
[7]徐爱卿,孙涵芳,盛焕鸣.单片微型计算机应用和开发系统[M].北航出版社,2012:14-17.
[8]李全利.单片机原理及应用技术[M].北京:高等教育出版社,2004:225-234.
[9]胡汉才.单片机原理及接口技术(第2版)[M].清华大学出版社,2011:66-78.
[10]王曙霞.单片机实验与实训指导[M].西安:西安电子科技大学出版社,2007.
[11]陈荣忠,陈莉.声表面波气体传感器的理论分析[J],传感器技术,1997(3):27-30.
[12]阮维国.TGS813型半导体气敏传感器及其在燃气毒气检测中的应用电路[J].现代科学仪器.1998(3):1-2.
[13]李永生,杨莉玲.半导体气敏元件的选择性研究[J].传感器技术.2002(3):
1-3.
[14]邓丽芬.可燃气体报警器检定注意事项[J].中国计量,2011(06):112.
[15]王百鸣.一种基于流水逐次逼近比较方式的模/数转换器[J].微电子学,2001(2):92-93
[16]赵中国.火灾自动报警系统设计方案有关问题的探讨[J].铁道标准设计,2005(4):98.

附录1:
附录4:
设计实物:
本文档是在张老师的悉心指导下完成的,在文档撰写的整个过程中, 张老师都极负责任,无论从选题指导、文档框架到细节修改,都给予了我细致全面的指导,并提出了很多宝贵的意见与建议,我的文档才能如此顺利地完成。在此,我要感谢张老师。
同时,我还要感谢在一起愉快的度过大学生活的每个可爱的同学们和尊敬的老师们,正是由于你们的帮助和支持,我才得以克服重重困难和疑惑,直至本文的顺利完成。
最后,我要向百忙之中抽时间对本文进行审阅,评议和参与本人文档的各位老师表示感谢。

单片机源码:
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit cs =P1^4;
  6. sbit clk=P1^1;
  7. sbit dio=P1^2;

  8. sbit ledg=P3^7;                   //绿灯-工作状态指示灯
  9. sbit ledr=P3^6;                   //红灯-报警指示灯
  10. sbit buzzer=P3^4;              //蜂鸣器
  11. sbit relay=P3^3;              //继电器-控制电磁阀
  12. sbit motor=P3^5;              //排气装置
  13. sbit dled=P0^0;                            //led段控制
  14. sbit wled=P2^0;                            //led位控制
  15. sbit key2=P1^6;                            //浓度输入键1
  16. sbit key3=P1^7;                            //浓度输入键2
  17. uint frq;                                                                      //蜂鸣器频率
  18. uint ppm,ledppm,keyppm,ch;            
  19. uchar Display_Buffer[]=
  20. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
  21. uint qian,bai,shi,ge;                  //定义四位数码管

  22. void delayms(unsigned int ms)                             //晶振频率11.0592MHz
  23. {
  24. unsigned int i;
  25. unsigned char j;     
  26. for(i=0;i<ms;i++)   
  27. {         
  28. for(j=0;j<200;j++);        
  29. for(j=0;j<102;j++);     
  30. }
  31. }

  32. void display()                                              //浓度显示程序
  33. {
  34.     qian=ch/1000;                                          //取位
  35.     bai=ch%1000/100;
  36.     shi=ch%1000%100/10;
  37.     ge=ch%10;

  38.     if(ledppm<1000&keyppm<1000&ppm<1000)                            //ppm小于1000时,数码管不显示
  39.        {
  40.         P2=~0x0f;
  41.         P0=Display_Buffer[0];
  42.         }
  43.     else
  44.         {
  45.                              
  46.          P0=Display_Buffer[qian];
  47.                             P2=~0x01;              //11111110  P2.0 千位
  48.          delayms(1);
  49.                             P2=0xff;                                                                                                                //关位去残影
  50.                              
  51.          P0=Display_Buffer[bai];
  52.                             P2=~0x02;              //11111101  P2.1 百位
  53.          delayms(1);
  54.                             P2=0xff;

  55.                               
  56.          P0=Display_Buffer[shi];
  57.                             P2=~0x04;              //11111011              P2.2 十位
  58.          delayms(1);
  59.                             P2=0xff;

  60.                               
  61.          P0=Display_Buffer[ge];                                                                      //显示结束-数码管
  62.                             P2=~0x08;    //11110111              P2.3 个位
  63.          delayms(1);
  64.                             P2=0xff;
  65.          }
  66.          }

  67. void yure()                                                                      //MQ-2预热
  68. {
  69.     int i=0;
  70.               P2=0xff;
  71.               delayms(500);
  72.     while(1)
  73.          {
  74.          delayms(500);
  75.                             P2=P2<<1;
  76.                             P0=Display_Buffer[10];
  77.          delayms(500);
  78.          i++;

  79.          while(P2==0xf0)                            //11110000
  80.          {
  81.                             delayms(500);
  82.          P2=0xff;
  83.          }
  84.          if(i==30|cs==0)
  85.          break;                                                                                    //约为30S
  86.          }
  87.          }


  88. void keytest()
  89. {
  90. if(key2&key3==1)                 //模拟浓度输入开关
  91.           {
  92.            ch=ledppm;                 //显示频道切换
  93.           }
  94. if(cs==0)
  95. {

  96.             if(key2==0)                               //3000ppm
  97.             {
  98.              ch=keyppm;
  99.              keyppm=3000;
  100.             }
  101.             if(key3==0)                               //1500ppm
  102.             {
  103.              ch=keyppm;
  104.              keyppm=1500;
  105.             }                             
  106.                                           }
  107. }
  108. uchar get_ad_result()                 // A/D转换过程
  109. {
  110.               uchar i,dat1=0,dat2=0;
  111.               cs=0;                                                           //使能(驱动芯片)
  112.               clk=0;
  113.               dio=1;
  114.               _nop_();_nop_();                 //延时2us
  115.               clk=1;                                                           //上升沿
  116.               _nop_();_nop_();                 //延时2us

  117.               clk=0;                                                           //第一个脉冲结束
  118.               dio=1;
  119.               _nop_();_nop_();
  120.               clk=1;                                                           //上升沿
  121.               _nop_();_nop_();
  122.               clk=0;                                                           //第二个脉冲结束
  123.               dio=0;
  124.               _nop_();_nop_();
  125.               clk=1;                                                           //上升沿
  126.               dio=1;
  127.               _nop_();_nop_();
  128.               clk=0;                                                          //A/D转换开始(第四个下降沿)
  129.               dio=1;
  130.               _nop_();_nop_();
  131.               for(i=0;i<8;i++)                //读取8位数据
  132.               {
  133.                             clk=1;_nop_();_nop_();
  134.                             clk=0;
  135.                             dat1=dat1<<1;                                                                                                                             
  136.                             if(dio)dat1|=0x01;                                                                                                                                          
  137.               }
  138.               for(i=0;i<8;i++)                //读取8位相反数据
  139.               {              dat2=dat2>>1;                                                                                   
  140.                             if(dio)dat2=dat2|0x80;                                                            
  141.                             clk=1;_nop_();_nop_();                                                                                                                                                         
  142.                             clk=0;                                                                                                                                                                                                                 
  143.               }                                                                                                                                                                                                                                             
  144.               cs=1;                                                                      //A/D转换结束;//读取完成释放总线
  145.               return (dat1==dat2)?dat1:0;  //数据效验如果正确则返回读取数据            
  146. }

  147. void main()                                                                                    //主函数
  148. {
  149. if(cs!=0)
  150. {
  151. yure();
  152. ch=ledppm;
  153. }
  154. TMOD = 0x01;                 //设定时方式1,16位定时器
  155. frq = 0x00;
  156. TH0 = 0x00;                  //赋初值
  157. TL0 = 0xff;                             //赋初值                             //赋初值
  158. TR0 = 1;                              //开定时器T0                                          //开始计数
  159. IE = 0x82;                                          //允许中断              // 0x82;

  160. ledg =1;
  161. ledr =1;
  162. buzzer=1;
  163. relay=1;
  164. motor =1;                                                                                                  //单片机初始化结束
  165.    while(1)                                              //数据判断与处理
  166.     {
  167.      ppm=get_ad_result()*10000.0/255;                              //实际浓度值
  168.               ledppm=get_ad_result()*9999.0/255;                              //4位浓度显示-数码管
  169.                            
  170.               display();                              //浓度显示
  171.      keytest();
  172.                             if(ppm>2812|keyppm>2812)                            //报警判断
  173.           {
  174.            ledg=0;
  175.            ledr=0;
  176.            buzzer=0;
  177.            relay=1;
  178.            motor=0;
  179.            TR0=1;
  180.               }
  181.        else                                          //正常工作(不报警)
  182.           {
  183.            ledg=0;
  184.            ledr=1;
  185.            buzzer=1;
  186.            relay=0;
  187.            motor=1;
  188.            TR0=0;
  189.           }            
  190.            delayms(1);
  191.           }
  192. }

  193. void et0() interrupt 1                                                         
  194. {
  195. TH0 = 0xfe;
  196. TL0 = frq++;               
  197. buzzer = ~buzzer;
  198. }
复制代码
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬,文件下载:
以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
煤气报警器设计.doc (1.8 MB, 下载次数: 181)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:398289 发表于 2018-9-15 13:36 | 只看该作者
你好,我想做一个跟你类似的项目,能指导我学习一下吗?
回复

使用道具 举报

板凳
ID:398508 发表于 2018-9-16 00:03 | 只看该作者
不错,很给力
回复

使用道具 举报

地板
ID:461373 发表于 2019-1-3 21:56 | 只看该作者
有些线是用的网络形式的,文章里也没有说明啊。有大佬能指点一下吗?
回复

使用道具 举报

5#
ID:327281 发表于 2019-10-6 14:02 | 只看该作者
接线好像图文不符
回复

使用道具 举报

6#
ID:570747 发表于 2020-4-11 17:20 | 只看该作者
多谢楼主的教程
回复

使用道具 举报

7#
ID:570747 发表于 2020-4-30 11:43 | 只看该作者
感谢楼主,这个对我帮助很大,让我的设计有了茅塞顿开的感觉,谢谢!
回复

使用道具 举报

8#
ID:1026584 发表于 2022-5-30 10:41 | 只看该作者
有导出的仿真PDF吗?麻烦发一下可以吗?

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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