找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的MQ-2烟雾报警设计论文与源码下载

  [复制链接]
跳转到指定楼层
楼主

摘要

随着现代家庭用火、用电量的增加,家庭烟雾发生的频率越来越高。烟雾报警器也随之被广泛应用于各种场合。
本课题所研究的无线多功能烟雾报警器采用STC89C51为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,以此来实现烟雾报警,智能化提示。

目录
摘要
Abstract
目录
1 绪论
1.1 课题的研究背景
1.2 课题的研究目的与意义
1.3 烟雾报警器的发展与现状
1.4课题的研究内容
2 烟雾报警器的总体方案设计
2.1系统的功能要求
2.2 系统的技术要求
2.3 系统的组成及方案设计
3 系统的硬件设计
3.1 主控电路
3.2 烟雾探测电路的设计
3.2.1 MQ-2介绍
3.2.2 ADC0832介绍
3.3 液晶显示电路设计
3.4 声光报警提示电路
3.4.1 灯光提示电路
3.4.2 声音报警电路
3.5 温度采集电路
3.5.1 DS18B20概述
3.5.2 DS18B20引脚介绍
3.5.3 DS18B20的内部结构
3.5.4 DS18B20的程序流程图
3.6 按键电路
4 系统的软件设计
4.1 软件介绍
4.2 系统程序流程图
5烟雾报警器的测试结果及结论
5.1 调试
5.2 结论
致谢
参考文献
源程序

1 绪论


1.1 课题的研究背景


烟雾作为一种在时空上失去控制的燃烧所引发的灾害,对人类生命财产和社会安全构成了极大的威胁。由此引发的重大安全事故比皆是,所以人类一直也未停止过对它的研究。

烟雾早已成为我国常发性和破坏性以及影响力最强的灾害之一。随着经济和城市建设的快速发展,城市高层、地下建筑以及大型综合性建筑日益增多,烟雾隐患也大大增加,烟雾发生的数量及其造成的损失呈逐年上升趋势。

  在过去的很长一段时间,人类不得不进行专题研究烟雾过程中爆发,截至目前,已形成一个较为成熟的概念。烟雾的发生和发展过程是一个复杂的物理和化学过程,但也与环境很强的相关性。正常情况下,发生火警,伴随着烟雾,温度,光照,信号产生的过程。产生不同的环境和不同的火燃烧成分,烟雾粒度组成,温度分布和光谱的气体成分是不同的,所以火过程中涉及多个物理和化学参数,特点是强大的,一般的骚乱有着本质的不同。基于上述特点,早起的烟雾探测技术应运而生,特别是多的烟雾探测技术被广泛采用在烟雾探测领域,如复合材料的物理参数复合烟气温度探测器,使用不同的带光传感器的复合双波段火焰探测器。

    在我国,随着经济的发展和生活水平的提高,工业与民用建设日趋增多,烟雾发生的可能性也随之大幅提高。另外,现代建筑物中塑料制品和玻璃的大量应用使火场内外部的求援行为困难重重。现代建筑,尤其是在大型酒店,宾馆,商场,图书馆,博物馆,档案馆和办公楼及其他公共场所,对于烟雾报警系统也提出了更高的要求。一旦发生烟雾将很难及时救助,势必要给国家和个人带来不可估量的损失。

基于上述情况,烟雾自动报警技术便应运而生,烟雾自动报警系统是始终警惕烟雾报警和输出联动忠实的哨兵烟雾信号的有力手段,是一种早期预警。


1.2 课题的研究目的与意义

目的:随着现代家庭用火,用电增加,家庭烟雾发生的频率越来越高。家庭烟雾,很容易扑灭不及时,有着缺乏消防设备和在场的人战斗惊慌失措逃离缓慢的不利因素,最终导致的生命和财产的重大损失。消防部门的统计数据显示,所有的烟雾比例中,家庭烟雾占全国烟雾的30%。家庭烟雾的原因是多方面的,可能把我们的注意力,也可能隐藏在我们没有注意到的地方。

综上所述,许多人因不懂家庭安全常识引起烟雾事故,使好端端的幸福家庭眼间毁于一旦,有的导致家破人亡,而且一旦发生居民家庭烟雾,处置不当、报警迟缓,是造成人员伤亡的重要因素。所以说,人们应该积极了解家庭烟雾的主要起因,还有预防烟雾的发生。这就是我们研究声光报警器的目的。

意义:在中国的一些大、中型城市,几乎每一天发生家庭烟雾,所以每一个家庭必须始终关注防火。如果能根据你家的实际情况,提前采取简单的防火措施,有些悲剧是完全可以避免的。声音和视觉的报警,对减少烟雾损失具有现实意义。

一系列悲剧性的损失,由国家从社会各界意识到,声光报警对烟雾的报警的必要性。据调查,在最近的烟雾大部分的房子里还没有安装报警器。因此声光报警,对发生烟雾预防具有重要意义。


1.3 烟雾报警器的发展与现状


