找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 19925|回复: 3
收起左侧

基于单片机的天然气泄漏报警系统设计文档

[复制链接]
ID:419006 发表于 2018-11-1 13:35 | 显示全部楼层 |阅读模式
摘   要
随着经济和科学技术的快速发展,人们对生活质量的提高和生活环境的改善越来越重视。天然气作为一种清洁型能源进入家庭得到广泛使用,为人们的生活带来了方便,减少了城市的污染,提高了生活质量和效率,但是同时,天然气也是潜在的“危险品”,天然气在使用过程中,若管道和阀门密封不好,一旦泄漏出去极易爆炸,危及人们的生命财产安全。面对燃气泄漏而造成的种种事故威胁,我们需要一个解决办法。然而使用天燃气检测系统成为了一个重要的研究课题。
本毕业设计的题目是基于单片机的天然气泄漏检测系统设计。本设计主要是由一个MQ-4传感器采集气体浓度信号,系统建立浓度与电压关系,进行浓度电压转换,浓度显示,声光报警构成的报警装置。本系统由ADC0832处理数据,MCU采用STC89C52,完成气体浓度信号的采集显示内容的传输、显示等功能。本设计的可燃气体报警器由六个部分组成:传感器、数码管显示器、声光报警器、控制电路、A/D转换和电源模块。软件上采用C语言编程,结构简单运行稳定。
该检测系统能够检测天然气浓度,当检测天然气浓度低于设定报警阈值的时候,数码管显示器仅仅显示测得的可燃气体浓度;当检测天然气浓度超出设定报警阈值时给出声光报警,并伴有语音提醒。
目   录
摘   要
Abstract
绪   论
1基于单片机的天然气泄漏检测系统概述
1.1天然气泄漏检测报警器的概述
1.2家用天然气泄漏检测报警器现状
1.3家庭燃气泄漏报警的发展趋势
1.4天然气泄漏检测报警设计意义
2天然气泄露检测报警系统的方案设计
2.1天然气泄漏检测报警系统简介
2.2气体传感器的选型
2.3 天然气泄露报警系统的整体设计方案
2.3.1天然气泄漏报警器工作原理
2.3.2天然气泄漏报警器的结构
2.3.3报警器各模块的功能
3天然气泄露报警的硬件部分设计
3.1主控电路设计
3.1.1STC89C52单片机简介
3.1.2 STC89C52单片机的基本结构
3.1.3 STC89C52RC单片机的引脚
3.2电源电路设计
3.3可燃气体信号采集部分
3.4 MQ-4气体传感器
3.5 A/D转换部分
3.5.1 A/D转换电路
3.6 气体结果测量计算
3.7 声光报警部分
3.8 计数器译码显示电路
3.8.1 LED 的综述
3.8.2 LED 的结构
3.8.3 LED数码管的显示方法
3.9 复位电路
3.10 最小系统及按键
4燃气泄漏检测报警系统的软件部分
4.1程序设计流程与编程
4.2系统调试
结    论
参考文献
附录A   基于单片机的天然气泄漏检测系统原理图
附录B   基于单片机的天然气泄漏检测系统结果图
附录C   C程序
致    谢
绪   论

随着人民生活水平的提高及环保意识的增强,世界需求干净能源的呼声高涨,各国政府也透过立法程序来传达这种趋势,天然气曾被视为最干净的能源之一,再加上1990年中东的波斯湾危机,加深美国及主要石油国家研发替代能源的决心,因此,在还未发现真正的替代能源前,天然气需求量自然消耗会增加。

天然气是一种高效、清洁、经济、稳定的生活能源。近年来,随着我国燃气的变革及西气东输工程的进行,天然气通过管道走进了千家万户,极大地方便我们的生产生活,同时也带来了不少的安全隐患。

从工农业生产的各个领域到人们家庭生活的各个方面,人们直接或间接接触各种有毒有害气体的机会大大增加,由此而引起的中毒,火灾和爆炸事故屡见不鲜,严重威胁到人们的生命和财产安全,成为一种新的社会公害。因此对环境气体进行检测和分析技术的研究日益受到人们的重视。传统的分析气体组分和浓度的方法是以色谱法为代表的各种化学计量方法,尽管其测量精度很高,但操作手续繁杂,实验周期长,无法对有毒、有害气体进行实时、连续、瞬时检测,而气体传感器则满足这种要求,并且在人们日常生活中对减少气体爆炸、火灾等事故已经发挥着越来越大的作用。

目前世界各大强国都把传感器技术列为国家发展的重点技术,国防现代化、工业生产过程自动化、家庭电器化都与传感器的发展休戚相关,今天的传感器技术已渗透到国民经济的各个领域,日益突出它的重要作用。集成化、多功能化、智能化、加工技术微精细化、指标高精度化和性能高稳定、高可靠化已经成为人们开发和研究传感器的重要方向。

泄漏检测报警系统被广泛的应用于各个领域,如石油化工企业、石油运输管线、城市自来水地下管线、锅炉炉管、发动机箱体、缸盖等各种领域。

泄漏检测技术在管道检测之中的应用得到了很好的发展。对于管道的泄漏检测要满足以下几个要求:

1.准确可靠地判断泄漏的发生,并能够在较短的时间内判断出泄漏点具体的位置。

2.准确可靠地判断泄漏程度,能对较小量的泄漏做出判断。

