基于单片机的防火报警系统_DS18B20测温+火焰传感器+HC-05发送安卓显示+LCD1602显示等等

摘要

随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。防火报警器也随之被广泛应用于各种场合。
本文章所研究的无线多功能防火报警系统采用STC12C5A60S2为核心控制器,利用火焰传感器YL-38、蓝牙模块HC-05、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环境中有火焰或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,及发送到安卓手机,以此来实现防火报警,智能化提示。
关键词:火焰传感器;防火报警;单片机;DS18B20

Abstract

With the increase in fire and electricity consumption in modern homes, the frequency of home fires is increasing. The fire alarm is also widely used in various occasions.
The wireless multi-function fire alarm system studied in this article uses STC12C5A60S2 as the core controller, and uses flame sensor YL-38, Bluetooth module HC-05, DS18B20 temperature sensor to achieve basic functions. Through these sensors and chips, the system will send out corresponding light alarm signals and sound alarm signals when the flame or temperature changes in the environment, and send them to the Android mobile phone, so as to realize the fire alarm and intelligent prompt.

Key words: flame sensor; fire alarm; Single chip microcomputer;DS18B20
目录
摘要 1
Abstract 2
1 绪论 4
1.1 相关背景 4
1.2 目的与意义 4
1.3研究内容 5
2 防火报警的总体方案设计 5
2.1系统的功能要求 5
2.2 系统的技术要求 6
2.3 系统的组成及方案设计 6
3 系统的硬件设计 6
3.1 主控电路 7
3.2 火焰传感器电路的设计 10
3.3 温度检测电路的设计 11
3.4 LCD1602显示电路设计 13
3.5 报警电路设计 15
3.6 HC-05蓝牙模块设计 16
4 实训的软件设计 17
4.1 软件介绍 17
4.2 实训程序流程图 18
5 防火报警的调试及结论 18
5.1 调试 18
5.2 结论 19
致谢 20
参考文献 21
附录 24

1 绪论

1.1 相关背景
火灾作为一种在时空上失去控制的燃烧所引发的灾害,对人类生命财产和社会安全构成了极大的威胁。由此引发的重大安全事故比皆是,所以人类一直也未停止过对它的研究。
火灾早已成为我国常发性和破坏性以及影响力最强的灾害之一。随着经济和城市建设的快速发展,城市高层、地下建筑以及大型综合性建筑日益增多,火灾隐患也大大增加,火灾发生的数量及其造成的损失呈逐年上升趋势。
在过去的很长一段时间,人类不得不进行专题研究火灾过程中爆发,截至目前,已形成一个较为成熟的概念。火灾的发生和发展过程是一个复杂的物理和化学过程,但也与环境很强的相关性。正常情况下,发生火警,伴随着温度,光照等信号产生的过程。产生不同的环境和不同的光强,温度分布是不同的,所以火燃烧过程中涉及多个物理和化学参数,特点是强大的,一般的骚乱有着本质的不同。基于上述特点,早起的火灾探测技术应运而生,特别是多的火灾探测技术被广泛采用在火灾探测领域,如复合材料的物理参数复合温度探测器,使用不同的带光传感器的复合双波段火焰探测器。
在我国,随着经济的发展和生活水平的提高,工业与民用建设日趋增多,火灾发生的可能性也随之大幅提高。另外,现代建筑物中塑料制品和玻璃的大量应用使火场内外部的求援行为困难重重。现代建筑,尤其是在大型酒店,宾馆,商场,图书馆,博物馆,档案馆和办公楼及其他公共场所,对于火灾报警系统也提出了更高的要求。一旦发生火灾将很难及时救助,势必要给国家和个人带来不可估量的损失。
基于上述情况,防火报警技术便应运而生,防火报警系统是始终警惕火灾报警和输出联动忠实的哨兵火灾信号的有力手段,是一种早期预警。
1.2 目的与意义
目的:随着现代家庭用火,用电增加,家庭火灾发生的频率越来越高。家庭火灾,很容易扑灭不及时,有着缺乏消防设备和在场的人战斗惊慌失措逃离缓慢的不利因素,最终导致的生命和财产的重大损失。消防部门的统计数据显示,所有的火灾比例中,家庭火灾占全国火灾的30%。家庭火灾的原因是多方面的,可能把我们的注意力,也可能隐藏在我们没有注意到的地方。
意义:在中国的一些大、中型城市,几乎每一天发生家庭火灾,所以每一个家庭必须始终关注防火。如果能根据你家的实际情况,提前采取简单的防火措施,有些悲剧是完全可以避免的。声音和视觉的报警,对减少火灾损失具有现实意义。
1.3研究内容
基于安卓的防火报警系统,主要检测温度和火焰,再通过单片机控制相应的报警和驱动负载。通过液晶显示当前的是否有火焰和温度值,通过LED和蜂鸣器做相应的提示,并通过蓝牙串口发送到app显示。
该项目主要是为了完成任务,包括:
(1)硬件部分:包括传感器的选择,显示模块的选择,温度转换电路的设计,火焰感应电路的设计。
(2)软件部分:包括微处理器控制程序的编制和原理图的绘制。
(3)系统的综合调试与分析:在软硬件完成以后,要对系统进行综合的测试与实验,分析系统的可靠性与实用性,调整系统的不足。