近年来,无线烟雾报警系统在国外已被开发,并走向实用。起初,无线烟雾报警系统不仅是价格贵,还必须连接布线,这是只适合一些特殊的地方,检测设备的一部分。今天,几乎所有的电气装置,可以通过无线遥控改变,可广泛应用于各类建筑和场所。美国松柏公司(ITI)成立于1981年,是美国最大的无线报警系统制造商制造,其产品占90%的无线报警器在北美市场的年销售额已接近一亿美元。该公司生产的无线烟雾报警系统还通过了中国的“国家消防电子产品质量监督检验测试中心”的监测,该系统可作为烟雾报警系统,但也可作为一个安全的系统,两者的结合,是一个高科技的无线安全系统。

    烟雾报警系统在中国相对较晚,与发达国家相比, 20世纪70年代末的十年间,中国开始研制生产的烟雾报警系统。 20世纪80年代后,国内各大厂商也大多是模仿国外产品,或引进国外技术生产的,没有真正意义上的核心技术,市场刚刚开始发展。真正的烟雾报警产品的发展也促进了市场的成熟,政府逐步开放的大门,在同一时间,外国公司开始进入中国的防火市场,带来先进的技术在20世纪90年代。此期间,中国生产的烟雾报警产品的企业也得到了快速发展,在一些企业中,技术合作,合资生产,并取得了不菲的成绩,但今天在市场上创造了许多强大的企业,有些技术已接近或赶上国际标准。

1.4课题的研究内容


烟雾报警器,主要检测温度和烟雾,再通过单片机控制相应的报警和驱动负载。通过液晶显示当前的烟雾值和温度值,通过按键设定相应的阀值。

该项目主要是为了完成任务,包括:

⑴硬件部分:包括传感器的选择,显示模块的选择,烟雾信号转换电路的设计,报警驱动电路的设计。

(2)软件部分:包括微处理器控制程序的编制和原理图的绘制。

(3)系统的综合调试与分析:在软硬件完成以后,要对系统进行综合的测试与实验,分析系统的可靠性与实用性,调整系统的不足。












2 烟雾报警器的总体方案设计


本课题主要是实现烟雾报警和烟雾发生时的报警及控制,下面分别对系统功能要求、系统技术要求及系统实现方案总体阐述。


2.1系统的功能要求

本系统的研制主要包括以下几项功能:

(1)火情探测功能:为了提高烟雾报警的准确性和及时性,烟雾报警系统需要使用各种方法进行烟雾探测。在实际使用中,根据不同的防火场所,用户可以选用温度探测法、可燃气体检测法及烟雾探测法等合适的烟雾探测方法,来有效的探测烟雾;

(2)灯光报警功能:当室内烟雾浓度过大、有火情产生、故障等异常情况发生时,报警器要进行灯光报警。当烟雾超过最大设定值时,可以蜂鸣器报警。


2.2 系统的技术要求

在了解这个系统的工作原理以及功能之后,我们就可以基本确定系统的技术要求。系统采用的单片机处理器成本都比较低,可以满足批量生产和各类工程的需求。对于完整的一个系统而言,为提高市场的竞争力,这个系统应符合体积小、功耗低、数传性能可靠和成本低廉等技术要求。具体指标和参数如下:

(1)体积小:探测器的体积要尽可能的小,这样占用的空间才能减少,使用和更换才会方便;

(2)功耗低:系统可以采用三节5号干电池供电或5v电源供电。

(3)可靠性高:由于不确定的电磁干扰可能存在在系统工作环境中,为了保证系统长时间的可靠工作,以及减少误报次数,所以选择多指示灯,指示不同的状态。

2.3 系统的组成及方案设计

本设计主要由烟雾探测传感器电路、单片机、灯光报警电路、负载驱动电路、控制程序和编解码程序等组成。

系统的组成结构如下:














3 系统的硬件设计


总体电路

图3.1

如图3.1所示,上面的图为protel99se所画,下面的图为proteus仿真所画。

实时显示当前的烟雾值和温度值,共有2个报警值(可以通过按键设定),分别是温度的上限和烟雾的上限报警值,当烟雾超过的时候红灯和蜂鸣器声光报警,当温度超过时候黄灯和蜂鸣器声光报警。

3.1 主控电路

STC89C51是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。STC89C51主要功能如表1所示,其DIP封装如图2所示

表1:STC89C51主要功能

主要功能特性
兼容MCS51指令系统
4K可反复擦写Flash ROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能

STC89C52引脚介绍

① 主电源引脚(2根)

VCC(Pin40):电源输入,接+5V电源

GND(Pin20):接地线

②外接晶振引脚(2根)

XTAL1(Pin19):片内振荡电路的输入端

XTAL2(Pin20):片内振荡电路的输出端

③控制引脚(4根)

RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

ALE/PROG(Pin30):地址锁存允许信号

PSEN(Pin29):外部存储器读选通信号

EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。

④可编程输入/输出引脚(32根)

STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。

P0口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7

P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7

P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7

P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.7