3.检测原理简单,易于操作和维护。


1基于单片机的天然气泄漏检测系统概述
1.1天然气泄漏检测报警器的概述

天然气泄漏检测报警器是燃气安全设备非常重要的一部分,它是由气敏传感器、单片机和报警器组成。它是安全使用城市燃气的最后一道保护设备。天然气泄漏检测报警器通过气敏传感器探测周围环境中的天然气浓度,在通过采样电路,将探测到的模拟信号转换成数字信号传递给控制器或控制电路。当检测气体浓度低于设定报警阈值的时候,数码管显示器仅仅显示测得的可燃气体浓度;当检测气体浓度超出设定报警阈值时给出声光报警。气敏传感器是一种检测特定气体的传感器。它主要包括半导体气敏传感器、接触燃烧式气敏传感器和电化学气敏传感器等,这些传感器都是通过对周围环境中的可燃气体的吸附,在传感器表面产生化学反应或电化学反应,造成传感器的电物理特性的改变,经单片机处理后转换成检测气体的响应浓度 。其中用的最多的是半导体气敏传感器。

1.2家用天然气泄漏检测报警器现状

现在每家每户只要安装天然气管道的都必须安装天然气报警器。对于目前市场上天然气报警存在以下问题:1、对天然气的检测不敏感或者检测到天然气泄漏并不能及时报警作出相应处理;2、对于天然气检测过于敏感,正常做饭烧水时难免会有少数天然气溢出,此时报警器就不停关阀报警严重影响生活效率;3、存在谎报误报的现象,当空气中存油烟时也会关阀报警所以很多家庭对探测报警器束之高阁当成摆设,买了并不安装;4、功能简单,当天然气发生泄漏时只会关阀报警,倘若家中无人阀门不紧,不能及时处理险情通知户主。所以市面上的天然气泄漏检测报警器亟待于改进,从而才能更好地保障我们的生命财产安全,提高我们的生活质量。

1.3家庭燃气泄漏报警的发展趋势

二十多年前,我国的安防报警产品刚刚起步,无论产品技术含量、产品系列完整性、使用性,还是社会影响程度都是相当低的。国外的产品和品牌却占领我们的大部分市场。由于中国的建设正在面临飞速发展,我们应该抓住广阔的市场空间,庆幸的是中国企业抓住了这次机遇,顶住了挑战,先是一批国家的科研院所,后是一批国营企业、民营企业,业内也吸引和凝聚一大批国内的技术和管理精英,花了多年时间,通过几次产品更新换代,就使自己的产品紧紧跟上了国际水平,并且夺回了大部分国内市场,使得现在大多国外产品只有招架之势,这是典型的自力更生,走自己的路。当然目前而言,我们基本占据的是国内市场,对外还刚刚启动。但是,中国企业已经做好准备进军海外市场。

1.4天然气泄漏检测报警设计意义

天然气泄漏造成的事故给我们带来了不少的警示,而市场上的天然气检测报警器并不能为我们提供完善的安全保障,为此我们要设计功能更加完善,探测更加精确的天然气报警器是对付燃气无形杀手的重要手段之一。燃气专家指出,燃气泄漏或废气排放而大量产生的一氧化碳是燃气中毒事件的根源,如采用天燃气泄漏报警器就能得到及时的警示。有关部门经长期测试得出结论,天燃气报警器防止天然气泄漏事故发生的有效率达95%以上。

计算机的普及和信息技术的迅猛发展,人们己不满足于传统的居住环境,对家庭及住宅小区提出了更高的要求,智能化被引入家庭,并迅速在世界各地发展起来。人们对居住环境要求的日见增高,体现在希望住宅不仅更便利、舒适而且更安全。

单片机在日用电子产品中的应用越来越广泛,燃气泄漏则是人们日常生活中常常需要测量和控制的一个问题。单片机有利于为现代人工作、科研、生活、提供更好的更方便的设施。为了防止中毒事件再次发生,提出利用单片机系统进行有效的预防对策。所以怎样防止燃气中毒与爆炸已成为人们的迫切需要。


2天然气泄露检测报警系统的方案设计
2.1天然气泄漏检测报警系统简介

天然气泄漏检测报警系统不仅能够检测环境中的天然气浓度,同时具有报警功能。仪器的最基本组成部分应包括:气体信号采集电路、模数转换电路、单片机控制电路。

气体信号采集电路一般由气敏传感器和模拟放大电路组成,将气体信号转化为模拟的电信号。模数转换电路将从燃气检测电路送出的模拟信号转换成单片机可识别的数字信号后送入单片机。单片机对该数字信号进行处理,并对处理后的数据进行分析,看是否大于或等于某个预设值(报警限),当检测气体浓度低于设定报警阈值的时候,数码管显示器仅仅显示测得的可燃气体浓度;当检测气体浓度超出设定报警阈值时给出声光报警。同时报警装置会通过语音模块向户主发送语音提醒以便让户主及时做出判断处理。为使报警装置更加完善,可以在声音报警基础上,加入闪光报警,变化的光信号可以引起用户注意,弥补嘈杂环境中声音报警的局限。以上是根据检测报警器应具备的功能,提出的整体设计思路。

气敏传感器及单片机是燃气泄漏报警器的两大核心,根据报警器功能的需要,选择合适、精确、经济的气敏传感器及单片机芯片是至关重要的。传感器的选型将在后面介绍。单片机作为硬件电路的核心,它的概况将在第三章详述。

