找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STC89C52的MQ-2火灾自动报警系统的设计与开发

[复制链接]
跳转到指定楼层
楼主
ID:424012 发表于 2018-11-10 12:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
摘要: 随着社会和经济的发展,防火工作越来越重要,但是目前国内的许多研发都侧重于大型场所的火灾报警。因此,有必要研制一种结构简单、经济实用的家庭烟雾报警器以适应市场的需求。基于供家庭使用的烟雾报警器应该具备的基本要求和功能,设计了一种比较适合的烟雾报警器。

本设计以传感器和单片机作为烟雾报警器设计的核心器件,配合其它器件即可实现声光报警、自动排烟换气和消防灭火等功能。设计中单片机选用STC89C52作为控制器件,传感器选用MQ-2型半导体可燃气体敏感元件烟雾传感器实现烟雾的检测。烟雾报警器主要由烟雾信号采集及前置放大电路、模数转换电路、单片机控制电路、显示电路、声光报警电路和安全保护电路构成,设计合理、简单易懂、价格低廉,使单片机在烟雾报警系统的控制中得到充分应用,具有一定的实用价值。论文主要针对烟雾报警系统中的各个组成部分及功能进行了详细的介绍和说明,并对其主控电路和外围设备电路之间的接口连接方式,以及系统软件设计进行了重点的分析和讲解。

目录
1 绪论
1.1 选题背景与研究现状            
2 设计思路与方案的选择
2.1 整体设计思路
2.2 设计方案的选择
2.2.1 烟雾检测传感器选型
2.2.3 温度采集模块            
3 系统概述与硬件方案的设计
3.1 系统总体框架
3.2 电源模块
3.3 单片机最小系统
3.4 单片机的时钟电路与复位电路设计
3.5 OLED显示模块
3.6 声音报警模块
3.7 按键控制模块
3.8 DS18B20接口电路
4 系统软件方案的设计
4.1系统主程序设计及流程图
5 系统调试、测试与分析
5.1 硬件调试
5.2 软件调试
6 结束语
致谢
参考文献
附录1 系统部分程序:
附录2 系统原理图:
附录3 系统PCB图:
附录4 系统实物图:

1 绪论   
1.1 选题背景与研究现状

随着科技的发展,越来越多的火灾隐患潜伏在工业生产和人们的日常生活中。火灾一旦发生便是一场巨大的灾难,很有可能造成巨大的经济损失,甚至危及个人的生命安全。在早期时候,防止和发现火灾,保护人身和财产安全,减少经济损失,是必须要做的一个重要事情。

所以为了减少这类事故的发生,就必须对烟雾进行现场实时检测,采用先进可靠的安全检测仪表,用来严密监测环境中烟雾的浓度,采取有效措施,及早发现事故隐患,避免事故发生,才能确保工业安全和家庭生活安全。因此,研究烟雾的检测方法与研制烟雾报警器就成为传感器技术发展领域的一个重要课题。   

国外从20世纪30年代开始研究及开发烟雾传感器,且发展迅速,一方面是因为人们安全意识增强,对环境安全性和生活舒适性要求提高;另一方面是因为传感器市场增长受到政府安全法规的推动。据有关统计,美国1996年~2002年烟雾传感器年均增长率为27%~30%[1]。随着传感器生产工艺水平逐步提高,传感器日益小型化、集成度不断增大,使得烟雾检测仪器的体积也逐渐变小,提高了烟雾检测仪器的便携性,更加利于生产、运输及市场推广。

1963年5月,日本开发完成第一台接触燃烧式家用燃气泄漏报警器,次年12月其改良产品问世,改良的报警器可以检测燃气、一氧化碳等气体,可以安装在浴室或者采用集中监视[2]。              

我国在70年代初期就已经开始了对烟雾报警器研究,一方面是由于社会的需要,另外一方面也为了减少国家的经济损失,在生产的过程中,生产型号多样化、品种也比较齐全,应用范围从开始单一的炼油系统到后面扩展到几乎所有危险作业环境的各种类型报警器,囊括的种类极其之多,产品数量也在不断增加。不过从发展的角度来看,我们大都是在引进国外先进的传感器技术,并且在国外先进的生产工艺基础之上,对其进行研究从而大力开发属于自己的特色火灾报警器。随着国家的大力发展,近年来,我国在烟雾选择性和产品稳定性上都有很大进步[3]。

2 设计思路与方案的选择   
2.1 整体设计思路

   本次设计是基于STC89C52的烟雾报警器,能够检测环境中的烟雾浓度,并具有报警功能。该报警系统的最基本组成部分应包括:信号采集模数转换电路、单片机控制电路、字符显示电路、声光报警电路和安全保护电路等部分[2]。设计的烟雾报警器具有显示报警状态,为适应家庭和工业等场所对可燃性易爆烟雾安全性等要求。报警器以STC89C52单片机为控制核心,延时的工作方式,选用MQ-2半导体气体烟雾传感器,用来采集烟雾浓度信息,配合外围电路以构成烟雾报警系统,从而达到自己设计的目的。