作频率35Mhz,6T/12T可选。
图3.2  STC89C51 DIP封装图
最小系统包括单片机及其所需的必要的电源、时钟、复位等部件,能使单片机始终处于正常的运行状态。电源、时钟等电路是使单片机能运行的必备条件,可以将最小系统作为应用系统的核心部分,通过对其进行存储器扩展、A/D扩展等,使单片机完成较复杂的功能。
STC89C51是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。用STC89C52单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,结构如图2-3所示,由于集成度的限制,最小应用系统只能用作一些小型的控制单元。

图3.2单片机最小系统原理框图

(1) 时钟电路
STC89C51单片机的时钟信号通常有两种方式产生:一是内部时钟方式,二是外部时钟方式。内部时钟方式如图2-4所示。在STC89C51单片机内部有一振荡电路,只要在单片机的XTAL1(18)和XTAL2(19)引脚外接石英晶体(简称晶振),就构成了自激振荡器并在单片机内部产生时钟脉冲信号。图中电容C1和C2的作用是稳定频率和快速起振,电容值在5~30pF,典型值为30pF。晶振CYS的振荡频率范围在1.2~12MHz间选择,典型值为12MHz和6MHz。

图3.4 STC89C51内部时钟电路
(2) 复位电路
当在STC89C51单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。
最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充放电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST(9)端与电源Vcc接通而实现的。

图3.5 STC89C51复位电路
(3) STC89C51中断技术概述
中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并作出快速响应、及时处理。这是由片内的中断系统来实现的。当中断请求源发出中断请求时,如果中断请求被允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求。中断服务处理程序处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
图2-6为整个中断响应和处理过程。

              图3.6  中断响应和处理过程
如果单片机没有中断系统,单片机的大量时间可能会浪费在查询是否有服务请求发生的定时查询操作上。采用中断技术完全消除了单片机在查询方式中的等待现象,大大地提高了单片机的工作效率和实时性。

3.2 烟雾探测电路的设计

图3.7 烟雾探测电路

如图3.7所示,在这个电路中,有两个部分,主要是烟雾传感器检测烟雾,将电压信号给ADC0832,模数转换电路将模拟信号转换成数字信号给单片机,单片机再读取相应的数值和处理。

3.2.1 MQ-2介绍

MQ-2型气体传感器用于以氢气为主要成分的城市煤气、天然气、液化石油的测量,而且它抗干扰能力强,水蒸气、烟等干扰气体对它的影响小。

MQ-2型气敏元件具有以下特点:

(1) 采用烧结半导体所形成的敏感烧结体,具有稳定的R (即器件在纯洁空气中的阻抗)阻值,从而保证了长期工作的稳定性。

(2) 单电源供电,其功耗仅0.7W左右。

(3) 对所测试的气体有极高的灵敏度和信噪比。

MQ-2型气敏元件有两种型号。MQ-2A型适用于天然气、城市煤气、石油液化气、丙丁烷及氢气等;MQ-2型适用于烟雾等减光型有害气体。

器件的灵敏度:S=Ro/Rx为10~30。常见为QM系列的S值仅8左右。Rx为器件在丁烷浓度为0.2%时的阻抗。

电路如右图所示:

器件的主要参数如下:

响应时间:Tr≤10s

恢复时间:Tn≤60s

加热电压:V﹢=5+0.2V

加热功率::约0.7W

抗干扰能力:丁烷浓度在0.2%时在湿度小于85%RH,在-10℃~+40℃温度下不会引起误报。                                                                           

工作环境:温度-10℃~+50℃     湿度≤85%RH

下图是元件外形结构图,基座采用耐高温酚醛塑料压制,引脚为镀镍铜丝,上罩采用双层密纹不锈钢网压制,有较高的强度和防爆能力。

MQK-2型元件外形结构图

MQ-2气敏元件的结构和外形如上图所示, 由微型AL2O3陶瓷管、SnO2 敏感层,测量电极和加热器构成的敏感元件固定在塑料或不锈钢制成的腔体内,加热器为气敏元件提供了必要的工作条件。封装好的气敏元件有6只针状管脚,其中4个用于信号取出,2个用于提供加热电流。

上图是MQ-2型元件典型气体浓度测试特性曲线,在丁烷浓度0.6%以下有极高的灵敏度。

上图是MQ-2型元件通电时间特性曲线。可看出,通电后60~90s,元件即进入稳定待测工作状态。

MQ-2的特点和工作参数如下:

特点:

⑴ 广泛的探测范围               

⑵ 高灵敏度/快速响应恢复

⑶ 优异的稳定性/长寿命         

⑷ 简单的驱动电路

3.2.2 ADC0832介绍

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

分辨率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;

芯片接口说明:

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

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

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

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

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

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

· CLK 芯片时钟输入。

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

ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。


3.3 液晶显示电路设计

图3.8 液晶显示电路设计