2.2气体传感器的选型

气体传感器属于气敏传感器。气敏传感器是用来检测气体类别、浓度和成分的传感器。它将气体种类及其浓度等有关的信息转换成电信号,根据这些电信号的强弱便可获得与待测气体在环境中存在情况有关的信息。所以气体传感器是仪表的核心组成部分之一。由此可见,气体传感器的选型是非常重要的。

该设计的天然气泄漏报警器主要应用在厨房中,根据报警器检测气体种类的要求,一般选用接触燃烧式气敏传感器或半导体气敏传感器。接触燃烧式气敏传感器的探头会出现阻缓及中毒的问题。阻缓是当在气体与空气含硫物质混合的情况下,则有可能在无焰燃烧的同时,有些固态物质附着在催化元件表面,阻塞载体的微孔,从而引起响应缓慢反应滞缓,灵敏度降低。虽然将阻缓的传感器再放回新鲜空气环境中有得到某种程度的恢复的可能,但是如果长期暴露在这样的环境中,其灵敏度会不断下降,导致该传感器最终丧失检测烟雾的能力。中毒是如果环境空气中含有硅烷之类的物质时,则传感器将使催化元件产生不可逆转的中毒,以致灵敏度很快就丧失。当怀疑检测环境中存在这些物质时,需要经常对探头进行标定。经常对传感器进行标定,是保证其准确性的必要的途径。一般连续使用两个月后应对传感器进行量程校准,这种经常性对传感器的维护需要专业人员和相应设备,特此排除接触式气体传感器,剩下只能选用半导体气敏传感器。半导体气敏传感器包括用氧化物半导体陶瓷材料作为敏感体制作的气体传感器以及用单晶半导体器件制作的气体传感器,它具有灵敏度高,响应快、体积小、结构简单,使用方便、价格便宜等优点,因而得到广泛应用。半导体气敏传感器的性能主要看其灵敏度、选择性(抗干扰性)和稳定性(使用寿命)。

经过对比上述两种气敏传感器的应用特性,发现半导体气敏传感器的优点更加突出:灵敏度高、响应快、抗干扰性好、使用方便、价格便宜,且不会发生探头阻缓及中毒现象,维护成本较低等。因此,本设计采用半导体气敏传感器作为报警器气体信息采集部分的核心。而在众多半导体气敏传感器中,本设计选用MQ-4型气敏传感器,这种型号的传感器对天然气有很高的灵敏度对乙醇的灵敏度很低,具有快速反应快速恢复、使用寿命长、稳定可靠等优点。

2.3 天然气泄露报警系统的整体设计方案
2.3.1天然气泄漏报警器工作原理

本论文中的天然气泄漏报警器以STC89C52单片机为控制核心,通过MQ-4型电阻式半导体传感器采集空气中天然气浓度。气体传感器MQ-4输出的是模拟量,其作用是把探测到空气中的天然气的浓度转换成对应的电压信号,电压信号送入模数转换芯片ADC0832转换成数字信号,转换成的数字信号送入STC89C52单片机,单片机对数据进行线性化处理,将数字化电压信号转化成为对应的浓度值显示到数码管上,同时判断气体浓度值是否超出报警限,当检测气体浓度低于设定报警阈值的时候,数码管显示器仅仅显示测得的可燃气体浓度;当检测气体浓度超出设定报警阈值时给出声光报警。

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

随着信息技术的发展,家用电器趋向于智能化、网络化、信息化。为了满足家庭对可燃性易爆气体安全性要求,同时为了符合时代发展的潮流,在传统的天然气泄漏检测报警器的基础上对其的硬件结构上特进行如下设计:

天然气泄露检测报警系统结构框图如图2.1所示,该系统以STC89C52单片机为核心,天然气检测报警系统要完成天然气信号采集处理、显示和控制报警3大功能。可分为电源模块、天然气信号采集模块、A/D转换模块、声光报警模块、数码管显示模块和单片机控制模块。STC89C52单片机是51系列单片机的一个成员,是8051单片机的升级版,和51系列单片机的指令和输出管脚相兼容。气体检测模块依靠MQ-4传感器和ADC0832转换芯片、显示模块依靠数码管完成显示功能。


                     


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

2.3.3报警器各模块的功能

(1)电源模块:提供电源、保护电路、电压变换、稳压;

(2)天然气信号采集模块:实时采集气体浓度;

(3)A/D转换模块:把采集的模拟信号转变成数字信号传送给单片机;

(4)声光报警模块:当检测到气体泄漏值超过报警限时,发生报警;

(5)显示模块:显示气体浓度和报警限;

(6)键盘模块:通过按动上下键调节报警限;

(7)语音模块:向户主提供语音提醒;   


3天然气泄露报警的硬件部分设计3.1主控电路设计3.1.1STC89C52单片机简介

本设计采用STC89C52单片机作为系统的处理器, STC89C52是STC公司生产的一种低功耗、高性能CMOS 8位微控制器,具有8K在系统可编程Flash存储器。 具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。