本设计对系统进行一个整体规划,还有结构设计,以STC89C52单片机为中央处理器,对硬件电路进行设计和改进,使其功能更加完善。系统模块分为软件和硬件两个部分。系统硬件电路主要分为数码管显示电路、状态指示灯电路、声音报警电路、数据收集等四大部分。 系统的软件编制的分类,按照软件实现的功能,主要分为主程序、报警子程序、初始化子程序、报警限值设置子程序、浓度显示子程序等程序内容。在程序的编写过程中,同时又加入了详细的文字注释,以便于后期的修改与维护。

2.2 设计方案的选择    2.2.1 烟雾检测传感器选型

1烟雾传感器内部结构图

烟雾传感器是测量装置和控制系统的首要环节。而烟雾报警器的信号采集由烟雾传感器负责。烟雾传感器能够将气体的种类及其浓度有关的信息转换为电信号,根据这些电信号的强弱就可以获得与待测气体在环境中存在的情况有关的信息,从而达到检测、监控、报警的功能[4]。可以说,没有精确可靠的传感器,就没有精确可靠的自动检测、控制和报警系统。烟雾传感器作为报警器中不可缺少的核心器件,它决定了所采集的烟雾浓度信号的准确性和可靠性,烟雾传感器内部结构如图1所示[5]。

方案一:接触燃烧式传感器。当易燃烟雾接触这种被催化物覆盖的传感器表面时会发生氧化反应而燃烧。接触燃烧式气体传感器的检测元件一般为铂金属丝(也可表面涂铂、钯等稀有金属催化层),使用时对铂丝通以电流,保持300℃~400℃的高温,此时若与可燃性气体接触,可燃性气体就会在稀有金属催化层上燃烧,因此铂丝的温度会上升,铂丝的电阻值也上升;通过测量铂丝的电阻值变化的大小,就知道可燃性气体的浓度。使用接触燃烧式传感器,其最大的缺点是探头很容易发生阻缓和中毒现象。一般在连续使用两个月后应对该传感器进行维护。这无形中加大了工作人员的工作量,同时增加了报警器的维护成本[6]。

方案二:半导体烟雾传感器(半导体气敏传感器)半导体烟雾传感器包括用氧化物半导体陶瓷材料作为敏感体制作的烟雾传感器,以及用单晶半导体器件制作的烟雾传感器。半导体烟雾传感器是利用气体在半导体表面的氧化和还原反应导致敏感元件阻值变化而制成的。按照敏感机理分类,半导体烟雾传感器可分为电阻式和非电阻式。当半导体接触到气体时,半导体的电阻值将发生变化,利用传感器输出端阻值的变化来测定或控制气体的有关参数,这种类型的传感器称为电阻式半导体气敏传感器;当MOS场效应管在接触到气体时,场效应管的电压将随周围气体状态的不同而发生变化,利用这种原理制成的传感器被称为非电阻式半导体气敏传感器[7]。

自1962年半导体金属氧化物烟雾传感器问世以来,由于具有灵敏度高、响应快、输出信号强、耐久性强、结构简单、体积小、维修方便、价格便宜等诸多优点,得到了广泛的应用。但是其最大的缺点就是选择性较差。该传感器己成为世界上产量最大、使用最广的烟雾传感器之一。

方案三:离子感烟传感器

离子感烟传感器对于火灾初起和阴燃阶段的烟雾气溶胶检测非常有效,可测烟雾粒径范围为0.03um-10um。它在内外电离室里面有放射源镅241。由于它能使两极板间空气分子电离为正、负离子,使电极之间原来不导电的空气具有导电性。在正常的情况下,内外电离室的电流、电压都是稳定的。当火灾发生时,烟雾粒子进入电离室后,电力部分(区域)的正离子和负离子被吸附到烟雾粒子上,使正、负离子相互中和的概率增加,从而将烟雾粒子浓度大小以电流变化量大小表示出来,实现对火灾参数的检测。

第四种方案:光电式感烟传感器

光电式感烟传感器包含三个部分:光源、光敏元件和电子开关。在正常的情况下,平常光源发出的光,它会通过透镜照射到光敏元件上,这个时候如果没有什么特殊情况,电路就会保持正常。但是一旦有烟雾从中阻隔光的照射,就会导致到达光敏元件上的光减少,这个时候光敏元件就把光强的变化转化成电的变化,在火灾产生的初期利用光散射原理对烟雾进行探测,并及时发出报警信号。在报警的同时,按照光源不同,又可分为4种,其中包括一般光电式、激光光电式、紫外光光电式和红外光光电式。

光电式感烟探测器发展的速度非常快,种类也在不断增多,除了在大型建筑物内部应用之外,还特别适用于电气火灾危险性较大的场所,如仪器仪表室、隧道、计算机房和电缆沟等处。但是从另一个角度来看,比如说就其功能而言,它在火灾发生的早期也能实现报警功能。