LCD1602A 是一种工业字符型液晶,能够同时显示16x02 即32个字符。(16列2行)。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。
液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
(1)引脚说明:
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平
R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
(2)1602LCD的RAM地址映射以及标准字库表
LCD1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字符图有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母。
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的(说明:1为高电平,0为低电平)。
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H 。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 。S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示。 C:控制光标的开与关,高电平表示有光标,低电平表示无光标。 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标 。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线。      N:低电平时为单行显示,高电平时双行显示。 F:低电平时显示5X7的点阵字符,高电平时显示5x10的点阵字符 (有些模块是 DL:高电平时为8位总线,低电平时为4位总线)。
指令7:字符发生器RAM地址设置 。
指令8:DDRAM地址设置 。
指令9:读出忙信号和光标地址。 BF为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙,模块就能接收相应的命令或者数据。
指令10:写数据 。
指令11:读数据 。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。
1602 内部显示地址如图3-6所示:
                         图3-6 1602内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H 就可以将光标定位在第二行第 一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H) 。在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。1602 液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下图所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H 中的点阵字符图形显示出来,我们就能看到字母“A”。

液晶显示的原理是利用液晶的物理特性, 通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

3.4 声光报警提示电路

3.4.1 灯光提示电路

图3.9灯光提示电路

LED英文单词的缩写,主要含义:LED = Light Emitting Diode,发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光;它改变了白炽灯钨丝发光与节能灯三基色粉发光的原理,而采用电场发光。据分析,LED的特点非常明显,寿命长、光效高、辐射低与功耗低。作为目前全球最受瞩目的新一代光源,LED因其高亮度、低热量、长寿命、无毒、可回收再利用等优点,被称为是21世纪最有发展前景的绿色照明光源。我国的LED产业起步于20世纪70年代,经过近40年的发展,产品广泛应用于景观照明和普通照明领域,我国已成为世界第一大照明电器生产国和第二大照明电器出口国。近几年来,随着人们对半导体发光材料研究的不断深入,LED制造工艺的不断进步和新材料(氮化物晶体和荧光粉)的开发和应用,各种颜色的超高亮度LED取得了突破性进展,其发光效率提高了近1000倍,色度方面已实现了可见光波段的所有颜色,其中最重要的是超高亮度白光LED的出现,使LED应用领域跨越至高效率照明光源市场成为可能。曾经有人指出,高亮度LED将是人类继爱迪生发明白炽灯泡后,最伟大的发明之一。 本设计利用不同颜色的LED指示不同的烟雾浓度报警。

3.4.2 声音报警电路

图3.10声音报警电路

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 ;蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。1.压电式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。
多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
电磁式蜂鸣器 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互缠绕
蜂鸣器驱动电路一般都包含以下几个部分:一个三极管、一个蜂鸣器、一个限流电阻。
蜂鸣器为发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声,其主要参数是外形尺寸、发声方向、工作电压、工作频率、工作电流、驱动方式(直流/方波)等。这些都可以根据需要来选择。本设计采用有源蜂鸣器。
三极管Q1起开关作用,其基极的低电平使三极管饱和导通,使蜂鸣器发声;而基极高电平则使三极管关闭,蜂鸣器停止发声。

3.6 按键电路

本设计采用按键接低的方式来读取按键,单片机初始时,因为为高电平,当按键按下的时候,会给单片机一个低电平,单片机对信号进行处理

单片机键盘有独立键盘和矩阵式键盘两种:独立键盘每一个I/O 口上只接一个按键,按键的另一端接电源或接地(一般接地),这种接法程序比较简单且系统更加稳定;而矩阵式键盘式接法程序比较复杂,但是占用的I/O少。根据本设计的需要这里选用了独立式键盘接法。

独立式键盘的实现方法是利用单片机I/O口读取口的电平高低来判断是否有键按下。将常开按键的一端接地,另一端接一个I/O 口,程序开始时将此I/O口置于高电平,平时无键按下时I/O口保护高电平。当有键按下时,此I/O 口与地短路迫使I/O 口为低电平。按键释放后,单片机内部的上拉电阻使I/O口仍然保持高电平。我们所要做的就是在程序中查寻此I/O口的电平状态就可以了解我们是否有按键动作了。

在用单片机对键盘处理的时候涉及到了一个重要的过程,那就是键盘的去抖动。这里说的抖动是机械的抖动,是当键盘在未按到按下的临界区产生的电平不稳定正常现象,并不是我们在按键时通过注意可以避免的。这种抖动一般10~200毫秒之间,这种不稳定电平的抖动时间对于人来说太快了,而对于时钟是微秒的单片机而言则是慢长的。硬件去抖动就是用部分电路对抖动部分加之处理,软件去抖动不是去掉抖动,而是避抖动部分的时间,等键盘稳定了再对其处理。所以这里选择了软件去抖动,实现法是先查寻按键当有低电平出现时立即延时10~200毫秒以避开抖动(经典值为20毫秒),延时结束后再读一次I/O 口的值,这一次的值如果为1 表示低电平的时间不到10~200 毫秒,视为干扰信号。当读出的值是0时则表示有按键按下,调用相应的处理程序。硬件电路如图3.12所示:

图3.15 按键电路


4 系统的软件设计


4.1 软件介绍

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。   Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。Keil_c软件界面如图

图4.1 Keil_c软件界面

Protel99SE是PORTEL公司在80年代末推出的EDA软件。Protel99SE是应用于Windows9X/2000/NT操作系统下的EDA设计软件,采用设计库管理模式,可以网设计,具有很强的数据交换能力和开放性及3D模拟功能,是一个32位的设计软件,可以完成电路原理图设计,印制电路板设计和可编程逻辑器件设计等工作,可以设计32个信号层,16个电源--地层和16个机加工层。

Protel99SE软件的特点:

  • 可生成30多种格式的电气连接网络表;
  • 强大的全局编辑功能;
  • 在原理图中选择一级器件,PCB中同样的器件也将被选中;
  • 同时运行原理图和PCB,在打开的原理图和PCB图间允许双向交叉查找元器件、引脚、网络
  • 既可以进行正向注释元器件标号(由原理图到PCB),也可以进行反向注释(由PCB到原理图),以保持电气原理图和PCB在设计上的一致性;
  • 满足国际化设计要求(包括国标标题栏输出,GB4728国标库); * 方便易用的数模混合仿真(兼容SPICE 3f5);
  • 支持用CUPL语言和原理图设计PLD,生成标准的JED下载文件; * PCB可设计32个信号层,16个电源-地层和16个机加工层;
  • 强大的“规则驱动”设计环境,符合在线的和批处理的设计规则检查;
  • 智能覆铜功能,覆铀可以自动重铺;
  • 提供大量的工业化标准电路板做为设计模版;

图17 Prtel99SE软件界面

Protel99SE的工作界面是一种标准的Windows界面,如图所示,包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。

4.2 系统程序流程图(见附件)

5烟雾报警器的测试结果及结论

5.1 调试

调试过程中首先要检测的就是硬件电路的设计原理是否正确、能否达到预期效果以及实现方法是否简便等等;其次在焊接好难有线电路之后,认真检查电路的焊接情况。这次采用的是分块调试的方法,烟雾探测电路,控制电路以及单片机控制电路进行调试。在对每个模块的进行调试过程中又采用了由局部到整体,由简单到复杂的调试方法,最后再将各个模块总和成一个整体。

在调试过程中遇到的问题有:

  •                 由于在焊电路之前没有认真的查看STC89C51的管脚,使得管脚的顺序全部焊错了,最后只好重新买器件重焊;
  •                 烟雾值一直显示很高,经过查阅资料和换元件测试发现,烟雾传感器初次使用得通电几小时以上才可以正常使用,要做老化试验。
  •                 在解码程序的编写过程中,随着理解的深入也作了相应的修改。

5.2 结论

烟雾为一种由于燃烧失去控制所引发的灾害,对人类的生命财产和社会安全稳定构成了极大的威胁。由此引发的重大安全事故比比皆是,所以人类一直也未停止过对烟雾的研究。

本文在参考了国内外大量资料的基础上,针对传统的一系列烟雾报警探测器存在的问题,合理地提出了烟雾报警器的设计方法。极大地提高了产品的实用性和市场竞争力。

本课题中设计的烟雾报警探测器由传感器电路与无线通信电路两大部分构成。控制处理器是以管脚资源丰富的STC89C51为核心,实现对探测器写入信号和对信号进行编译等人机交互功能。应用程序以C语言编写,充分利用芯片的内部资源,提高了代码执行效率,减小了代码的容量。由于该探测器具有体积小、功耗低、安装调试简单、可靠性高等优点,因此,该烟雾探测器有着良好的市场前景。

但是,由于本人在各方面的知识不够全面,再加上时间紧迫以及实验条件的限制,该报警器还有较多需要提高的地方。比如:添加感应温度的传感器,通过多方面判断烟雾。

致谢

这次毕业设计得到了很多人的帮助,其中**老师对我的关心和支持尤为重要,每次遇到难题,我首先想到的就是向金老师寻求帮助。另外,他严谨的作风使我的论文即使在谨小细微处也给予了纠正,让我的论文无论是结构还是内容变得更加公整、紧凑,感谢金老师对我的悉心指导。

感谢校方给予我这样一次机会,能够独立地完成这样一个设计,作为检验这些年来学习的成果,在这个过程当中,学校给予我们各种方便,使我们在即将离校的最后一段时间里,能够更多学习一些实践应用知识,增强了我们实践操作和动手应用能力,提高了独立思考的能力。再一次对我的母校表示感谢。

感谢在整个毕业设计期间和我密切合作的同学,和曾经在各个方面给予过我帮助的伙伴们,正是因为有了你们的帮助,才让我不仅学到了本次课题所涉及的新知识,更让我感觉到了知识以外的东西,那就是团结的力量。