它有几个主要组成部分:中央处理器、存储器、并行I/O口、定时器/计数器。STC89C52构成的单片机系统是具有简单的结构、低廉的价格、高效的微控系统,具有较高的性价比。STC89C52的主要性能:首先它是8051单片机的升级版,具有6时钟/机器周期和12时钟/机器周期可以任意选择的特点,其指令代码完全兼容传统的8051。在IO口方面,通用I/O口(32个),复位后:P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不必加上拉电阻,当作为I/O口用时,要加上拉电阻。具有EEPROM功能和看门狗功能,3个16位定时器/计数器(即定时器T0、T1、T2),4路外部中断,下降沿中断或低电平触发电路。

3.1.2 STC89C52单片机的基本结构

STC89C52单片机的基本结构如图3.1所示。



图3.1基本结构图

由图可见,STC89C52单片机主要由以下部分组成:

(1)CPU系统:8位CPU和闪烁存储器;时钟电路;总线控制逻辑。

(2)存储器系统:8KB的程序存储器(ROM/EPROM/Flash);512字节数据存储器(RAM)。

(3)I/O口和其他动能单元:4个并行I/O口;3个16位定时/计数器;2个全双工串行通信口;中断系统(5个中断源)

3.1.3 STC89C52RC单片机的引脚

图3.2 STC89C52管脚示意图

1.引脚的分类

(1)主电源及时钟引脚:VCC、GND等。

(2)P0端口(P0.0~P0.7,39~32引脚)。P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求接10K的上拉电阻。

(3)P1端口(P1.0~P1.7,1~8引脚):P1口是一个内部自带上拉的8位双向I/O口。P1的输出缓冲器可以直接驱动4个TTL的输入。给端口写“1”时,利用内部上拉电阻可以把端口拉高。当把P1口用作输入口来使用时,因为有内部上拉电阻,那些被外部拉低的端口就会输出电流。

  表3.1 P1.0和P1.1引脚复用功能

引脚号

功能特性

P1.0

T2(定时器/计数器2外部计数输入),时钟输出

P1.1

T2EX(定时器/计数器2捕获/重装触发和方向控制)


(4)P2端口(P2.0~P2.7,21~28引脚):P2口是一个内部带上拉的8位双向I/O端口。P2的输出缓冲器也可以驱动4个TTL的输入。当给端口写入1时,利用内部的上拉电阻可以把端口拉到高,此时P2口可以被用作输入口。P2作为输入口使用时,因为内部存在上拉电阻,那些被外部器件拉低的引脚就会输出电流。P2口也可以访问外部存储芯片,访问16位的存储器时,P2送出的是高8位的地址。在访问8位地址的外部芯片存储器时,P2口引脚上的内容(就是专用寄存器的SFR区中的,P2口寄存器的内容),在访问的整个期间都不改变。

(5)P3端口(P3.0~P3.7,10~17引脚):P3是一个内部带上拉的8位双向I/O端口。P3口的输出缓冲器可直接驱动4个TTL输入。给端口写1时,利用内部的上拉电阻把端口拉高,这时P3口就可以作为输入口。当P3用做输入口使用时,因为内部有上拉电阻,那些被外部器件拉低的引脚就会输入一个电流。

在对Flash ROM编程或程序校验时,P3还接收一些控制信号,P1接收低8位地址。

RST(9引脚):复位输入。当连续输入两个机器周期以上的高电平时才能有效,用来完成单片机的复位初始化操作。看门狗计时完成后,RST引脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以取消此功能。DISRTO位的默认状态是复位高电平有效。

ALE(30引脚):地址锁存控制信号的作用在访问外部的存储器时,锁存低8位地址的脉冲。在Flash编程时,在此引脚(PROG)也用做编程输入脉冲在一般情况下,ALE会以晶振频率的1/6的频率出脉冲,可以用来作为外部器件的定时器或

时钟来使用(本设计就用到单片机的ALE管脚通过四分频后为ADC0809提供时钟)。

PSEN(29引脚):外部程序存储器的选通管脚。当STC89C52执行外部程序存储器的程序代码时,PSEN需要在每个机器周期内需要被激活两次,而访问外部的数据存储器时,PSEN就不需要被激活。

EA/VPP(31引脚):访问外部程序存储器的控制管脚。为了使从外部程序存储器的0000H到FFFFH读取指令,EA必须接地。注意加密方式1时,EA将内部锁定位RESET。若是执行内部的程序指令,EA需要接VCC。

XTAL1(19引脚):振荡器反相放大器和时钟发生电路的输入管脚。

XTAL2(18引脚):振荡器反相放大器的输出端。

振荡器特性: XTAL1和XTAL2分别是反向放大器的输入输出端。该反向放大器可以被配置为片内振荡器。石晶振荡和陶瓷振荡都可以被采用。若采用的是外部时钟源驱动器件,XTAL2则不能接。有余输入至内部时钟信号要通过一个二分频的触发器,所以说对外部时钟信号的脉宽没有任何要求,但必须要保证脉冲的高低电平所要求的宽度。

P3口除作为一般I/O口外,还有其他一些复用功能,如表3.2所示:

表3.2 P3口管脚               

管脚
配置功能
P3.0
RXD(串行输入端口)
P3.1
TXD(串行输出端口)
P3.2
INT0(外部中断0端口)
P3.3
INT1(外部中断1端口)
P3.4
T0(定时器0的外部输入)
P3.5
T1(定时器1的外部输入)
P3.6
WR(外部数据存储区间的写入端口)
P3.7
RD(外部数据存储区间的读取端口)

3.2电源电路设计

如图3.3,由USB接口提供电源,VCC接5V电压,GND接地构成电源模块。