有时候根据报警器检测烟雾种类的不同要求,在使用条件的各种考虑下,半导体烟雾传感器对于各种场合都比较适合,在众多烟雾传感器的应用特性的对比之下,发现半导体烟雾传感器的优点更加突出。比如灵敏度高、响应快、体积小、结构简单等优良特性,而且还兼具使用方便、价格便宜等优点,并且在报警的过程中,不具有其他传感器所具备的缺陷,比如探头阻缓及中毒现象,而且在维护成本方面,也是比较低廉的,因而得到广泛应用。因此,本设计中的烟雾传感器采用方案2,选用MQ-2半导体气体烟雾传感器[8]。

2.2.2 单片机的选型

单片机是烟雾自动报警系统最关键的一部分,并且具有多种功能,它可以用来接收火灾信号,当接收到信号之后,就会启动报警装置显示,然后执行相应的报警。在单片机实现的控制功能中,对单片机的运算速度具有较高的要求,使检测人员和用户在报警器系统正常工作时能够及时地观测到实时的烟雾浓度等级,并进行相应处理。同时,在满足报警器系统设计的计算速度要求之后,在接口功能要求相同的同类型单片机中,还要考虑选择价格低廉且体积轻巧的机型,这是为了建立在报警器的精确性、可靠性及抗干扰性的基础之上,还要能够考虑成本能够足够的低廉[9]。

由于单片机技术在各个领域里面应用的越来越广泛,所以世界上许多集成电路生产厂家相继推出了各种类型的单片机,在众多类型的单片机之中,MCS系列单片机以其成熟的技术、优越的性能、高可靠性和高性能价格比,迅速占领了工业测控、自动化工程应用等大多数主流市场,成为国内单片机应用领域中的翘楚。其中,51系列单片机有一些显著的优点,比如价钱便宜,I/O口多,程序空间大。因此,在测控操作系统中,使用51系列单片机是最理想的选择,因此本次毕业设计采用STC89C52作为设计用的单片机[10]。

STC89C52是一种高性能、低功耗CMOS8位微控制器,使用高密度非易失性存储器技术制造,在兼容性方面,工业80C51产品指令和引脚完全兼容,并且具有8K可编程Flash存储器。片上Flash适于常规编程器,亦允许程序存储器在线可编程。在单芯片上,拥有系统可编程Flash和灵巧的8 位CPU,因为具备这些条件,STC89C52可以为众多嵌入式控制应用系统提供超有效、高灵活的解决方案[10]。STC89C52还具备以下标准功能:256字节RAM,32 位I/O 口线,8k字节Flash定时器,2个数据指针,一个6向量2级中断结构,全双工串行口,三个16位定时器/计数器,片内晶振及时钟电路。另外,STC89C52可降低0Hz 静态逻辑操作,并且支持2种软件可选择节电模式。在空闲模式条件下,CPU开始停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,振荡器被冻结,RAM内容被保存,单片机停止一切工作,直到下一个硬件或中断复位为止。这是一个以单片机为中心的模块,把程序代码烧进去以后,然后在外围接上振荡电路、复位电路、LED显示电路、LED显示电路、报警电路等子模块[11]。

2.2.3 温度采集模块

方案1:在测温电路中采用PT100作为温度传感器。PT100传感器是利用铂电阻的特性来进行测温的,铂电阻具有这样的特性,它的阻值随温度变化而变化、并呈一定函数关系的特性,并且PT100传感器具有抗振动、稳定性好、准确度高、耐高压等优点。但它也具有一些缺点,就是使用起来比较复杂。

方案2:采用DS18B20作为本次设计的温度传感器。DS18B20的数字温度输出通过 “ 一线 ” 总线( 1-Wire是一种特殊的数字信号总线协议,它将独特的信号线和电源线复合在一起,仅使用一条口线;每个芯片编码都是唯一的,支持联网寻址、还有零功耗等方面,是总线之中所需硬件连线最少的一种)这种独特的方式,可以使多个 DS18B20方便地组建成传感器网络,为整个测量系统的建立和组合提供了更大可能性。它在传输距离、转换时间、测温精度、分辨率等方面相较于其他温度传感器有了更大的进步,相对于用户来讲使用更方便,而且效果也更加令人满意[12]。

通过比较之后得出,DS18B20可以直接输出数字温度值,不需要校正,是比较理想的选择,因此最后决定选择方案2。

3 系统概述与硬件方案的设计
3.1 系统总体框架

烟雾报警器是能够检测环境中的烟雾浓度,并具有报警功能的仪器。该报警系统的最基本组成部分应包括:信号采集模数转换电路、单片机控制电路、字符显示电路、声光报警电路和安全保护电路等部分组成。

为适应家庭和工业等场所对可燃性易爆烟雾安全性要求,设计的烟雾报警器具有显示报警状态。报警器采用延时的工作方式,烟雾检测报警器以STC89C52单片机为控制核心,选用MQ-2半导体气体烟雾传感器采集烟雾浓度信息,配合外围电路构成烟雾报警系统。本设计包括硬件和软件设计两个部分。