2 防火报警的总体方案设计
本题目主要是实现火焰报警和火灾发生时的报警及温度控制,下面分别对系统功能要求、系统技术要求及系统实现方案总体阐述。
2.1系统的功能要求
本系统的研制主要包括以下几项功能:
(1)火情探测功能:为了提高火灾报警的准确性和及时性,火灾报警系统需要使用各种方法进行火灾探测。在实际使用中,根据不同的防火场所,用户可以选用温度探测法、可燃气体检测法及光照探测法等合适的火灾探测方法,来有效的探测火灾;
(2)温度报警功能:当室内温度过大、有火情产生、故障等异常情况发生时,报警器要进行灯光报警。当温度超过最大设定值时,可以蜂鸣器报警。
2.2 系统的技术要求
在了解这个系统的工作原理以及功能之后,我们就可以基本确定系统的技术要求。系统采用的单片机处理器成本都比较低,可以满足批量生产和各类工程的需求。对于完整的一个系统而言,为提高市场的竞争力,这个系统应符合体积小、功耗低、数传性能可靠和成本低廉等技术要求。具体指标和参数如下:
(1)体积小:探测器的体积要尽可能的小,这样占用的空间才能减少,使用和更换才会方便;
(2)功耗低:系统可以采用三节5号干电池供电或5v电源供电。
(3)可靠性高:由于不确定的电磁干扰可能存在在系统工作环境中,为了保证系统长时间的可靠工作,以及减少误报次数,所以选择多指示灯,指示不同的状态。
2.3 系统的组成及方案设计
本设计主要由火焰传感器电路、单片机、灯光报警电路、负载驱动电路、温度检测电路、控制程序和编解码程序等组成。
系统的组成结构如下:

图 2. 1
3 系统的硬件设计
原理图

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

表3.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 单片机DIP封装图

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

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

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

图 3. 5 复位电路图

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

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

图 3. 7 火焰传感器
如图3.7所示,通电之后,把数据口接到单片机,单片机判断火焰传感器的数据传输电平高低来实现对火焰的感应。
3.2.1 火焰传感器的介绍
1、可以检测火焰或者波长在760纳米心1100纳米范围内的光源;
2、探测角度60度左右,对火焰光谱特别灵敏3灵敏度可调(图中蓝色数字电位器调节);
3、对火焰的探测距离:跟灵敏度和火焰强度有关,一般1m以内适用(以打火机火焰测试,半米内能够触发传感器);
4、工作电压3.3V-5V;
5、输出形式:
a模拟量电压输出
b数字开关量输出(0和1)。
3.2.2 火感原理

图 3. 8 火感原理图
火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器,中央处理器根据信号的变化做出相应的程序处理。
3.3 温度检测电路的设计