图3.3 电源模块

3.3可燃气体信号采集部分

如图3.4,天然气信号采集部分是由气敏传感器MQ-4、AD转换器组成。


图3.4 信号采集部分

3.4 MQ-4气体传感器

MQ-4气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。

MQ-4气体传感器对液化气、甲烷、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。

表3.3 MQ-4材料组成


部件

材料

1

  气体敏感层

二氧化锡

2

电极

金(Au)

3

测量电极引线

铂(Pt)

4

加热器

镍铬合金(Ni-Cr)

5

陶瓷管

三氧化二铝

6

防爆网

100目双层不锈钢(SUB316)

7

卡环

镀镍铜材(Ni-Cu)

8

基座

胶木或尼龙


图3.5 MQ-4基本电路

MQ-4基本电路中有如公式3.5:


                                                       (3.1)


浓度与电压的关系函数如公式3.2:


浓度=(0.7-(10-10*ADdata)/1.4*14.43*ADdata)10^4   (ppm)            (3.2)


3.5 A/D转换部分3.5.1 A/D转换电路

MQ-4传感器采集到的电压信号接单片机P1.1。


图3.6 A/D转换部分

3.5.2 A/D 转换芯片 ADC0832

ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。学习并使用ADC0832 可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。

ADC0832 具有以下特点:

8位分辨率;

逐次逼近式A/D转换器;

双通道A/D转换;

输入输出电平与TTL/CMOS相兼容;

5V电源供电时输入电压在0~5V之间;

工作频率为250KHZ,转换时间为32μS;

一般功耗仅为15mW;

8P、14P—DIP(双列直插)、PICC 多种封装;

商用级芯片温宽为0°C to +70°C,工业级芯片温宽为?40°C to +85°C。

如图3.7,ADC0832 芯片顶视图:

图3.7 ADC0832顶视图

芯片接口说明:

CS_片选使能,低电平芯片使能。

CH0 模拟输入通道0,或作为IN+/-使用。

CH1 模拟输入通道1,或作为IN+/-使用。

GND 芯片参考0 电位(地)。

DI 数据信号输入,选择通道控制。

DO 数据信号输出,转换数据输出。

CLK 芯片时钟输入。

Vcc/REF 电源输入及参考电压输入(复用)。

3.6 气体结果测量计算

图3.8 MQ-4气敏的灵敏度特性

其中X轴表示外界可燃气体的浓度,Y轴表示变化内阻与固定电阻的值(Rs/Ro)。

Rs:元件在不同气体,不同浓度下的电阻值。

Ro:元件在洁净空气中的电阻值。(Ro=14.43 K)

3.7 声光报警部分

采集到的数字信号经过单片机计算后,如果天然气浓度达到报警器设置的临界点时,单片机将控制蜂鸣器报警,同时LED亮。LED的正极与PNP三极管的集电极c相连,负极接2K电阻后接地。蜂鸣器采用PNP三极管来驱动,三极管发射极e接电源正极(+5V),基极接1K电阻后接单片机P3.4端,集电极接蜂鸣器,通过蜂鸣器后接地。


图3.9 声光报警电路

3.8 计数器译码显示电路3.8.1 LED 的综述

在单片机的应用系统中,为了便于人们观察和监视单片机的运行情况,常常需要用显示器显示运行的中间结果、状态等信息,因此显示器也是不可缺少的外部设备之一。LED显示屏是八十年代后期在全球迅速发展起来的新型信息显示媒体,显示屏由几万到几十万个半导体发光二极管像素点均匀排列组成。利用不同的材料可以制造不同色彩的LED像素点。目前应用最广的是红色、绿色、黄色。而蓝色和纯绿色LED的开发已经达到了实用阶段。LED显示屏可以显示变化的数字、文字、图形图像;不仅可以用于室内环境还可以用于室外环境,具有投影仪、电视墙、液晶显示屏无法比拟的优点。

在短短的十来年中,LED点阵显示屏就以亮度高、工作电压低、功耗小、小型化、寿命长、耐冲击和性能稳定的优点迅速成长为平板显示的主流产品,在信息显示领域得到了广泛的应用。LED的发展前景极为广阔,目前正朝着更高亮度、更高耐气候性、更高的发光密度、更高的发光均匀性、可靠性、全色化方向发展。

LED显示屏的应用涉及社会经济的许多领域,主要包括:证券交易、金融信息显示。(2)机场航班动态信息显示。(3)港口、车站旅客引导信息显示。(4)体育场馆信息显示。(5)道路交通信息显示。(6)调度指挥中心信息显示。(7)邮政、电信、商场购物中心等服务领域的业务宣传及信息显示。(8)广告媒体新产品等。

3.8.2 LED 的结构

LED数码管显示器是由发光的二极管显示字段组成的。在单片机应用系统中使用最多的就是七段LED数码管,有共阴极和共阳极两种。七段LED数码管显示器有8个发光二极管,其中从a~g管脚输入显示代码,可显示不同的数字或字符,Dp显示小数点。共阴极LED数码管显示器的公共端为发光二极管阴极,通常接地,当发光二极管的阳极为高电平时,发光二极管点亮。共阳极的LED数码管显示器的公共端为发光二极管的阳极,通常接+5V电源,当发光二极管的阴极为低电平时,发光二极管点亮。