从设计的要求来分析该设计须包含如下结构:烟雾检测部分、STC89C52单片机主控部分、报警部分,AD采集四大部分。电路总体设计框图如图2所示:

2总体设计框图

处理器采用51系列单片机STC89C52。整个系统是在系统软件控制下工作的。设置在监测点上的烟雾检测探头将检测到的烟雾变换成电信号,送出模拟信号,给AD采集电路采集。在单片机内,经软件查询、识别判决等环节实时发出烟雾报警状态控制信号。驱动蜂鸣器及报警指示灯报警[13]。

3.2 电源模块

3电源模块原理图

由于本系统采用电池供电,考虑了如下几种方案为系统供电。

方案1:采用5V蓄电池为系统供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。但是蓄电池的体积过于庞大,在报警器上使用极为不方便。因此放弃了此方案。

方案2:采用4节1.5 V干电池共4.5V做电源,经过实验验证系统工作时,单片机、传感器的工作电压稳定能够满足系统的要求,而且电池更换方便。

综上所述采用方案2,电源模块原理图如图3所示,其中P1为电池接口,SW1为电源开关[14]。

3.3 单片机最小系统

单片机如果需要工作起来,构成为单片机最小系统的基本构成如图4所示。

4单片机最小系统的基本构成

单片机最小系统大致由三部分构成,第一部分包含单片机,第二部分包含复位电路,最后一部分由时钟电路构成,这三部分每一部分都有其独立功能,能够单独工作却又互相协作。

而在STC89C52 单片机中,它的工作电压范围在4V到5.5V之间,所以就需要给单片机外接一个5V的直流电源。连接到单片机中的40脚,而单片机的VCC就需要接到正极5V,另外一个20脚VSS就接到电源地端,达到所需的效果。

复位电路则是用来确定单片机的工作起始状态,而单片机的启动过程就需要复位电路来实现。当单片机接通电源的时候,它会产生一个复位信号,用来完成单片机的启动并且确定单片机起始工作状态。如果单片机系统在运行的过程中,受到外界环境的干扰并且出现程序跑飞的现象时。只要按下复位按钮,其内部的程序便会自动从头开始执行。这种复位一般有两种方式,上电自动复位和外部按键手动复位。单片机在时钟电路工作以后,要完成复位操作,就需要在RESET端持续给出2个机器周期,这是完成复位操作的重要条件。本设计在两者之间采用的是外部手动按键复位电路,不过选择这个以后,则需要接上拉电阻来提高输出高电平的值。

时钟电路是单片机最重要的一部分,单片机的工作节奏由它来进行掌控。时钟电路在另一方面来讲也可以说是振荡电路,它需要向单片机提供一个正弦波信号作为基准,用来决定单片机的执行速度。XTAL1和XTAL2分别是反向放大器的输入和输出,该反向放大器可以配置一个片内振荡器。但是如果采用外部时钟源驱动器件,就不需要外接XTAL2。因为一个机器周期含有6个状态周期,每个状态周期又含有2个振荡周期,所以一个机器周期共有12个振荡周期,如果外接石英晶体振荡器的话它的振荡频率就为12MHz,一个振荡周期的时间为1/12us[15]。

3.4 单片机的时钟电路与复位电路设计

本系统采用STC系统列单片机,相对于其他系列单片机来说的话,它具有更多的优点。一般STC单片在资源方面也比其他单片机要多,而且它还有一个优点,执行速度快;STC系列单片机使用串口对单片机进行烧写下载程序较为方便;STC89C52单片机内部集成了很多复杂电路,且在抗干扰方面也具有不错的能力。

本系统采用内部方式的时钟电路和加电自复位的复位电路,分别如图5和图6所示:

5时钟电路6复位电路

由于单片机为高阻态,PO口内部不含上拉电阻,不能正常地输出高/低电平,因而该组I/O口在使用时必须外接上拉电阻。

3.5 OLED显示模块

7 数码管显示

显示采用数码管显示,显示电路如图7所示。

3.6 声音报警模块

电路通过三极管基极串连一个电阻与单片机P3.6端口连接从而达到控制蜂鸣器是否报警。声音报警电路如图8所示。

8 声音报警电路图

3.7 按键控制模块

9 消音按键连接电路图

本电路设计了四个按键,一个设置键、一个加键、一个减键、一个紧急报警键,当遇到紧急情况时,可按下紧急报警键,蜂鸣器进行报警,消音按键连接如图9所示[16]。

    3.8 DS18B20接口电路

    采用DS18B20温度传感器,其接口电路图如图10所示。

10 温度传感器接口电路图

(1) DS18B20控制方法

DS18B20有六条控制命令:

温度变化:44H开动DS18B20进行温度转换

读暂存器:BEH仅仅占了暂存器9个字节内容

写暂存器:数据被4EH放入暂存器的TH、TL字节

复制暂存器:暂存器的TH、TL字节被48H 送到E2RAM中

再一次调E2RAM B8H 把E2RAM中的TH、TL字节放到暂存器TH、TL字节