图 3. 9 DS18B20
3.3.1 DS18B20概述
美国DALLAS公司生产的 DS18B20可组网数字温度传感器芯片外加不锈钢保护管封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。有独特的单线接口方式,DS1820在与微处理器连接时仅需要一条口线即可实现微处理器与DS1820的双向通讯;其测温范围 -55℃~+125℃,固有测温分辨率0.5℃;支持多点组网功能;多个DS1820可以并联在唯一的三线上,实现多点测温;工作电源为3~5V/DC;在使用中不需要任何外围元件。
DS18B20的性能特点如下:
(1) 采用DALLAS公司独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;
(2)在使用中不需要任何外围元件;
(3)可用数据线供电,供电电压范围:+3.0V~+5.5V;
(4)测温范围:-55~+125℃。固有测温分辨率为0.5℃。当在-10℃~+85℃范围内,可确保测量误差不超过0.5℃,在-55~+125℃范围内,测量误差也不超过2℃;
(5)通过编程可实现9~12位的数字读数方式;
(6)支持多点的组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温
(7)负压特性,即具有电源反接保护电路。当电源电压的极性反接时,能保护DS18B20不会因发热而烧毁,但此时芯片无法正常工作;
(8)DS18B20的转换速率比较高,进行9位的温度值转换只需93.75ms;
(9)适配各种单片机或系统;
(10)内含64位激光修正的只读存储ROM,扣除8位产品系列号和8位循环冗余校验码(CRC)之后,产品序号占48位。出厂前产品序号存入其ROM中。在构成大型温控系统时,允许在单线总线上挂接多片DS18B20。
3.3.2 DS18B20实现流程图

3.4 LCD1602显示电路设计

图 3. 10 LCD显示电路
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:读数据 。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。

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

图 3. 12 蜂鸣器报警电路

图 3. 13 LED报警电路
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。三极管Q1起开关作用,其基极的低电平使三极管饱和导通,使蜂鸣器发声;而基极高电平则使三极管关闭,蜂鸣器停止发声。
LED英文单词的缩写,主要含义:LED = Light Emitting Diode,发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光;它改变了白炽灯钨丝发光与节能灯三基色粉发光的原理,而采用电场发光。据分析,LED的特点非常明显,寿命长、光效高、辐射低与功耗低。
本次实训通过这两个模块实现报警功能。
3.6 HC-05蓝牙模块设计

图 3. 14 蓝牙模块
基本实现过程概述,用USB转TTL的CH340模块连接HC-05,通过电脑配置波特率、从机模式、蓝牙连接密码、用户名称等。将配置好的HC-05连接单片机,TXD与RXD跟单片机的交叉相连,实现通信。再由安卓手机蓝牙配对,实现实时防火报警功能。
3.6.1 HC-05介绍
ATK-HC05V1l是一款高性能的主从一体蓝牙串口模块,可以同各种带蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP等智能终端配对,该模块支持非常宽的波特率范围:4800~-1382400,并且模块兼容5V或3.3V单片机系统。
若使用HC-05与手机配对通信,需进行以下设置:
(1)、AT+NAME=
(2)、AT+CMODE=1
(3)、AT+UART=9600,0,0
(4)、AT+PSWD=<1234>
经过配置,即可实现蓝牙模块与单片机之间的通信。便于实时监控温度、火情等,从而实现基于安卓的防火报警。
3.6.2 HC-05与手机通信
经配置好的内容,如下图

图 3. 15 HC-05配置
经上图的相关配置,用手机安卓串口助手,实现实时通信

图 3. 16 手机显示数据

4 实训的软件设计
4.1 软件介绍
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。KeilC51如下如所示

图 4. 1 keilC51界面
4.2 实训程序流程图