单片机源程序如下:


  1. <font color="rgb(0, 0, 0)">#include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. #include <intrins.h>
  5. //#include "lcd1602.h"

  6. sbit CS=P1^3;                //CS定义为P2口的第4位脚,连接ADC0832CS脚
  7. sbit SCL=P1^0;                //SCL定义为P2口的第3位脚,连接ADC0832SCL脚
  8. sbit DO=P1^1;                //DO定义为P2口的第4位脚,连接ADC0832DO脚

  9. sbit beep = P2^0;   //蜂鸣器IO口定义
  10. long dengji,s_dengji = 50;     //浓度等级


  11. bit flag_300ms ;
  12. uchar key_can;                 //按键值的变量
  13. uchar menu_1;        //菜单设计的变量
  14. uchar flag_clock;

  15. //这三个引脚参考资料
  16. sbit rs=P1^2;         //1602数据/命令选择引脚 H:数据              L:命令
  17. //sbit rw=P2^6;         //1602读写引脚                 H:数据寄存器          L:指令寄存器
  18. sbit e =P1^4;         //1602使能引脚          下降沿触发
  19. uchar code table_num[]="0123456789abcdefg";

  20. /********************************************************************
  21. * 名称 : delay_uint()
  22. * 功能 : 小延时。
  23. * 输入 : 无
  24. * 输出 : 无
  25. ***********************************************************************/
  26. void delay_uint(uint q)
  27. {
  28.         while(q--);
  29. }

  30. /********************************************************************
  31. * 名称 : write_com(uchar com)
  32. * 功能 : 1602命令函数
  33. * 输入 : 输入的命令值
  34. * 输出 : 无
  35. ***********************************************************************/
  36. void write_com(uchar com)
  37. {
  38.         e=0;
  39.         rs=0;
  40. //        rw=0;
  41.         P0=com;
  42.         delay_uint(3);
  43.         e=1;
  44.         delay_uint(25);
  45.         e=0;
  46. }

  47. /********************************************************************
  48. * 名称 : write_data(uchar dat)
  49. * 功能 : 1602写数据函数
  50. * 输入 : 需要写入1602的数据
  51. * 输出 : 无
  52. ***********************************************************************/
  53. void write_data(uchar dat)
  54. {
  55.         e=0;
  56.         rs=1;
  57. //        rw=0;
  58.         P0=dat;
  59.         delay_uint(3);
  60.         e=1;
  61.         delay_uint(25);
  62.         e=0;        
  63. }

  64. /********************************************************************
  65. * 名称 : write_sfm2(uchar hang,uchar add,uchar date)
  66. * 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示"23" ,调用该函数如下
  67.                   write_sfm1(1,5,23)
  68. * 输入 : 行,列,需要输入1602的数据
  69. * 输出 : 无
  70. ***********************************************************************/
  71. void write_sfm2(uchar hang,uchar add,uint date)
  72. {
  73.         if(hang==1)   
  74.                 write_com(0x80+add);
  75.         else
  76.                 write_com(0x80+0x40+add);
  77.         if(date >= 100)
  78.         {
  79.                 write_data(0x30+date/100%10);
  80.                 write_data(0x30+date/10%10);
  81.         }
  82.         else
  83.         {
  84.                 write_data(' ');
  85.                 write_data(0x30+date/10%10);
  86.         }
  87.         write_data(0x30+date%10);        
  88. }

  89. /********************************************************************
  90. * 名称 : write_string(uchar hang,uchar add,uchar *p)
  91. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  92.                   write_string(1,5,"ab cd ef;")
  93. * 输入 : 行,列,需要输入1602的数据
  94. * 输出 : 无
  95. ***********************************************************************/
  96. void write_string(uchar hang,uchar add,uchar *p)
  97. {
  98.         if(hang==1)   
  99.                 write_com(0x80+add);
  100.         else
  101.                 write_com(0x80+0x40+add);
  102.                 while(1)
  103.                 {
  104.                         if(*p == '\0')  break;
  105.                         write_data(*p);
  106.                         p++;
  107.                 }        
  108. }

  109. /********************************************************************
  110. * 名称 : clear_1602()
  111. * 功能 : 清除1602显示
  112. * 输入 : 无
  113. * 输出 : 无
  114. ***********************************************************************/
  115. void clear_1602()
  116. {
  117.         write_string(1,0,"                ");
  118.         write_string(2,0,"                ");
  119. }

  120. /***********************lcd1602上显示特定的字符************************/
  121. void write_zifu(uchar hang,uchar add,uchar date)
  122. {
  123.         if(hang==1)   
  124.                 write_com(0x80+add);
  125.         else
  126.                 write_com(0x80+0x40+add);
  127.         write_data(date);        
  128. }


  129. /********************************************************************
  130. * 名称 : init_1602()
  131. * 功能 : 初始化1602液晶
  132. * 输入 : 无
  133. * 输出 : 无
  134. ***********************************************************************/
  135. void init_1602()
  136. {
  137.         write_com(0x38);
  138.         write_com(0x0c);
  139.         write_com(0x06);
  140.         write_string(1,0," thickne: 00    ");
  141.         write_string(2,0," Thresho: 80    ");
  142.         write_sfm2(2,9,s_dengji);                   //显示浓度等级
  143. }

  144. uchar a_a;

  145. /********STC89C51扇区分布*******
  146. 第一扇区:1000H--11FF
  147. 第二扇区:1200H--13FF
  148. 第三扇区:1400H--15FF
  149. 第四扇区:1600H--17FF
  150. 第五扇区:1800H--19FF
  151. 第六扇区:1A00H--1BFF
  152. 第七扇区:1C00H--1DFF
  153. 第八扇区:1E00H--1FFF
  154. *****************/

  155. /********STC89C52扇区分布*******
  156. 第一扇区:2000H--21FF
  157. 第二扇区:2200H--23FF
  158. 第三扇区:2400H--25FF
  159. 第四扇区:2600H--27FF
  160. 第五扇区:2800H--29FF
  161. 第六扇区:2A00H--2BFF
  162. 第七扇区:2C00H--2DFF
  163. 第八扇区:2E00H--2FFF
  164. *****************/


  165. #define RdCommand 0x01 //定义ISP的操作命令
  166. #define PrgCommand 0x02
  167. #define EraseCommand 0x03
  168. #define Error 1
  169. #define Ok 0
  170. #define WaitTime 0x01 //定义CPU的等待时间
  171. sfr ISP_DATA=0xe2;  //寄存器申明
  172. sfr ISP_ADDRH=0xe3;
  173. sfr ISP_ADDRL=0xe4;
  174. sfr ISP_CMD=0xe5;
  175. sfr ISP_TRIG=0xe6;
  176. sfr ISP_CONTR=0xe7;

  177. /* ================ 打开 ISP,IAP 功能 ================= */
  178. void ISP_IAP_enable(void)
  179. {
  180.          EA = 0;       /* 关中断   */
  181.          ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
  182.          ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
  183.          ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
  184. }
  185. /* =============== 关闭 ISP,IAP 功能 ================== */
  186. void ISP_IAP_disable(void)
  187. {
  188.          ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
  189.          ISP_TRIG = 0x00;
  190.          EA   =   1;   /* 开中断 */
  191. }
  192. /* ================ 公用的触发代码 ==================== */
  193. void ISPgoon(void)
  194. {
  195.          ISP_IAP_enable();   /* 打开 ISP,IAP 功能 */
  196.          ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1 */
  197.          ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
  198.          _nop_();
  199. }
  200. /* ==================== 字节读 ======================== */
  201. unsigned char byte_read(unsigned int byte_addr)
  202. {
  203.         EA = 0;
  204.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */
  205.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  206.          ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
  207.          ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
  208.          ISPgoon();       /* 触发执行  */
  209.          ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
  210.          EA  = 1;
  211.          return (ISP_DATA);    /* 返回读到的数据 */
  212. }
  213. /* ================== 扇区擦除 ======================== */
  214. void SectorErase(unsigned int sector_addr)
  215. {
  216.          unsigned int iSectorAddr;
  217.          iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
  218.          ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
  219.          ISP_ADDRL = 0x00;
  220.          ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
  221.          ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
  222.          ISPgoon();       /* 触发执行  */
  223.          ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
  224. }
  225. /* ==================== 字节写 ======================== */
  226. void byte_write(unsigned int byte_addr, unsigned char original_data)
  227. {
  228.          EA  = 0;
  229. //         SectorErase(byte_addr);
  230.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
  231.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  232.          ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
  233.          ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 */
  234.          ISP_DATA = original_data;   /* 写入数据准备 */
  235.          ISPgoon();       /* 触发执行  */
  236.          ISP_IAP_disable();     /* 关闭IAP功能 */
  237.          EA =1;
  238. }


  239. /***********************1ms延时函数*****************************/
  240. void delay_1ms(uint q)
  241. {
  242.         uint i,j;
  243.         for(i=0;i<q;i++)
  244.                 for(j=0;j<120;j++);
  245. }


  246. /******************把数据保存到单片机内部eeprom中******************/
  247. void write_eeprom()
  248. {
  249.         SectorErase(0x2000);
  250. //        byte_write(0x2000, s_dengji);
  251.         byte_write(0x2001, s_dengji);
  252.         byte_write(0x2060, a_a);        
  253. }

  254. /******************把数据从单片机内部eeprom中读出来*****************/
  255. void read_eeprom()
  256. {
  257. //        s_dengji   = byte_read(0x2000);
  258.         s_dengji = byte_read(0x2001);
  259.         a_a      = byte_read(0x2060);
  260. }

  261. /**************开机自检eeprom初始化*****************/
  262. void init_eeprom()
  263. {
  264.         read_eeprom();                //先读
  265.         if(a_a != 2)                //新的单片机初始单片机内问eeprom
  266.         {
  267.                 s_dengji = 80;
  268.                 a_a = 2;
  269.                 write_eeprom();
  270.         }        
  271. }

  272. /***********读数模转换数据********************************************************/        
  273. //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
  274.                                                 //  1  0  0 通道
  275.                                                 //  1  1  1 通道
  276. unsigned char ad0832read(bit SGL,bit ODD)
  277. {
  278.         unsigned char i=0,value=0,value1=0;               
  279.                 SCL=0;
  280.                 DO=1;
  281.                 CS=0;                //开始
  282.                 SCL=1;                //第一个上升沿        
  283.                 SCL=0;
  284.                 DO=SGL;
  285.                 SCL=1;          //第二个上升沿
  286.                 SCL=0;
  287.                 DO=ODD;
  288.                 SCL=1;            //第三个上升沿
  289.                 SCL=0;            //第三个下降沿
  290.                 DO=1;
  291.                 for(i=0;i<8;i++)
  292.                 {
  293.                         SCL=1;
  294.                         SCL=0; //开始从第四个下降沿接收数据
  295.                         value<<=1;
  296.                         if(DO)
  297.                                 value++;                                                
  298.                 }
  299.                 for(i=0;i<8;i++)
  300.                 {                        //接收校验数据
  301.                         value1>>=1;
  302.                         if(DO)
  303.                                 value1+=0x80;
  304.                         SCL=1;
  305.                         SCL=0;
  306.                 }
  307.                 CS=1;
  308.                 SCL=1;        
  309.                 if(value==value1)                                //与校验数据比较,正确就返回数据,否则返回0        
  310.                         return value;
  311.         return 0;
  312. }


  313. /*************定时器0初始化程序***************/
  314. void time_init()         
  315. {
  316.         EA   = 1;                   //开总中断
  317.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  318.         ET0  = 1;                  //开定时器0中断
  319.         TR0  = 1;                  //允许定时器0定时
  320. }

  321. /****************按键处理显示函数***************/
  322. void key_with()
  323. {
  324.         if(key_can == 1)
  325.         {
  326.                 s_dengji ++ ;                    //浓度设置数加1
  327.                 if(s_dengji > 999)
  328.                         s_dengji = 999;
  329.         }
  330.         if(key_can == 2)
  331.         {
  332.                         s_dengji -= 1;        //浓度设置数减1
  333.                 if(s_dengji <= 1)
  334.                         s_dengji = 1 ;
  335.         }
  336.         write_sfm2(2,9,s_dengji);                   //显示浓度等级
  337.         write_eeprom();       //保存数据                                       
  338.                         
  339. }  

  340. /********************独立按键程序*****************/
  341. uchar key_can;         //按键值
  342. sbit key1=P1^5;
  343. sbit key2=P3^3;
  344. void key()         //独立按键程序
  345. {
  346.         static uchar key_new;
  347.         key_can = 20;                   //按键值还原
  348.         key1 = 1;
  349.         key2 = 1;
  350.         if((key1==0)||(key2==0))                //按键按下
  351.         {
  352.                 delay_1ms(1);                     //按键消抖动
  353.                 if(((key1==0)||(key2==0)) && (key_new == 1))
  354.                 {                                                //确认是按键按下
  355.                         key_new = 0;
  356.                         if(key1==0) key_can = 1;
  357.                         if(key2==0) key_can = 2;
  358.                 }                        
  359.         }
  360.         else
  361.                 key_new = 1;        
  362. }

  363. /****************报警函数***************/
  364. void clock_h_l()
  365. {
  366.         static uchar value;
  367.         if(dengji >= s_dengji )                //报警
  368.         {
  369.                 value ++;
  370.                 if(value >= 2)
  371.                 {
  372.                         value = 10;
  373.                         beep = ~beep;          //蜂鸣器报警
  374.                 }
  375.         }else
  376.         {
  377.                 if(dengji < s_dengji)          //取消报警
  378.                 {
  379.                         value = 0;
  380.                         beep = 1;
  381.                 }        
  382.         }
  383. }
  384. ……………………

  385. …………限于本文篇幅 余下代码请从51黑下载附件…………
  386. </font>
复制代码



所有资料51hei提供下载:

基于51的燃气报警.zip (1.69 MB, 下载次数: 352)




评分

参与人数 3黑币 +67 收起 理由
a464066411 + 12 很给力!
任来疯 + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:323384 发表于 2018-11-23 21:36 | 只看该作者
真的很厉害
回复

使用道具 举报

板凳
ID:323384 发表于 2018-11-23 21:36 | 只看该作者
非常棒,向大佬学习                        
回复

使用道具 举报

地板
ID:297670 发表于 2018-11-28 21:44 | 只看该作者
很不错,就是没有protels自己仿真试下!
回复

使用道具 举报

5#
ID:431770 发表于 2018-12-23 12:48 | 只看该作者
这里面有PCB原理图吗?
回复

使用道具 举报

6#
ID:323384 发表于 2019-1-13 10:53 | 只看该作者
制板不行啊,调试不出来
回复

使用道具 举报

7#
ID:469250 发表于 2019-1-27 13:32 | 只看该作者
很好用,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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