读电源供电方式 B4H 开启DS18B20把电源供电方式的信号发送给主CPU

(2) DS18B20供电方式

DS18B20可以采用两种方式供电:1是采用电源供电方式,此时DS18B20的1脚连到地端,2脚变作信号线,3脚连接电源。另一种是寄生电源供电方式,在图3.1所示的那样,单片机端口连上单线总线,这是为了在工作的周期之内,能够为DS18B20时钟提供足够的电流,以方便其工作,所以可以采用一个三极管来完成上拉总线。本设计采用电源供电方式,P2.3口连单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个上拉电阻和STC89C52的P2.3来完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间所到达的极限时间为10μs。实行寄生电源供电方式则VDD和GND端均需要连接地端。由于单线制只有一根线,则对发送接收口的要求,它就必须是三状态的。DS18B20被主机控制之后完成温度转换就必须经过3个步骤:1,初始化;2,ROM操作指令;3,存储器操作指令。

4 系统软件方案的设计4.1系统主程序设计及流程图

自动火灾报警器的硬件系统设计结束之后,如果缺乏软件的辅助及帮助,硬件还是不能正常工作。软件是硬件能够运动起来的重要支撑部分,控制着整个硬件系统的运行。所以从另外一个意义来说软件对整个系统极其的重要,甚至从某种意义上说比硬件更加重要。

主程序流程图如图11所示。首先要给传感器预热,因为MQ-2型半导体电阻式烟雾传感器在不通电的情况下,它存放一段时间之后,当它再次通电,传感器不能进入工作状态,也就是说正常采集烟雾信息,需要一段时间进行预热处理。程序初始化结束后,系统就会进入监控状态,对整个电路和环境进行一个监控作用。

在整个报警系统工作中,ADC0832把烟雾浓度信息转换处理后,还要经过单片机来对信号进行分析处理,判断系统是否启动报警。主程序还包括报警浓度设定功能、LED八段式数码管浓度字符显示功能、手动报警功能、中断子程序等,这些程序使报警器功能更加全面和完善,给用户带来更大的便利和体验[17]。

图11 主程序流程图

至此,整个多功能MP3系统的设计基本完成了,剩下的任务就是对该系统进行调试和测试。

5 系统调试、测试与分析5.1 硬件调试

第一步为目测阶段,单片机应用系统电路全部需要手工焊接在洞洞板上,这个时候对焊接需要一定的熟悉度,而且还要对每一个焊点都要进行仔细的检查。以便测定它是否有虚焊、是否有毛剌等现象。

第二步为万用表测试,先用万用表再一次检查目测中认为可能存在错误的连线或接点,查看它们的通断状态是否跟设计状态相对应,再检查各种线与线之间的连接是否有短路现象。

第三步为加电检查。当系统加电时,首先检查所有插座或器件引脚的电源端是否达到符合要求的电压值,接地端电压值是否与零想接近,接固定电平的引脚端是否符合设计所需的电平。

第四步是联机检查。

在对硬件电路调试过程中,还遇到了不少问题,第一次当把所有的元件都焊上去后,准备调试,这个时候才发现正负极的插针离得太近了,不容易接电源,按理来说这种小错本不该发生的,出错的原因就是因为自己太多马虎,所以说,做任何事情都必需经过“三思而后行”,不能仅停留在想象的阶段,还需要自己身体力行,方能取得好的结果,才能使自己的经验更加丰富,而且来不得半点的马虎,否则浪费了时间和精力。

首先烧入显示程序,看显示正不正常,整体功能是否都还完善。在调试程序时,发现有的指令用的不正确,功能不能达到自己想要的效果,电路功能也不能正常的运行,另外软件程序中的延时有的过长、有的过短,长短不一。类似的现象还有很多就不一一列举了。

在完成之后,一共要测试两个功能。第一个测试浓度达到设定值之后,是否会自动报警。第二个测试温度上升到报警值之后,能否实现自动实现报警功能。

5.2 软件调试

在软件调试时,对每个模块分别进行测试,采取步步为营的策略,这样方便对一个模块都起到一个检查的作用,第一步完成OLED显示,然后接下来单片机的时钟电路与复位电路,最后就是时钟等驱动程序的调试,下一步烟雾检测AD采集电路的编写﹑按键控制电路的设计,最后根据系统所需然后设置自己想要的功能,进行微型修改。

然后就要在实际操作的过程中,首先把显示程序烧入进去,看显示正不正常。在调试程序结束之后,发现有的指令用的并不是很正确,导致电路功并不能完全实现,另外软件程序中的延时有的过长、有的过短,当出现这些这些问题之后,就要对自己的程序进行不断的修改,不断的查资料,这样才能解决出现的问题得出自己想要的结果。

系统用到了多个中断程序,在设计过程中遇到过中断嵌套而无法退出的问题,这个时候就需要设定中断优先级,其中显示屏引脚中断优先级最高。

6 结束语