5 防火报警的调试及结论
5.1 调试
首先,检验程序与电路的相关接口是否相符,电路是否能实现预期的效果,不能实现的原因是什么等等。期间,所遇到的最大的难题就是DS18B20温度的获取及LCD1602的显示问题。结果是没有添加中断,使得内存出现混乱的缘故。除此之外也没什么问题,起初得到题目的时候,先等待所需的元器件。设计思路就是,把各个模块都分别实现,然后进行整体的整合。我主要负责这个,原理图跟流程图由另外两个同学完成。我则负责补充。
5.2 结论
本实训中设计的防火报警由传感器电路与无线通信电路两大部分构成。控制处理器是以管脚资源丰富的STC12C5A60S2为核心,实现对探测器写入信号和对信号进行编译等人机交互功能。应用程序以C语言编写,充分利用芯片的内部资源,提高了代码执行效率,减小了代码的容量。但是,由于本人在各方面的知识不够全面,再加上时间紧迫以及实验条件的限制,该报警器还有较多需要提高的地方。比如:自行调节报警值,烟雾传感探测,蓝牙的局限性等。作品是不断完善的,想要做得更好,就应该根据不同的场景设计不同模块的功能,对防火报警进行更好的监控,防患于未然。
致谢

这次毕业设计得到了很多人的帮助,其中**老师对我的关心和支持尤为重要,每次遇到难题,我首先就是向老师寻求帮助。另外,她细心的指导使我在完成作品的路上走得更好。
感谢在整个实训设计期间和我密切合作的同学,和曾经在各个方面给予过我帮助的伙伴们,正是因为有了你们的帮助,才让我不仅学到了本次实训所涉及的新知识,更让我感觉到了知识以外的东西,那就是团结的力量。

参考文献

[1]陈权昌,李兴富.单片机原理及应用[M].广州:华南理工大学出版社,2007.8
[2]李庆亮.C语言程序设计实用教程[M].北京:机械工业出版社,2005.3
[3]杨志忠.数字电子技术[M].北京:高等教育出版社,2003.12.
[4]及力.Protel 99 SE原理图与PCB设计教程[M].北京:电子工业出版社,2007.8.
[5]徐江海.单片机实用教程[M].北京:机械工业出版社,2006.12
[6]胡宴如.模拟电子技术[M].北京:高等教育出版社,2008.6
[7] 刘宁.单片机多功能时钟的设计[M].浙江:浙江海洋学院,2009.
[8] 汪文,陈林.单片机原理及应用[M].湖北:华中科技大学出版社,2007.
[9] 康华光.电子技术基础数字部分[M].北京:高等教育出版社,2008.

附录:
实物图

代码:
//******************************************************************//
// main.c的代码
//******************************************************************//
#include
#include “Lcd1602.h”
#include “config.h”
#include “Time.h”
#include “uart.h”
bit flag500ms = 0;
unsigned char str[30];