本设计的显示采用LED数码管动态扫描来显示。1个3位的共阳极LED数码管组成3位显示上次测量的数据。单片机的P0口控制显示字型,P2口控制显示字位。显示电路如图3.10。


                     图3.10 显示电路

3.8.3 LED数码管的显示方法

静态显示方式是指当显示器显示某一字符时,发光二极管的位选始终被选中。在这种显示方式下,每一个LED数码管显示器都需要一个8位的输出口进行控制。由于单片机本身提供的I/O口有限,实际使用中,通常通过扩展I/O口的形式解决输出口数量不足的问题。静态显示主要的优点是显示稳定,在发光二极管导通电流一定的情况下显示器的亮度大,系统运行过程中,在需要更新显示内容时,CPU才去执行显示更新子程序,这样既节约了CPU的时间,又提高了CPU的工作效率。其不足之处是占用硬件资源较多,每个LED数码管需要独占8条输出线。随着显示器位数的增加,需要的I/O口线也将增加。

动态显示方式是指一位一位地轮流点亮每位显示器(称为扫描),即每个数码管的位选被轮流选中,多个数码管公用一组段选,段选数据仅对位选选中的数码管有效。对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。通过调整电流和时间参数,可以既保证亮度,又保证显示。若显示器的位数不大于8位,则显示器的公共端只需一个8位I/O口进行动态扫描(称为扫描口),控制每位显示器所显示的字形也需一个8位口(称为段码输出)。

通过比较,我们可以发现LED静态显示更加适合本设计,所以采用此方法。

3.9 复位电路

单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。52系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。


      图3.11 复位电路

3.10 最小系统及按键

STC89C52单片机的最小系统由起振电路、复位电路、STC89C52芯片组成。单片机接+5V电源;晶体振荡器频率为12MHz(11.0592MHz),晶振的两个引脚分别连接在单片机的XTAL1和XTAL2端,晶振的两端再分别连接一个30pF电容后接地;复位电路经电源正极(+5V)接10uF电容后接10k欧姆电阻接地,单片机复位端RST接在电容和电阻之间。

本次设计电路中加入4个按键,用于人为报警和设置报警的上限值。按键分别接单片机P1.4、P1.5、P1.6、P1.7端。S1是数字键加,S2是数字键减,S3是确认键,S4是模拟报警键,当按下S4时蜂鸣器报警,LED亮;再次按下S4用来取消报警。


图3.12 最小系统及按键电路


4燃气泄漏检测报警系统的软件部分4.1程序设计流程与编程

程序流程图如图4.1所示,软件设计包含AD采样程序、数据处理程序、数码管显示程序、按键扫描程序、系统报警程序。


     


                                N


       Y


图4.1 程序设计流程图

STC89C52单片机对ADC0832传送的气体浓度信号进行处理,将浓度值与报警限设定值相比较,判断是否报警。对采集的数字信号进行处理和判断,运用一定的算法计算出待检测气体成分及浓度并送到数码管显示器显示出来。当检测气体浓度低于设定报警阀值的时候,数码管显示器仅仅显示测得的可燃气体浓度;当检测气体浓度超出设定报警阀值时给出声光报警。

在程序设计上我采用的是C语言编程。C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言拥有功能丰富的库函数,运算速度快、编译效率高,有良好的可移植性,可以直接对系统硬件实现控制。C语言是一种结构化的程序设计语言,它支持目前程序设计中被广泛采用的由顶向下的结构化程序设计。此外,C语言程序还具有完善的模块程序结构,从而为软件设计中采用的模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。编写C 语言要使用到C 编译软件,以便把写好的C 程序编译为机器码,这样单片机才能执行编写好的程序。

4.2系统调试

在系统调试阶段我是分模块分阶段进行的。我先调试的是气体浓度检测部分,该部分就是把模拟量变成数字量,其原理和数字电压表的设计是一样的。所以该部分的系统调试在设计数字电压表的原理基础上进行调试的。然后调试数码管显示器,首先通过按键对报警阈值进行设置,最后把气体浓度与按键值统筹在一起就组成了报警阈值调节部分。然后添加进语音报警、声光报警。经过不断的实验测试,形成了系统整体程序。

在设计好硬件的基础上,下载程序。系统通上电,报警限显示为18ppm,按动上下键可以进行调节。将打火机排出的气体对准传感器时,显示屏上的气体浓度立即不断升高;当气体浓度上升到报警限时,声光报警器立即开启,并开始语音提醒:邓晓佳提醒您,存在安全隐患,请您注意。


结    论

气体检测报警器可保障生产与生活的安全,避免火灾和爆炸事故以及煤气中毒的发生,它是防火、防爆和安全生产所必备的仪器,具有广阔的市场空间与发展前景。

本文设计的天然气泄漏检测报警系统采用性价比很高的STC89C52单片机作为主控芯片,利用其强大的处理能力和较丰富的外围接口,合理选用I/O端口,较好地完成了天然气泄漏检测报警系统的设计。本论文设计的气体报警器由气体信号采集电路与单片机控制电路两大部分构成。  