本次设计的烟雾检测报警器在生产与生活等情况下可以保障它们的安全,避免发生火灾和爆炸事故,在火灾发生的现场,还可以防止煤气中毒的发生,在防火、防爆和安全生产等场所中,这都是所必备的一种仪器,有此可以想象的出来,烟雾报警器具有巨大的市场空间和不错的发展前景。本论文建立在对烟雾传感器和报警技术进行过深入研究的基础上,然后对国内和国外相同款式产品的技术特点进行全面比较,然后对系统的设计方案进行完,并且最后还要确定系统的设计方案。并对仪器的整体设计进行确定和对各个组成部分还要进行详细的分析和设计,从而才能设计自己所需要的产品。

本论文设计的烟雾报警器由两大部分构成,一部分分为烟雾信号采集电路,另一部分分为单片机控制电路。根据设计要求、使用环境、成本以及众多因素,从而确定选用MQ-2型半导体电阻式烟雾传感器。该传感器因为具有广谱型半导体敏感器件,从而对以烷类烟雾为主的多种烟雾都不错的良好敏感特性。它的灵敏度适中,而且还具有响应与恢复特性好等特点,而且在工作的过程中,稳定性、重现性,都不怎么易受环境影响及抗温湿度影响等优良性能。

在系统单片机控制电路的设计上,为了使仪器具有结构简单、体积小、性能稳定、成本低等优良性能,在前期的设计中采用了高性能、高整合度的STC89C52单片机作为核心芯片,充分利用了其高速数据处理能力和丰富的片内外设,实现了仪器的小型化和智能化,因为有了这些独特设计,才能达到自己预期的效果。由于烟雾传感器需要在加热状态下工作,所以温度便是一个决定因素,在传感器工作的时候,温度越高,反应速度随着温度的升高而加快,响应时间和恢复时间也跟着加快。为保证传感器准确地、稳定地工作,提高响应时间。需要向烟雾传感器持续供给5V的加热电压。烟雾报警器能在范围比较广的温度范围工作,可将烟雾浓度显示用LED数码管显示。当烟雾的浓度达到自己在开始设定的报警浓度时,就会发出报警的滴答声。

在现场进行标定及测试的过程中,我们需要分析烟雾浓度信号的实验数据,利用这些数据计算本报警器显示烟雾浓度与实际浓度之间的误差为2.55%LEL,如果在所规定误差范围±5%LEL之内,这个数据满足我们开始设定的检测要求,达到了预期的设计效果,这就是我们所要得出的结论。

到目前为止毕业设计也即将告一段落了,在这次的毕业设计中,我更加了解理论知识和实践能力的差距,如果自己光是知道一些理论知识,那是远远不够的,还需要不断地实践,从而才能更好的巩固自己所学到的知识。另一方面也意识到自己的短处与缺陷,培养了我的独立思考能力,让自己学到了很多以前从来没有接触过的知识,进一步提高了自己在实际设计过程中研究问题、发现问题、解决问题的能力,同时,也发现了自己的不足之处,和一些问题的存在,并有待进一步学习和发展,让自己在未来的工作和学习之中更快的适应和提高自己。


致谢

在完成本设计的写作过程中,我十分感谢我的指导老师—金老师。从论文的开始到结束,金老师一直都是很悉心的帮我修改着论文设计的过程中出现的各种问题和错误,对我论文设计的每个过程都严格的把关,帮助我开拓设计思路。在做毕业设计的过程中,自己因为杂事比较多,所以在论文这一块都没怎么花心思,很多次论文提交上去,都会出现很多小错误,自己又不知道怎么修改,基本都是老师在指导我。而且老师不仅在论文方面给了我很大帮助,在功课上对我也指导了很多,真的很感谢金老师。

自己在做论文的过程中,也清楚的意识到自己对本专业的茫然与无知,很多东西都不懂,回想自己大学四年的时光,也不知道自己是怎么机缘巧合的来到这个专业以及这个学校,只记得当初只是想跑到大城市去看看,然后想学一技傍身,刚好专业是电子科学与技术,所以才来到浙江传媒学院。自己来到之后,才发现这不是自己感兴趣的专业,所以在学习方面也没怎么花时间,说实话挺可惜的,自己本专业都没学到什么东西,于是在做毕业设计的时候就显得异常的艰难,自己也清楚的意识到自己本专业知识的缺陷。

不过尽管是无意中来到了母校,但是在这里我还是要感谢我们的母校——浙江传媒学院,因为她给了我很多帮助而且还给了我一个舞台来施展自己的才华,来到这里之后,我才发现这里跟其他的学校氛围不一样,气氛相对来说要活跃一些,开始我不怎么能接受,后面我也就慢慢地习惯;额!我很珍惜我大学的四年生活,给我留下了很多回忆,人生仅有一次,甚至毕业论文也是一样,也只有这么一次,以后便再也没有机会去写了。此外我还要感谢我的同班各位同学以及和我一起生活的三个室友,正是与他们的交流合作使我不断成长,受益颇多。最后要感谢我的家人以及我的朋友们,在他们的帮助下,我才得以能顺利完成自己的毕业论文。