void InitTimer1(void)
{
TMOD&= 0x0F;
TMOD|= 0x10;
TH1 = 0xD4;
TL1 = 0xCD;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void Sys_Init()
{
InitTimer1();
InitLcd1602();
Uart1Init(0,1,220);

}
void main(void)
{
EA=1;
Sys_Init();
while(1)
{
if(flag500ms==1)
{
flag500ms=0;
fireAction();
refreshTemp();
}
}
}
void InterruptTimer1() interrupt 3
{
static unsigned int cnt=0;
TL1=0X67;
TH1=0XFC;
cnt++;
​ if(cnt>=500)
​ {
​ flag500ms=1;
​ cnt=0;//
​ }
}

//******************************************************************//
// Time.c的代码
//******************************************************************//
#include “time.h”
#include
#include “Lcd1602.h”
#include “config.h”
#include “ad.h”
#include “time.h”
#include
#include “uart.h”
#include “Hc05.h”
extern unsigned char str[];
sbit Fire_P=P0^0;
sbit LED1=P1^3;
sbit LED2=P1^5;
sbit LED3=P1^7;
sbit BEEP=P3^6;

void delay_Nms(unsigned int Ncount)
{
unsigned char a,b;
Ncount=Ncount2;
while(Ncount–)
{
for(b=4;b>0;b–)
for(a=79;a>0;a–);
}
}
void fireAction(void)
{
if(Fire_P1)
{
delay_Nms(25);
if(Fire_P
1)
{
LED1=0;
str[0] = ‘S’;
str[1] = ‘a’;
str[2] = ‘f’;
str[3] = ‘e’;
str[4] = ‘?’;
str[5] = ’ ';
str[6] = ’ ';
str[7] = ’ ';
str[8] = ‘F’;
str[9] = ‘i’;
str[10] = ‘r’;
str[11] = ‘e’;
str[12] = ’ ';
str[13] = ’ ';
str[14] = ‘\0’;
Lcd1602ShowStr(0, 0, str);
Uart1Sends(str);
Uart2Action();
}
}
else
{
LED1=1;
str[0] = ‘S’;
str[1] = ‘a’;
str[2] = ‘f’;
str[3] = ‘e’;
str[4] = ‘?’;
str[5] = ’ ';
str[6] = ’ ';
str[7] = ’ ';
str[8] = ‘Y’;
str[9] = ‘E’;
str[10] = ‘S’;
str[11] = ‘!’;
str[12] = ’ ';
str[13] = ’ ';
str[14] = ‘\0’;
Lcd1602ShowStr(0, 0, str);
Uart1Sends(str);
​ }
}
nt intT,decT,temp;
int tem;
bit res=0;
void refreshTemp()
{
​ res = Get18B20Temp(&temp);
​ Start18B20();
​ LED2=1;
​ LED3=1;
​ BEEP=1;
​ if (res)
​ {
​ intT = temp >> 4;
​ decT = temp & 0xF;
​ decT = (decT
100) / 16;
​ tem = intT;
​ }
​ str[0] = ’ ';
​ str[1] = ’ ';
​ str[2] = ’ ';
​ str[3] = intT % 100 / 10+ 0x30;
​ str[4] = intT % 10+0x30;
​ str[5] = ‘.’;
​ str[6] = decT % 100/10+0x30;
​ str[7] = ‘C’;
​ str[8] = ’ ';
​ str[9] = ‘\0’;
​ str[10] = ‘\n’;
Lcd1602ShowStr(0, 1, str);
​ Uart1Sends(str);
​ delay_Nms(100);
if(tem<=40&&tem>=20)
{
delay_Nms(50);

}
else if(tem<20)		
{
	LED2=0;	
    BEEP=0;
	}
	else if(tem>40)	
	{
		LED3=0;
		BEEP=0;
		delay_Nms(1000);
		BEEP=1;
	}
}

//******************************************************************//
// DS18B20.c的代码
//******************************************************************//
#include “config.h”
#include
sbit IO_18B20 = P3^7;

void Delay_us(unsigned char us)
{
do {
nop();
nop();
nop();
nop();
nop();
nop();
nop();
nop();
} while (–us);
}
bit Get18B20Ack()
{
bit ack;
EA = 0;
IO_18B20 = 0;
Delay_us(250);
Delay_us(250);
IO_18B20 = 1;
Delay_us(60);
ack = IO_18B20;
while(!IO_18B20);
EA = 1;
return ack;
}
void Write18B20(unsigned char dat)
{
unsigned char mask;
EA = 0;
for (mask=0x01; mask!=0; mask<<=1)
{
IO_18B20 = 0;
Delay_us(2);
if ((mask&dat) == 0)
IO_18B20 = 0;
else
IO_18B20 = 1;
Delay_us(60);
IO_18B20 = 1;
}
EA = 1;
}
unsigned char Read18B20()
{
unsigned char dat;
unsigned char mask;
EA = 0;
for (mask=0x01; mask!=0; mask<<=1)
{
IO_18B20 = 0;
Delay_us(2);
IO_18B20 = 1;
Delay_us(2);
if (!IO_18B20)
dat &= ~mask;
else
dat |= mask;
Delay_us(60);
}
EA = 1;
return dat;
}
bit Start18B20()
{
bit ack;
ack = Get18B20Ack();
if (ack == 0)
{
Write18B20(0xCC);
Write18B20(0x44);
}
return ~ack;
}
bit Get18B20Temp(int *temp)
{
bit ack;
unsigned char LSB, MSB;
ack = Get18B20Ack();
if (ack == 0)
{
Write18B20(0xCC);
Write18B20(0xBE);
LSB = Read18B20();
MSB = Read18B20();
*temp = ((int)MSB << 8) + LSB;
}
return ~ack;
}

//******************************************************************//
// LCD1602.c的代码
//******************************************************************//
#include “config.h”
#include “Lcd1602.h”
void Lcd1602WaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_EN = 1;
sta = LCD1602_DB;
LCD1602_EN = 0;
} while (sta & 0x80);
}
void Lcd1602WriteCmd(unsigned char cmd)
{
Lcd1602WaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
void Lcd1602WriteDat(unsigned char dat)
{
Lcd1602WaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
void Lcd1602SetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0)
addr = 0x00 + x;
else
addr = 0x40 + x;
Lcd1602WriteCmd(addr | 0x80);
}
void Lcd1602ShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
Lcd1602SetCursor(x, y);
while (*str != ‘\0’)
{
Lcd1602WriteDat(*str++);
}
}
void InitLcd1602()
{
Lcd1602WriteCmd(0x38);
Lcd1602WriteCmd(0x0C);
Lcd1602WriteCmd(0x06);
Lcd1602WriteCmd(0x01);
}