根据设计要求、使用环境、成本等因素,选用MQ-4型半导体电阻式气体传感器。该传感器是对以烷类气体为主的多种气体有良好敏感特性的广谱型半导体敏感器件。它的灵敏度适中,具有响应与恢复特性好,长期工作稳定性、重现性、不易受环境影响及抗温湿度影响等优点。  本系统能够实现对空气中天然气浓度的实时监测并显示,当检测气体浓度低于设定报警阈值的时候,数码管显示器仅仅显示测得的可燃气体浓度;当检测气体浓度超出设定报警阈值时给出声光报警。该设计的天然气泄漏检测报警系统的综合功能远高于市面上的天然气报警系统,减少误报关阀的困扰。本设计在电路方案采用模块化设计,可以方便实现功能扩展,从而满足特殊应用领域中的功能和可靠性需求。在下一步的工作中,可将GPRS模块的功能进行设计改善,以实现网络数据共享,也可以在本系统的基础上加上手机远程控制防火灭火报警灯功能。

在元件及调制方面,由于采用的电路使用了很多集成电路。外围元件不是很多,所以调试不太难。电路中除集成电路外,对各电子元件也无特别要求。未来的时代是个物联网时代,等我具备编写电脑软件的能力后,我会开发出对天然气检测报警的联网控制,从而可以与消防队进行数据共享。


附录A   基于单片机的天然气泄漏检测系统原理图


附录B   基于单片机的天然气泄漏检测系统结果图


致谢

通过这一阶段的努力,我的毕业论文《基于单片机的天然气泄漏报警系统设计》终于完成了,这意味着大学生活即将结束。在大学期间,我在学习上和思想上都受益良多,这除了自身的努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的。

严谨的校风校纪、良好的学术氛围、动手动脑的求学理念、全面发展的育人思想以及老师们对我们的淳淳教诲,让我在学到专业知识的同时也树立了正确的人生观、世界观、价值观,为我走向社会参加工作打下良好的基础。

在本论文的写作过程中,我的导师王钢老师倾注了大量的心血,从选题到开题报告,从写作提纲,到一遍又一遍地指出每稿中的具体问题,严格把关,循循善诱。在王钢老师的精心指导、严格要求以及热情鼓励下,我顺利地完成毕业设计。在此,向王钢老师致以崇高的敬意和由衷的感谢!同时我还要感谢在我学习期间给我极大关心和支持的各位老师以及关心我的同学和朋友。

即将走出校门,有太多说不出的感慨。感谢我在大学遇到的所有老师。感谢四年以来同窗好友对我的帮助。在此谨向大学所有老师和我的同窗好友们表示衷心的感谢!