通过这次毕业设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学四年的学习成果。它是我这四年来所学知识的综合运用和经验的总结,通过此次设计也锻炼了我个人的各方面能力,包括制图、编程、动手以及沟通能力,所学知识更得到了升华。为以后在工作岗位上发挥自己的才能奠定了坚实的基础。由于时间的仓促和个人专业水平的原因,整篇论文肯定存在着一定的错误和漏洞。恳请阅读此篇论文的老师、同学,多予指正,不胜感激!

最后,再次对关心、帮助我的老师和同学表示衷心地感谢, 更感谢母校四年来对我的培养和教育,希望母校健康蓬勃发展,更加辉煌!等我在外拼搏成功之后,必会回来反哺母校,使母校能够培育更多人才,为社会做出自己的一番贡献。


附录2 系统原理图:


单片机源程序如下:


  1. #include <reg52.h>
  2. #include "eepom52.h"
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #include <intrins.h>
  6. //数码管段选定义      0     1    2    3    4    5              6              7                8                 9            
  7. uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  8.                                                                         0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};              //断码
  9. //数码管位选定义
  10. uchar code smg_we[]={0x7f,0xbf,0xdf,0xef};
  11. //uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7};
  12. uchar dis_smg[8]  = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};            
  13. uchar smg_i = 3;    //显示数码管的个位数

  14. sbit SCL=P3^4;                            //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
  15. sbit DO=P3^3;                            //DO定义为P1口的第4位脚,连接ADC0832DO脚
  16. sbit CS=P3^2;                            //CS定义为P1口的第4位脚,连接ADC0832CS脚

  17. sbit dq   = P3^5;              //18b20 IO口的定义
  18. sbit beep = P3^6;   //蜂鸣器IO口定义
  19. uint temperature,s_temp ;  //温度的变量
  20. uchar dengji,s_dengji;     //烟物等级
  21. uchar shoudong;            //手动报警键
  22. uint huoyan;


  23. bit flag_300ms ;
  24. uchar key_can;                            //按键值的变量
  25. uchar menu_1;        //菜单设计的变量
  26. bit flag_lj_en;                            //按键连加使能
  27. bit flag_lj_3_en;              //按键连3次连加后使能  加的数就越大了
  28. uchar key_time,flag_value;      //用做连加的中间变量
  29. bit key_500ms  ;
  30. uchar flag_clock;
  31. uchar zd_break_en,zd_break_value;   //自动退出设置界面
  32. uchar a_a;
  33. /******************把数据保存到单片机内部eepom中******************/
  34. void write_eepom()
  35. {
  36.               SectorErase(0x2000);
  37.               byte_write(0x2000, s_temp);
  38.               byte_write(0x2001, s_dengji);
  39.               byte_write(0x2060, a_a);            
  40. }
  41. /**************开机自检eepom初始化*****************/
  42. void init_eepom()
  43. {
  44.               read_eepom();                            //先读
  45.               if(a_a != 1)                            //新的单片机初始单片机内问EEPOM
  46.               {
  47.                             s_temp   = 50;
  48.                             s_dengji = 5;
  49.                             a_a = 1;
  50.                             write_eepom();
  51.               }            
  52. }

  53. /***********************18b20初始化函数*****************************/
  54. void init_18b20()
  55. {
  56.               bit q;
  57.               dq = 1;                                                        //把总线拿高
  58.               delay_uint(1);                  //15us
  59.               dq = 0;                                                        //给复位脉冲
  60.               delay_uint(80);                            //750us
  61.               dq = 1;                                                        //把总线拿高 等待
  62.               delay_uint(10);                            //110us
  63.               q = dq;                                                        //读取18b20初始化信号
  64.               delay_uint(20);                            //200us
  65.               dq = 1;                                                        //把总线拿高 释放总线
  66. }
  67. /*************写18b20内的数据***************/
  68. void write_18b20(uchar dat)
  69. {
  70.               uchar i;
  71.               for(i=0;i<8;i++)
  72.               {                                                                      //写数据是低位开始
  73.                             dq = 0;                                          //把总线拿低写时间隙开始
  74.                             dq = dat & 0x01; //向18b20总线写数据了
  75.                             delay_uint(5);              // 60us
  76.                             dq = 1;                                          //释放总线
  77.                             dat >>= 1;
  78.               }            
  79. }
  80. /*************读取18b20内的数据***************/
  81. uchar read_18b20()
  82. {
  83.               uchar i,value;
  84.               for(i=0;i<8;i++)
  85.               {
  86.                             dq = 0;                                          //把总线拿低读时间隙开始
  87.                             value >>= 1;              //读数据是低位开始
  88.                             dq = 1;                                          //释放总线
  89.                             if(dq == 1)                            //开始读写数据
  90.                                           value |= 0x80;
  91.                             delay_uint(5);              //60us              读一个时间隙最少要保持60us的时间
  92.               }
  93.               return value;                            //返回数据
  94. }
  95. /*************读取温度的值 读出来的是小数***************/
  96. uint read_temp()
  97. {
  98.               uint value;
  99.               uchar low;                                             //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
  100.               init_18b20();                               //初始化18b20
  101.               write_18b20(0xcc);                 //跳过64位ROM
  102.               write_18b20(0x44);                 //启动一次温度转换命令
  103.               delay_uint(50);                               //500us
  104.               init_18b20();                               //初始化18b20
  105.               write_18b20(0xcc);                 //跳过64位ROM
  106.               write_18b20(0xbe);                 //发出读取暂存器命令
  107.               EA = 0;
  108.               low = read_18b20();                 //读温度低字节
  109.               value = read_18b20();  //读温度高字节
  110.               EA = 1;
  111.               value <<= 8;                               //把温度的高位左移8位
  112.               value |= low;                               //把读出的温度低位放到value的低八位中
  113.               value *= 0.0625;                     //转换到温度值
  114.               return value;                               //返回读出的温度
  115. }

  116. /***********读数模转换数据********************************************************/            
  117.                                                                                     //  1  0  0 通道
  118.                                                                                     //  1  1  1 通道
  119. unsigned char ad0832read(bit SGL,bit ODD)
  120. {
  121.               unsigned char i=0,value=0,value1=0;                           
  122.                             SCL=0;
  123.                             DO=1;
  124.                             CS=0;                            //开始
  125.                             SCL=1;                            //第一个上升沿            
  126.                             SCL=0;
  127.                             DO=SGL;
  128.                             SCL=1;                //第二个上升沿
  129.                             SCL=0;
  130.                             DO=ODD;
  131.                             SCL=1;                  //第三个上升沿
  132.                             SCL=0;                  //第三个下降沿
  133.                             DO=1;
  134.                             for(i=0;i<8;i++)
  135.                             {
  136.                                           SCL=1;
  137.                                           SCL=0; //开始从第四个下降沿接收数据
  138.                                           value<<=1;
  139.                                           if(DO)
  140.                                                         value++;                                                                                   
  141.                             }
  142.                             for(i=0;i<8;i++)
  143.                             {                                          //接收校验数据
  144.                                           value1>>=1;
  145.                                           if(DO)
  146.                                                         value1+=0x80;
  147.                                           SCL=1;
  148.                                           SCL=0;
  149.                             }
  150.                             CS=1;
  151.                             SCL=1;            
  152.                             if(value==value1)                                                        //与校验数据比较,正确就返回数据,否则返回0            
  153.                                           return value;
  154.               return 0;
  155. }
  156. /****************报警函数***************/
  157. void clock_h_l()
  158. {
  159.               static uchar value;
  160.               if((dengji >= s_dengji) || (temperature >= s_temp) || (shoudong == 1))                            //报警
  161.               {
  162.                             value ++;
  163.                             if(value >= 3)
  164.                             {
  165.                                           value = 10;
  166.                                           beep = ~beep;                //蜂鸣器报警
  167.                             }
  168.               }else
  169.               {
  170.                             if((dengji < s_dengji) && (temperature < (s_temp - 1)) && (shoudong == 0))                //取消报警
  171.                             {
  172.                                           value = 0;
  173.                                           beep = 1;
  174.                             }            
  175.               }
  176. }
  177. void main()
  178. {
  179.               static uchar value;
  180.               temperature = read_temp();  //读取温度值
  181.               init_eepom();                                                //读eepom数据
  182.               time_init();                                                        //初始化定时器
  183.               delay_1ms(650);                                                      
  184.               while(1)
  185.               {
  186.                             key();                                                                      //独立按键程序
  187.                             if(key_can < 10)
  188.                             {
  189.                                           key_with();                                          //按键按下要执行的程序
  190.                             }
  191.                             temperature = read_temp();  //读取温度值
  192.                             if(flag_300ms == 1)
  193.                             {                           
  194.                                           flag_300ms = 0;
  195.                                           clock_h_l();
  196.                                           dengji = ad0832read(1,0);            
  197.                                           dengji = dengji * 10 / 250;
  198.                                           huoyan = ad0832read(1,1);            
  199.                                           huoyan = 10 - huoyan * 10 / 250;
  200.                                           if(menu_1 == 0)
  201.                                           {
  202.                                                         if(temperature >= 99)
  203.                                                                       temperature = 99;
  204.                                                         if(value > 20)
  205.                                                                       value = 0;
  206.                                                         if(huoyan < 2)
  207.                                                         {            
  208.                                                                       smg_i = 4;
  209.                                                                       dis_smg[3]=smg_du[dengji];                  //显示烟物报警等级
  210.                                                                       dis_smg[2]= 0xbf;                          // -                           
  211. ……………………

  212. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

所有资料51hei提供下载:

基于STC89C52的火灾自动报警系统的设计与开发.docx (2.51 MB, 下载次数: 128)




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

使用道具 举报

沙发
ID:758513 发表于 2020-5-22 17:06 | 只看该作者
厉害,俺都看不懂
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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