//******************************************************************//
// HC-05.c的代码
//******************************************************************//
#include “Hc05.h”
#include “config.h”
#include “Lcd1602.h”
bit flagTxd = 0;
bit flagUart2Frame = 0;
extern bit Page;
unsigned char cntRxd2 = 0;
unsigned char pdata bufRxd2[30];
void Uart2Action(unsigned char *buf, unsigned char len);

char Uart2Init(char s2smod,char brtx12,unsigned char reload)
{
S2CON = 0X50;
BRT = reload;
if(s2smod == 1)
{
AUXR |= S2SMOD;
}
else if(s2smod == 0)
{
AUXR &= (~S2SMOD);
}
else
{
return -1;
}

if(brtx12 == 1)
{
	AUXR |= BRTx12;
}
else if(brtx12 == 0)
{
	AUXR &= (~BRTx12);	
}
else
{
	return -2;
}
	
AUXR |= BRTR;																		
IE2 |= ES2; 
EA = 1;	  
return 0;	

}
void InterruptUart2() interrupt 8
{
unsigned char temp = 0;
IE2 = 0;
if(S2CON & S2RI)
{
}
IE2 |= ES2;
if(S2CON & S2TI)
{
S2CON &= (~S2TI);
}
}
void Uart2RxMonitor(unsigned char ms)
{
static unsigned char cntbkp = 0;
static unsigned char idletmr = 0;

if (cntRxd2 > 0)  
{
    if (cntbkp != cntRxd2)  
    {
        cntbkp = cntRxd2;
        idletmr = 0;
    }
    else                  
    {
        if (idletmr < 30)  
        {
            idletmr += ms;
            if (idletmr >= 30) 
            {
                flagUart2Frame = 1; 
            }
        }
    }
}
else
{
    cntbkp = 0;
}

}
unsigned char Uart2Read(unsigned char *buf, unsigned char len)
{
unsigned char i;
if (len > cntRxd2)
{
len = cntRxd2;
}
for (i=0; i {
*buf++ = bufRxd2[i];
}
cntRxd2 = 0;

return len; 

}
void Uart2Action(unsigned char *buf, unsigned char len)
{
unsigned char i;
unsigned char code cmd2[] = "showstr ";
unsigned char code cmdLen[] = {
sizeof(cmd2)-1,
};

	unsigned char code *cmdPtr[] = {        
     &cmd2[0],
};

for (i=0; i= cmdLen[i]) 
    {
        if (CmpMemory(buf, cmdPtr[i], cmdLen[i])) 
        {
            break;
        }
    }
}

}
void Uart2Driver()
{
unsigned char len;
unsigned char pdata buf[40];

if(flagUart2Frame)
{
	flagUart2Frame = 0;
	len = Uart2Read(buf, sizeof(buf));
	Uart2Action(buf, len);	
}

}

bit CmpMemory(unsigned char *ptr1, unsigned char *ptr2, unsigned char len)
{
while (len–)
{
if (*ptr1++ != *ptr2++)
{
return 0;
}
}
return 1;
}

你可能感兴趣的:(51单片机)