危险气体检测装置论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要家庭使用液化气、燃气等可燃气体作燃料的越来越多,但是这些气体有害、易爆炸,隐患事故多,如气体泄漏时不能及时发现和处理,会给家庭及邻居带来灾难性危害。
本次设计内容包括可燃气体报警电路的结构及其工作原理。
此报警电路以气敏半导体传感器为主要组成部分,气敏半导体传感器检测到可燃气体时通过电导率的改变来控制多谐振荡器及正反馈振荡器间歇工作,通过报警电路从而达到报警的目的。
物联网时代的到来,各种设备都需要连接到网络,同时目前手机短信息的应用越来越广泛,它已经不仅仅作为交流信息的工具,渐渐的开始用在工程上,如家电的远程控制、电压的远程采集等。
本系统将通过手机与GSM的通信,以及各种屏幕的信息显示,以此来达到监控的目的。
随着电子科学技术的发展,电子技术成为安全方面的有力手段,许许多多安全方面的电子产品,是人们的生活的得力助手。
本设计利用单片机技术结合GSM构建了一个可燃气体检测报警器。
当环境中可燃或有毒气体泄露时,当气体报警器检测到可燃气体浓度达到报警器设置的临界点时,可燃气体报警器就会发出报警信号,以提醒工作人员采取安全措施。
本文首先简要介绍了设计可燃气体检测报警器的主要方式以及单片机系统的优势;然后详细介绍了可燃气体检测报警器的设计流程,以及硬件系统和软件系统的设计,并给出了硬件电路的设计细节,包括各部分电路的走向、芯片的选择以及方案的可行性分析等。
本次设计采用MQ-2气体传感器作为可燃气体的信号采集工具,采集到的模拟电压量经过ADC0804转换为数字信号。
单片机采集到ADC0804的数字信号后经过计算,如果可燃气体浓度达到报警器设置的临界点时单片机将驱动LED和蜂鸣器发出报警信号。
在无可燃气体的情况下,发生未知的危险,报警器可以人为的控制按键发出报警信号提醒人们。
按下S1时蜂鸣器报警,LED闪烁;S2用来取消报警。
关键词MQ-2传感器,STC89C52单片机,12864LCD液晶,GSM通信。
目录
摘要........................................................ 错误!未定义书签。
第一章绪论 (1)
1.1选择器件:........................................... 错误!未定义书签。
1.2系统原理及基本框图:................................. 错误!未定义书签。
1.3 可燃气体报警器的工作原理:.......................... 错误!未定义书签。
第2章主要元件介绍 (2)
2.1STC89C52单片机: (2)
2.2GSM通信模块、MQ-2传感器、12864LED液晶显示屏: (5)
第3章电路各部分介绍 (14)
3.1 危险气体信号采集部分 (14)
3.2 A/D转换部分 (15)
3.3报警显示部分......................................... 错误!未定义书签。
3.4最小系统与按键 (17)
第4章整体电路 (19)
4.1整体电路 (19)
4.2元器件清单 (20)
4.3 软件设计部分 (20)
第五章总结................................................. 错误!未定义书签。
参考文献.. (38)
第一章绪论
1.1选择器件
按系统功能实现要求,决定控制系统采用市场上很普遍的51单片机,MQ-2传感器12864LCD液晶,GSM通信模块价格便宜,显示醒目。
1.2系统原理及基本框图
本次设计采用STC89C52单片机机芯片12864LCD液晶和GSM通信配合构成一个简易的危险气体检测报警系统,显示部分由数码管进行显示可燃气体的浓度级别。
该电路通过MQ-2传感器检测可燃气体并发出0-5V的电压信号并输入到12864LCD液晶采样模拟量电压,经过模/数转换后,产生相应的数字量经过其输出通道DB0~DB7传送给STC89C52单片机的P1口。
STC89C52单片机负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示,显示可燃气体浓度级别。
本系统有单片机最小系统及电源、数码显示、按键、可燃气体检测、报警电路组成。
基本原理如图1-1所示:
图1-1 系统基本方框图
第二章主要元件介绍
2.1STC89C52单片机
2.1.1 概述
STC89C52单片机是STC公司生产的八位单片机。
在这一块芯片上集成了一台微型计算机的各个主要部分。
其中主要有CPU,存储器,可编程I/O口,定时/计数器,串行口等,各部分通过内部总线连接。
STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器。
该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
2.1.2引脚介绍和最小系统
STC89C52芯片为40引脚双列直插式封装,其引脚排列如图2-1-1所示。
在40条引脚中,有2条用于电源的引脚,2条外接晶体的引脚,4条控制引脚,其它为I/O 引脚。
图2-1-1 AT89S51的引脚图
1、电源引脚Vss和Vcc
Vss(20):接地;Vcc(40):正常操作时接+5V电源。
2、外接晶体引脚XTAL1和XTAL2
当外接晶体振荡器时,XTAL1和XTAL2分别接在外接晶体两端。
当采用外部时钟方式时,XTAL1接地,XTAL2接外来振荡信号。
3、控制引脚RST/VPD、ALE/PROG、PSEN、EA/Vpp
RST/VPD:当晶体振荡器正常运行时,在此引脚上出现二个机器周期以上的高电平使单片机复位。
Vcc掉电期间,此引脚可接备用电源,以保持内部RAM的数据。
当Vcc下降到低于规定的电压,而VPD在规定的电压范围内,VPD接向内部RAM提供备用电源。
ALE/PROG(30):当访问外部存储器时,由P2口送出地址的高8位,P0口送出地址的低8位,数据也是通过P0口传送。
作为P0口某时送出的信息到底是低8位地址还是传送的数据,需要有一信号同步的进行分别。
当ALE信号(允许地址锁存)为高电平(有效),P0口送出低8位地址,通过ALE信号锁存低8位地址。
即使不访问外部存储器,ALE端仍以不变的频率周期性地出现正脉冲信号,此频率为振荡器频率的1/6,因此可以做对外输出的时钟。
对于有程序存储器的单片机在对内部程序存储器编程期间,此引脚用于输入编程脉冲。
PESN(29):程序存储器读选通信号,低电平有效。
51单片机可以外接程序存储器及数据存储器,它们的地址可以是重合的。
51 单片机时通过相应的控制信号来区别到底是P2口和P0口送出的是程序存储器还是数据存储器地址。
从外部程序存储器取指令(或常数)期间,每个机器周期两次PSEN有效,此时地址总线上送出地址程序存储器地址;如果访问外部数据存储器,这两次有效的PSEN信号将不出现。
外部数据存储器是靠RD及WR信号控制的,PSEN同样可以驱动8个LSTTL输入。
EA/Vpp(31):当EA保持高电平时,访问内部程序存储器(4KB),但当PC (程序计数器)值超过0FFFH时,将自动转向执行外部程序存储器内的程序。
当EA 保持低电平时,则只访问外部程序存储器(从0000H开始),不管单片机内部是否有程序存储器。
对于内部有程序存储器的单片机在对内部程序新学期编程期间,此引脚用于施加21V的编程电源(Vpp)。
4、输入输出引脚
P0.0-P0.7:P0口时一个漏极开路型标准双向I/O口。
在访问外部存储器时,它是分时切换的地址(低8位)和数据总线,在访问外部设备期间使用内部的上拉电阻。
在对内部程序存储器编程时,它接收指令字节,而在验证内部程序时,则输出指令字节。
验证内部程序时,要求外接上拉电阻。
P1.0-P1.7:P1口是带内部上拉电阻的8位双向I/O接口。
在内部程序存储器编程和验证时,它接收8位地址。
P2.0-P2.7:P2口时一个带内部上拉电阻的8位双向I/O接口。
在访问外部存储器时,它送出高8位地址。
在对内部程序存储器编程和验证期间,它接收高8位地址。
P3.0-P3.7:P3口是一个带内部上拉电阻的8位双向I/O接口。
在51单片机中,这8
第二功能在单片机与外部设备接口方面具有非常重要的作用。
单片机的最小系统由A T89S51、6M晶振、两个20p电容、10K电阻、复位开关组成。
如图2-1-3所示:
图2-1-3 AT89S51的最小系统
图中电容器C1和C2其稳定振荡频率、快速起振的作用,起电容值一般在15-30pF
本次设计采用22pF电容。
晶振频率的典型值位12MHz,采用6MHz的情况也比较多。
内部振荡方式所得的时钟信号比较稳定,实际电路中使用比较多,本次设计采用12M 晶体振荡器。
上电复位时利用RC充电来实现的。
按键复位又分为:按键电平复位,相当于RST 端通过电阻接高电平;按键脉冲复位,利用RC微分电路产生正脉冲。
2.1.3 定时器描述
AT89S51单片机内有两个16位定时器/计数器:定时器1(T0)、定时器2(T1)、和定时器3(T2)它们都有定时或对外部事件计数的功能,可用于定时控制、延时、对外部事件检测和计数等场合。
定时器T0和T1两个16位定时器实际上都是16位加1计数器。
T0实际是由两个8位专用寄存器TH0(8CH)和TL0(8AH)组成,T1是由TH1(8DH)和TL1(8BH)组成。
每个定时器都可由软件设置为定时工作方式或计数工作方式及其他灵活多样的可控功能方式。
这些都是由专用寄存器TMOD设置和TCON控制。
在89S52单片机中,增加了一个16位`定时/计数器T2。
T2和T0和T1有类似的功能即可以做定时器或计数器使用,同时还增加了捕捉等新的功能。
它的功能比其它两个定时器更强,使用也较复杂。
在特殊功能寄存器组中有6个与T2有关的积存器,它们分别是:控制寄存器T2COM、方式控制寄存器T2MOD、捕捉寄存器RCAP2L
和RCAP2H、定时/计数器TL2、TH2。
它们在片内存储器中的地址依次从C8H至CDH。
设置为定时方式时,定时器记数片内震荡器输出经12分频后的脉冲(机器周期信号)。
即每个机器周期使定时器(T0或T1)的数值增加1直至计满溢出。
当采用12MHZ晶体时,一个机器周期为1US,计数频率为1MHZ。
设置为计数方式时,通过引脚T0(P3。
4)和T1(P3。
5)对外部脉冲信号计数。
当输入脉冲信号产生由1至0的下降沿时,定时器的值增加1。
在每个机器周期的S5P2期间采样T0和T1脚的输入电平,若前一个机器周期采样值为1,下一个机器周期采样值为0,则计数器加1。
此后的机器周期53P1期间,新的数值装入计数器。
所以,检测一个1至0的跳变需要二个机器周期,故最高计数频率为震荡频率的1/24。
虽然对输入信号的占空比无特殊要求,但为了确保某个电平在变化之前至少被采样一次。
要求电平保持时间至少是一个完整的机器周期。
2.2 GSM通信模块、MQ-2传感器、12864液晶显示屏
ATK-SIM900A模块不但外观漂亮,而且功能齐全、接口丰富,模块尺寸(不算天线部分)为80mm*58mm,并带有安装孔位,非常小巧,并且利于安装,可方便应用于各种产品设计。
ALIENTEK ATK-SIM900A模块(开发板)板载资源如下:
GSM模块:SIM900A
1个RTC后备电池
1个麦克风接口
1个耳机接口
1个RS232选择接口
1个RS232串口
1个锂电池接口
1个电源输入接口
1个电源指示灯(蓝色)
1个电源开关
1个翻盖式SIM卡座
1个SMA天线接口并配套小辣椒天线
1个开机/关机按键
1个网络状态指示灯(红色)
SIM900A模块的所有IO口均用排针引出,方便使用
ATK-SIM900A模块(开发板)采用工业级标准设计,特点包括:
板载RS232串口(支持硬件流控制),方便与PC/工控机等设备连接;
板载3.5mm耳机和麦克风座,方便进行语音通信开发;
引出所有SIM900A模块的IO口,并对通信部分IO口做了兼容性设计,方便连接3.3V/5V单片机系统;
板载高效同步降压电路,转换效率高达90%,支持超宽电压工作范围(5~24V),非常适合工业应用;
板载电源防反接保护,TVS电源保护和SIM卡ESD保护,保护功能完善;
板载RTC后备电池(XH414H-IV01E),无需担心掉电问题;
板载小辣椒天线,能有效提高信号接收能力;
采用国际A级PCB料,沉金工艺加工,稳定可靠;
采用全新元器件加工,纯铜镀金排针,坚固耐用;
人性化设计,各个接口都有丝印标注,使用起来一目了然;接口位置设计安排合理,方便顺手。
PCB尺寸为80mm*58mm,并带有安装孔位,小巧精致;
4、A TK-SIM900A GSM/GPRS模块(开发板)详细参数
A TK-SIM900A模块板载SIMCOM公司的工业级双频GSM/GPRS模块:SIM900A,工作频段双频:900/1800Mhz,可以低功耗实现语音、SMS(短信,不支持彩信)、数据和传真信息的传输。
ATK-SIM900A模块支持RS232串口和LVTTL串口,并带硬件流控制,支持5V~24V的超宽工作范围
MQ-2传感器:
MQ-2/MQ-2S气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。
当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。
使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
MQ-2/MQ-2S气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可
燃蒸汽的检测也很理想。
这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。
MQ-2/MQ-2S气敏元件的结构和外形如图2-3-1所示(结构 A 或B),由微型Al2O3陶瓷管、SnO2 敏感层,测量电极和加热器构成的敏感元件固定在塑料或不锈钢制成的腔体内,加热器为气敏元件提供了必要的工作条件。
封装好的气敏元件有6只针状管脚,其中4个用于信号取出,2个用于提供加热电流。
基本电路如图2-3-2。
部件材料
1 气体敏感层二氧化锡
2 电极金(Au)
3 测量电极引线铂(Pt)
4 加热器镍铬合金(Ni-Cr)
5 陶瓷管三氧化二铝
6 防爆网100目双层不锈钢
(SUB316)
7 卡环镀镍铜材(Ni-Cu)
8 基座胶木或尼龙
9 针状管脚镀镍铜材(Ni-Cu)
图2-3-1 结构和外形
图2-3-2 MQ-2基本电路
液晶显示屏:
一、概述
带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
二、基本特性
(1)低电源电压(VDD:+3.0--+5.5V)
(2)显示分辨率:128×64点
(3)内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)
(4)内置 128个16×8点阵字符
(5)2MHZ时钟频率
(6)显示方式:STN、半透、正显
(7)驱动方式:1/32DUTY,1/5BIAS
(8)视角方向:6点
(9)背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10
(10)通讯方式:串行、并口可选
(11)内置DC-DC转换电路,无需外加负压
(12)无需片选信号,简化软件设计
(13)工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃
三、模块接口说明
*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
控制器接口信号说明:
1、RS,R/W的配合选择决定控制界面的4种模式:
2、E信号
● 忙标志:BF BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块之工作状态.
● 字型产生ROM(CGROM)字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。
DFF=1为开显示(DISPLAY ON),DDRAM 的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。
DFF 的状态是指令DISPLAY ON/OFF和RST信号控制的。
● 显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码BIG5
(A140—D75F),GB(A1A0-F7FFH)。
● 字型产生RAM(CGRAM)字型产生RAM提供图象定义(造字)功能, 可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM 中的定义一样地通过DDRAM显示在屏幕中。
● 地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W 为“1”时,地址计数器的值会被读取到DB6——DB0中。
光标/闪烁控制电路
此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。
四、指令说明
模块控制芯片提供两套控制命令,基本指令和扩充指令如下:
指令表1:(RE=0:基本指令)
指令表2:(RE=1:扩充指令)
备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。
五、应用举例:
1、使用前的准备:先给模块加上工作电压,再按照下图的连接方法调节LCD的对比度,使其显示出
黑色的底影。
此过程亦可以初步检测LCD有无缺段现象。
2、字符显示:带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显
示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。
带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。
字符显示是通过将字符显示编码写入该字符显示RAM实现的。
根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。
三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。
字符显示RAM在液晶模块中的地址80H~9FH。
字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。
3 、图形显示
先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址)
垂直地址范围 AC5...AC0
水平地址范围AC3…AC0
绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。
GDRAM的坐标地址与资料排列顺序如下图:
4、应用说明
用带中文字库的128X64显示模块时应注意以下几点:
①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。
不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
③当字符编码为2字节时,应先写入高位字节,再写入低位字节。
④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。
如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。
指令执行的时间请参考指令表中的指令执行时间说明。
⑤“RE”为基本指令集与扩充指令集的选择控制位。
当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位
第三章电路各部分介绍
3.1 危险气体信号采集部分
在本设计中,采用MQ-2传感器作为信号采集器件,器件的1、3、4脚连接电源的正极(+5V),2、5、6脚连接地。
采集到的信号通过1k欧姆电阻后送到ADC0804的模拟输入端,R2用来调节输出信号的大小。
具体电路连接如图3-1-1所示:
图3-1-1 信号采集部分
3.2 A/D转换部分
由MQ-2传感器采集到的电压信号接10k欧姆的电阻后接到ADC0804的Vin+端;ADC0804的A-GND和Vin-端接地;CLK-IN端接104电容后接地;CLK-R接10k欧姆电阻接104电容接地;Vref/2接2.5V电压,电路中采用两个1k欧姆的电阻分压得到;DB0-DB7分别连接单片机的P1.0-P1.7用于单片机采集转换后的数字信号;CS、RD、WR三端分别连接P3.0、P3.1、P3.2用于控制单片机于ADC0804进行通信。
具体电路连接方式如图3-3-1所示:
图3-3-1 A/D转换部分
3.3报警显示部分
采集到的数字信号经过单片机计算后如果可燃气体浓度达到报警器设置的临界点时,单片机将控制蜂鸣器报警,同时LED闪烁。
LED的正极接电源正极(+5V),负极接1K欧姆电阻后接单片机P2.0端。
蜂鸣器采用NPN3041三极管来驱动,三极管集电极接电源正极(+5V),基极接5.1k欧姆电阻后接P2.1端,发射极接蜂鸣器,通过蜂鸣器后接地。
具体电路连接方式如图3-4-1所示:
图3-3-1 报警部分
3.4最小系统及按键
单片机接+5V电源;晶体振荡器频率为12MHz,晶振的两个引脚分别连接在单片机的XTAL1和XTAL2端,晶振的两端再分别连接一个22pF电容后接地;复位电路经电源正极(+5V)接10uF电容后接1k欧姆电阻接地,单片机复位端RST接在电容和电阻之间。
本次设计电路中加入两个按键,用于人为报警。
单片机P3.6和P3.7端分别连接一个按键后接地。
当按下S1时蜂鸣器报警,LED闪烁;S2用来取消报警。
具体电路连接方式如图3-5-1所示:
图3-4-1 最小体统及按键
第四章整体电路
图4-1-1 系统整体图
4.2元器件清单
AT89S52单片机1个、12864LCD液晶显示屏1个、蜂鸣器1个、数码管1个、MQ-2传感器2个、LED发光二极管4个、按键2个、22皮法电容2个,10微法电容1个、104电容2个、12MHz晶振1个、3041三极管1个、20k欧姆电位器1个、1k欧姆电阻13个、10k欧姆电阻2个、4.7K欧姆9脚排阻1个。
4.3软件设计部分
4.3.1 软件设计流程图
4.3.2 单片机程序设计
源程序代码:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/* 端口定义*/
#define LCD_data P0 //数据口
#define FOSC_110592M
sbit led0=P1^0; //温度显示灯
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit hong=P2^0; //co
sbit huo=P2^1; //天然气
sbit beep=P2^3; //蜂鸣器
sbit LCD_RS = P2^5; //寄存器选择输入sbit LCD_RW = P2^6; //液晶读/写控制sbit LCD_EN = P2^7; //液晶使能控制sbit LCD_PSB = P3^5; //串/并方式控制/* 变量定义*/
uchar i,a,b,c,d,e,f; //显示控制
uchar code dis[]={":."};
uchar code dis1[] = {"【气体监控系统】"};
uchar code dis2[] = {"2014-10-4 SUN"};
uchar code dis3[] = {"时间:"};
uchar code dis4[] = {"制作者:106创作室"};
uchar code dis5[] = {"CO: Safety"};
uchar code dis6[] = {"天然气: Safety"};
uchar code dis7[] = {"短信:Been sent"};
uchar code dis8[] = {"故障:Unresolved"};
uchar code dis9[] = {"CO: DANGER"};
uchar code dis10[] = {"天然气: DANGER"};
uchar code dis11[] = {"短信: Not sent"};
uchar code dis12[] = {"故障: Resolved "};
uchar code dis13[] = {"A message is sen"};
uchar code dis14[] = {"t,please wait..."};
uchar code digit[ ]={"0123456789"}; //定义字符数组显示数字
uchar sms_text[] = "Carbon monoxide has exceed the standard"; //短信内容uchar sms_text1[] = "Natural gas has exceed the standard";
uchar s,m,h; //定义变量储存秒、分钟和小时
/* 延时函数部分*/
/*****************************************************
函数功能:延时1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<33;j++);
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/* 液晶驱动函数*/
/*******************************************************************/
/* */
/*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/ /* */
/*******************************************************************/ void write_cmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/ /* */
/*******************************************************************/ void write_dat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
/*********************************************************/
/* */
/* 设定显示位置*/
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
write_cmd(pos); //显示地址
}
/*******************************************************************/
/* */
/* LCD初始化设定*/
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
write_cmd(0x30); //基本指令操作
delay(5);
write_cmd(0x0C); //显示开,关光标
delay(5);
write_cmd(0x01); //清除LCD的显示内容
delay(5);
}
/*时间显示控制函数部分*/
/*****************************************************
函数功能:显示小时
***************************************************/
void DisplayHour()
{
unsigned char i,j;
i=h/10; //取整运算,求得十位数字
j=h%10; //取余运算,求得各位数字
lcd_pos(2,3); //写显示地址,将十位数字显示在第2行第5列
write_dat(digit[i]); //将十位数字的字符常量写入LCD
//lcd_pos(2,3);
write_dat(digit[j]); //将个位数字的字符常量写入LCD
}
/*************************************************************************
*****
函数功能:显示分钟
************************************************************************* *****/
void DisplayMinute()
{
unsigned char i,j;
i=m/10; //取整运算,求得十位数字
j=m%10; //取余运算,求得各位数字
lcd_pos(2,4); //写显示地址,将十位数字显示在第2行第8列
write_dat(dis[0]);
write_dat(digit[i]); //将十位数字的字符常量写入LCD
//lcd_pos(2,11);
write_dat(digit[j]); //将个位数字的字符常量写入LCD
write_dat(dis[0]);
}
/************************************************************************* *****
函数功能:显示秒
************************************************************************* *****/
void DisplaySecond()
{
unsigned char i,j;
i=s/10; //取整运算,求得十位数字
j=s%10; //取余运算,求得各位数字
lcd_pos(2,6); //写显示地址,将十位数字显示在第2行第11列。