单片机源程序如下:
  1. #include<reg52.h>  //包含头文件,一般情况不需要改动,
  2.                   //头文件包含特殊功能寄存器的定义
  3. #include <intrins.h>  //Keil library
  4. #include  <math.h>    //Keil library
  5. #include  <stdio.h>   //Keil library
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define ulong unsigned long
  9. #define K_MG_MV    120/66
  10. unsigned char code dispcode0[]={0xc0,0xf9,0xa4,0xb0,
  11.                     0x99,0x92,0x82,0xf8,
  12.                     0x80,0x90};//显示段码值0~9,不包含DP点

  13. uchar code table1[]={0x40,0x79,0x24,0x30,
  14.                     0x19,0x12,0x02,0x78,
  15.                     0x00,0x10};//显示段码值0~9,包含DP点
  16. uchar code table3[]={0x89,0xC7};//H L
  17. sbit bADcs=P1^2;
  18. sbit bADcl=P1^0;
  19. sbit bADda=P1^1;
  20. sbit LED0=P0^1;//定义第0个数码管
  21. sbit LED1=P0^3;//定义第1个数码管
  22. sbit LED2=P0^5;//定义第2个数码管
  23. sbit LED3=P0^7;//定义第3个数码管

  24. sbit alarm=P3^3;//蜂鸣器接口
  25. sbit key_up=P1^4;//数字键加+
  26. sbit key_down=P1^5;//数字键减-
  27. sbit key_ok=P1^6;//确认键
  28. sbit key_manual=P1^7;//模拟手动报警和解除报警按键
  29. bit SetUpFlag=0;
  30. bit set_manual=0;
  31. uchar key_manual_num=0;
  32. ulong gas_uplimit=150;
  33. /********定义变量*********/
  34. unsigned char data1;
  35. unsigned char count;
  36. unsigned char cycle;
  37. unsigned long data2;
  38. long              Value,num=0;
  39. uchar              temp,getdata;
  40. uchar jian,bai,shi,ge;
  41. uchar time_ms1;


  42. //微秒显示函数
  43. void Delayus(uchar i)
  44. {
  45.   while(--i);
  46. }
  47.   //毫秒显示函数
  48. void delay1ms(uint z)
  49. {
  50.               uint x,y;
  51.               for(x=z;x>0;x--)
  52.                             for(y=110;y>0;y--);
  53. }
  54. void ad(void) //ad采样函数
  55. {
  56.      uchar i;
  57.      //data1=0;
  58.      bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
  59.               bADcl=0;
  60.               bADda=1;
  61.               bADcl=1;
  62.               bADcl=0;//i down
  63.               bADda=1;
  64.               bADcl=1;
  65.               bADcl=0;              //   2 down
  66.               bADda=0;
  67.               bADcl=1;
  68.               bADcl=0;              //   3 down
  69.               bADda=1;
  70.               bADcl=1;
  71.               bADcl=0;              //   4 down

  72.               for(i=8;i>0;i--)
  73.                             {
  74.                            
  75.                             data1<<=1;
  76.                             bADcl=0;
  77.                             bADcl=1;
  78.                             if(bADda==1) data1|=0x01;
  79.                                              bADda=1;
  80.                             }
  81.                             bADcs=1;
  82.             
  83. }
  84.                            
  85. void cal() //计算把采样到的值转换成实际电压值
  86. {
  87.                  Value=data1*1.0/256*500;
  88.                  Value=Value*K_MG_MV;
  89.                  Value=Value-5;
  90.                  if(Value<0)Value=0;
  91. }
  92. void display_temp(int Value)
  93. {
  94.             temp=(uchar)(Value/1000);//分离千分位
  95.                                           jian=temp;
  96.                                           temp=(uchar)((Value%1000)/100);              //分离百分位
  97.                                           bai=temp;
  98.                                           temp=(uchar)((Value%100)/10);//分离十位
  99.                                           shi=temp;
  100.                                           temp=(uchar)(Value%10);//分离个位
  101.                                           ge=temp;

  102. ////////////////////////////////////
  103. //////////////先显示个位////////////
  104.     LED0=1;
  105.               LED1=0;
  106.               LED2=0;
  107.               LED3=0;
  108.     P2=dispcode0[ge];
  109.     delay1ms(5);
  110. /////////////接着显示十位/////////
  111.     LED0=0;
  112.               LED1=1;
  113.               LED2=0;
  114.               LED3=0;
  115.     P2=dispcode0[shi];
  116.     delay1ms(5);            
  117. //////////////////////////////////
  118.               /////////////再接着显示百位////
  119.               LED0=0;
  120.               LED1=0;
  121.               LED2=1;
  122.               LED3=0;
  123.     P2=dispcode0[bai];
  124.     delay1ms(5);

  125. ///////////////////////////
  126.               if(key_up==0)
  127.               {
  128.                             delay1ms(10);
  129.                             if(key_up==0)
  130.                             {              
  131.                                             SetUpFlag=1;
  132.                                             gas_uplimit++;
  133.                                             if(gas_uplimit==999)gas_uplimit=0;

  134.                                             while(!key_up);//等待按键释放            
  135.                             }
  136.                
  137.               }
  138. //////////////////////////////////
  139. ///////////////////////////
  140.               if(key_down==0)
  141.               {
  142.                             delay1ms(10);
  143.                             if(key_down==0)
  144.                             {              
  145.                
  146.                                  SetUpFlag=1;
  147.                                           gas_uplimit--;
  148.                                           if(gas_uplimit==0)gas_uplimit=999;
  149.                            
  150.                                             while(!key_down);//等待按键释放            
  151.                             }
  152.                
  153.               }
  154. //////////////////////////////////
  155. ///////////////////////////
  156.               if(key_ok==0)
  157.               {
  158.                             delay1ms(10);
  159.                             if(key_ok==0)
  160.                             {              
  161.                
  162.                                  SetUpFlag=0;
  163.                            
  164.                            
  165.                                             while(!key_ok);//等待按键释放            
  166.                             }
  167.                
  168.               }
  169. //////////////////////////////////
  170. }
  171. void manual_simulate()
  172. {
  173.               if(key_manual==0)
  174.               {
  175.                             delay1ms(10);
  176.                             if(key_manual==0)
  177.                             {     TR1=0;
  178.             key_manual_num++;
  179.                            
  180.             set_manual=1;
  181.                                 alarm=0;
  182.                            
  183.             if(key_manual_num==2)
  184.                                           {
  185.                                  alarm=1;
  186.                            
  187.              TR1=1;
  188.              set_manual=0;
  189.                                           key_manual_num=0;
  190.                                 }
  191.                                           while(!key_manual);//等待按键释放                           
  192.                             }
  193.               }
  194. }
  195. void Alarm_Limit()
  196. {
  197.     if(Value>=gas_uplimit)//判断可燃气体的浓度是否超出设定范围,如超出LED亮并报警。
  198.               {
  199.                  alarm=0;
  200.               }
  201.               else
  202.               {
  203.                  alarm=1;
  204.               }
  205. }
  206. void SysInit_two(void)//初始化定时器T0
  207. {
  208.     TMOD=0x01;                                            //定时器工作在方式1
  209.               ET0=1;
  210.               EA=1;
  211.               TH0=(65536-50000)/256; //对TH0 TL0赋值
  212.               TL0=(65536-50000)%256; //使定时器0.05秒中断一次
  213.               TR0=1;                 //开始计时
  214. }
  215. /*------------------------------------------------
  216.                     主函数
  217. ------------------------------------------------*/
  218. void main()
  219. {
  220.   SysInit_two();//初始化定时器T0
  221. ……………………
  222. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

以上图文的Word格式文档下载(内容和本网页上的一模一样,方便保存):
基于单片机的天然气泄漏检测系统设计论文.doc (1.01 MB, 下载次数: 148)
回复

使用道具 举报

ID:429133 发表于 2018-11-19 12:43 来自手机 | 显示全部楼层
楼主这个仿真在哪能看到?
回复

使用道具 举报

ID:200295 发表于 2020-1-19 22:25 来自手机 | 显示全部楼层
楼主为什么主函数显示错误?
回复

使用道具 举报

ID:728534 发表于 2020-4-13 20:50 | 显示全部楼层
李傻子 发表于 2020-1-19 22:25
楼主为什么主函数显示错误?

请问你用这个程序出结果了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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