插座图-龙科股票400048

室内空气质量检测仪设计
2023年10月3日发(作者:雷涧)

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

No.:0422

..................................................................................... 1

85

1本课题的主要研究内容、方法及总体设计 .......................... 3

1.1 课题设计的内容 .................................................................. 3

1.2课题设计的方法 ................................................................... 3

1.3总体方案设计 ....................................................................... 3

1.3.1系统框图 ........................................................................ 3

1.3.2功能设定 ........................................................................ 3

2 空气质量检测仪的硬件设计 ............................................... 5

2.1 空气质量检测仪系统简介 ................................................... 5

2.1.1 系统硬件结构及原理 ..................................................... 5

2.2 STC89C52单片机简介 ........................................................... 5

2.2.1STC89C52主要性能参数: .............................................. 6

2.2.2时钟电路模块 ................................................................. 7

2.2.3复位电路模块 ................................................................. 8

2.3传感器的选用 ....................................................................... 8

2.3.1气体传感器 .................................................................... 8

2.3.2温度传感器 .................................................................. 11

2.4模数转换电路设计 .......................................................... 14

2.5声光报警电路设计 ............................................................. 16

2.6液晶显示电路设计 ............................................................. 16

2.6.1 LCD1602的基本参数及引脚功能 .................................. 16

2.6.2 LCD1602的指令说明及时序 ......................................... 18

2.6.3 1602LCDRAM地址映射及标准字库表 ..................... 19

2.6.4 LCD1602的一般初始化过程 ......................................... 19

2.7按键电路设计 ..................................................................... 20

2.8电路电源设计 ..................................................................... 20

2.9本章小结 ............................................................................ 20

3空气质量检测仪的软件设计 .............................................. 22

3.1 系统软件设计思路 ............................................................ 22

1

1

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

3.1.1 编程语言的选择 .......................................................... 22

3.1.2 软件功能需求 .............................................................. 23

3.2软件模块设计 ..................................................................... 24

3.2.1主程序模块................................................................... 24

3.2.2AD转换模块 .................................................................. 25

3.2.3液晶显示模块 ............................................................... 26

3.2.4声光报警模块 ............................................................... 26

3.2.5按键模块 ...................................................................... 26

3.3本章小结 ............................................................................ 26

4系统调试 ........................................................................... 27

4.1系统硬件调试 ..................................................................... 27

4.1.1 常见的硬件故障 .......................................................... 27

4.1.2硬件调试方法 ............................................................... 27

4.2 系统软件调试 .................................................................... 27

4.3本章小结 ............................................................................ 28

.................................................................................. 29

1主要结论 ............................................................................... 29

2展望 ...................................................................................... 29

参考文献 .............................................................................. 30

.................................................................................. 31

.................................................................................. 32

附录一 ..................................................................................... 32

附录二 ..................................................................................... 33

1

2

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

一、课题研究的目的及意义

空气质量的好坏反映了空气污染程度,它是依据空气中污染物浓度的高

低来判断的。来自固定和流动污染源的人为污染物排放大小是影响空气质量

的最主要因素之一。空气质量检测种类包括装修污染、办公室内空气检测、

作业场所有害物质检测、食堂油烟检测、锅炉大气及工业窑炉检测及工厂排

放工业废气检测。

当今,人类正面临煤烟污染光化学烟雾污染之后,又出现了室内

空气污染为主的第三次环境污染。美国专家检测发现,在室内空气中存在

500多种挥发性有机物,其中致癌物质就有20多种,致病病毒200多种。危害

较大的主要有:氡、甲醛、苯、氨以及酯、三氯乙烯等。大量触目惊心的事

实证实,室内空气污染已成为危害人类健康的隐形杀手,也成为全世界各

国共同关注的问题。据统计,全球近一半的人处于室内空气污染中,室内环

境污染已经引起35.7%的呼吸道疾病,22%的慢性肺病和15%的气管炎、支气

管炎和肺癌。

本课题主要研究设计基于量化检测的“空气质量检测仪”系统,此系

统旨在实现室内空气温度、煤气、烟雾的预警监测,有利于进行全方位的

评价室内空气质量,为人类营造一个健康的室内生存空间。空气质量检测

仪体积小,功耗低,操作简单,适合应用于家庭和社区的医疗健康保健,

能够实时知道室内空气的质量。

二、国内外的研究状况

国外从20世纪30年代开始研究及开发烟雾传感器,且发展迅速,一方面

是因为人们安全意识增强,对环境安全性和生活舒适性要求提高;另一方面

是因为传感器市场增长受到政府安全法规的推动。据有关统计,美国1996

~2002年烟雾传感器年均增长率为27%~30%。随着传感器生产工艺水平逐步

提高,传感器日益小型化、集成度不断增大,使得烟雾检测仪器的体积也逐

渐变小,提高了烟雾检测仪器的便携性,更加利于生产、运输及市场推广。

19635月,日本开发完成第一台接触燃烧式家用燃气泄漏报警器,次年

12月其改良产品问世,改良的报警器可以检测燃气、一氧化碳等气 体,可

以安装在浴室或者采用集中监视。

1

1

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

我国在70年代初期开始研制烟雾报警器,生产型号多样、品种较齐全,

应用范围也由单一的炼油系统扩展到几乎所有危险作业环境的各种类型报

警器,产品数量也在不断增加。但主要是在引进国外先进的传感器技术和先

进的生产工艺基础上,进行研究与开发形成自己的特色。近年来,在烟雾选

择性和产品稳定性上也有很大进步。

1

2

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

1本课题的主要研究内容、方法及总体设计

1.1 课题设计的内容

以单片机为核心,选择合适的传感器,实现对室内温度,有毒有害气体

的检测。

1.2课题设计的方法

查阅相关资料,应用电脑软件进行调试,制作硬件设备,在实际环境中

测试并进行修改、调试,直至达到课题要求。

1.3总体方案设计

本设计集VOC气体及温度监测,显示与报警于一体,利用MCU进行数据

采集保证了前台数据的及时、准确,有利于进行全方位的评价。具有良好的

便携性和通用性,并且使用LCD点阵式液晶屏显示菜单,有良好的人机对话

界面。

1.3.1系统框图

电源

1-1 系统总框图

气体传感

AD

显示模块

温度传感器

声光报警

输入键盘

1.3.2功能设定

1 显示部分采用LCD1602显示屏,显示各项测量值的上下

限及实际浓度、实际温度。并在按键选择情况下连续显示一个测量

1

3

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

值的变化。

2 当有害气体浓度超出安全范围时进行声光报警。

3 按键操作可进行测量值转换。

1

4

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

2 空气质量检测仪的硬件设计

2.1 空气质量检测仪系统简介

基于STC89C52的室内便携式智能空气质量监测仪是以室内空气中有毒危

险性气体的监测监控为背景,能够实现对室内温度,VOC气体的实时采集处

理、显示、报警等功能。仪器使用LCD点阵式液晶屏显示菜单,有良好的人

机对话界面。同时设计了声光报警系统,实现在参数超标时及时的报警。室

内智能空气品质监测仪体积小,功耗低,操作简单,适合应用于家庭和社区

的医疗健康保健,能够实时知道室内空气的质量。

2.1.1 系统硬件结构及原理

本文研究的室内便携式智能空气品质监测仪是以STC工公司的一款8位超

低功耗单片机STC89C52为控制核心。室内空气中有害气体通过传感器输出一

个与气体浓度相对应的电压信号,该信号经过A/D转换电路按一定得采样频

率将模拟信号转换为数字信号送入单片机进行数据采集以便进行显示处理,

温传感器直接与单片机相连。单片机对采样值进行数字处理后驱动液晶显示

器分别显示出被测室内空气中的VOC气体浓度值及温度。若被测室内空气中

VOC气体的浓度有超过国家标准或设定的危险值或温度超出设定范围时报警

电路对应的发出声光报警信号。

2.2 STC89C52单片机简介

随着计算机技术的发展,单片机因具有集成度高、体积小、速度快、价

格低等特点而在许多领域如过程控制、数据采集、机电一体化、智能化仪表、

家用电器以及网络技术等方面得到广泛应用,从而使这些领域的技术水平、

自动化程度大大提高。根据上述几方面及本课题的实际情况,单片机型号的

选择主要从以下两点考虑:

一是要有较强的抗干扰能力。由于一般室内电子电器产品比较多,这对

单片机的干扰较大,所以应采用抗干扰性能较好的单片机机型。

二是要有较高的性价比。由于高度的通用性和出色的稳定性,本系统采

1

5

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

用宏晶公司产的低功耗,高性能CMOS 8位单片机的STC89C52作为控制器。片

内含4k bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的

高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash

程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器

于单片芯片中,可提供许多高性价比的应用场合,可灵活应用于各种控制领

域。

2.2.1STC89C52主要性能参数:

1)与MCS.51产品指令系统完全兼容

24k字节在系统编程(ISP)Flash闪速存储器

31000次擦写周期

44.0-5.5V的工作电压范围

5)全境态工作模式:0Hz-33MHz

6)三级程序加密锁

7128×8字节内部RAM

832个可编程IO口线

9216位定时器/计数器

10106个中断源

11)全双工串行UART通道

12)低功耗空闲和掉电模式

13)中断可从空闲模唤醒系统

14)看门狗(wDT)及双数据指针

15)掉电标识和快速编程特性

16)灵活的在线系统编程

STC89C52芯片管脚如图2-1

1

6

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

2-1 STC89C52引脚布置

2.2.2时钟电路模块

时钟电路由一个晶体振荡器11.0592MHZ和两个30pF的瓷片电容组成。

钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行

中各信号之间的相互关系。单片机本身就如一个复杂的同步时序电路,为了

保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作。其

电路如图2-2所示:

2-2 时钟电路模块

1

7

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

2.2.3复位电路模块

复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状

态,并从这状态开始工作,除了进入系统的正常初始化之外,当由于程序运

行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以

重新启动。本设计采用的是按键复位电路。其电路如图2-3所示:

2-3 复位电路模块

2.3传感器的选用

2.3.1气体传感器

1、气体传感器基础知识

按照气敏特性来分,气体传感器主要分为:半导体型、电化学型、固体

电解质型、接触燃烧型、光化学型等气体传感器,又以前两种最为普遍。

(1)半导体型气体传感器的优缺点

半导体气体传感器具有成本低廉、制造简单、灵敏度高、响应速度快、

寿命长、对湿度敏感低和电路简单等优点。不足之处是必须在高温下工作、

对气体或气味的选择性差、元件参数分散、稳定性不理想、功率高等方面。

(2)半导体传感器需要加热的原因

半导体传感器是利用一种金属氧化物薄膜制成的阻抗器件,其电阻随着

气体含量不同而变化。气体分子在薄膜表面进行还原反应以引起传感器电导

率的变化。为了消除气体分子达到初始状态就必须发生一次氧化反应。传感

器内的加热器可以加速氧化过程,这也是为什么有些低端传感器总是不稳

定,其原因就是没有加热或加热电压过低导致温度太低反应不充分。

1

8

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

(3)电化学气体传感器的工作原理

电化学气体传感器是通过监测电流来监测气体的浓度,分为不需供电的

原电池式以及需要供电的可控电位电解式,目前可以监测许多有毒气体和氧

气,后者还能监测血液中的氧浓度。电化学传感器的主要优点是气体的高灵

敏度以及良好的选择性。不足之处是有寿命的限制一般为两年。

(4)半导体传感器和电化学传感器的区别

半导体传感器因其简单低价已经得到广泛应用,但是又因为它的选择性

差和稳定性不理想目前还只是在民用级别使用。而电化学传感器因其良好的

选择性和高灵敏度被广泛应用在几乎所有工业场合。

(5)固态电解质气体传感器

顾名思义,固态电解质就是以固体离子导电为电解质的化学电池。它介

于半导体和电化学之间。选择性,灵敏度高于半导体而寿命又长于电化学,

所以也得到了很多的应用,不足之处就是响应时间过长。

(6)接触燃烧式气体传感器

接触燃烧式气体传感器只能测量可燃气体。又分为直接接触燃烧式和催

化接触燃烧式,原理是气敏材料在通电状态下,可燃气体在表面或者在催化

剂作用下燃烧,由于燃烧使气敏材料温度升高从而电阻发生变化。后者因为

催化剂的关系具有广普特性应用更广。

(7)光学式气体传感器

光学式气体传感器主要包括红外吸收型、光谱吸收型、荧光型等等,主

要以红外吸收型为主。由于不同气体对红外波吸收程度不同,通过测量红外

吸收波长来监测气体。目前因为它的结构关系一般造价颇高。基于本文的实

时要求和性价比等方面的原因,本系统选用电化学传感器中的定电位电解式

气体传感器。

2MQ-2传感器简介

MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二

氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随

空气中可燃气体浓度 的增加而增大。使用简单的电路即可将电导率的变

化转换为与该气体浓度相对应的输出信号。MQ-2气体传感器对液化气、

丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。

当处于200~300°C温度时,二氧化锡吸附空气中的氧,形成氧的负离

子吸附,使半导体中的电子密度减少, 从而使其电阻值增加。当与烟雾

接触时,如果晶粒间界处的势垒受 到该烟雾的调制而变化,就会引起表

而电导率的变化。利用这一点就可以获得这种烟雾存在的信息。

遇到可燃烟雾(如CH4等)时,原来吸附的氧脱附,而由可燃烟雾以

正离子状态吸附在二氧化锡半导体表面;氧脱附放出电子,烟雾以正离子

状态吸附也要放出电子,从而使二氧化锡半导体导带电子密度增加,电阻

值下降。而当空气中没有烟雾时,二氧化锡半导体-又会自 动恢复氧的负

离子吸附,使电阻值升高到初始状态。这就是MQ-2型燃性烟雾传感器检

测可燃烟雾的基本原理。

(1)MQ-2型传感器的一般特点

(a)MQ-2型传感器对天然气、液化石油气等烟雾有很高的灵敏度,尤

其对烷类烟雾更为敏感。

(b)MQ-2型传感器具有良好的重复性和长期的稳定性。初始稳定,

应时间短,长时间工作性能好。

(c)MQ-2型传感器具有良好的抗干扰性,可准确排除有刺激性非可燃

性烟雾的干扰信息,例如酒精和烟雾等。

(d)电路设计电压范围宽,24V以下均可;加热电压5±0.2V

(2)MQ-2型传感器的特性参数

(a)回路电压:(Vc) 5~24V

(b)取样电阻:(RL) 0.1~20K

(c)加热电压:(VH)5±0.2V

(d)加热功率:(P)750mW

(e) 度:以甲烷为例R0(air)/RS (0.1%CH4)5

(f)响应时间:Tres10

(g)恢复时间:Trec30

3)模块应用

可以用于家庭和工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙

烷、甲烷、烟雾等的探测;

1

10

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

4)接线方式

aVCC:接电源正极(5V

bGND:接电源负极

cDO:TTL开关信号输出

dAO:模拟信号输出

2.3.2温度传感器

介绍:

1DS18B20工作原理

DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的

位数因分辨率不同而不同,且温度转换时的延时时间各不相同。低温度系

数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计

数器1。高温度系数晶振 随温度变化其振荡率明显改变,所产生的信号作

为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55所对应的

一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,

当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置

将重新被装入,计数器1 新开始对低温度系数晶振产生的脉冲信号进

行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,

此时温度寄存器中的数值即为所测温度。

DS18B204个主要的数据部件:

1光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是

DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H

是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是

前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使

每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个

DS18B20的目的。

2DS18B20中的温度传感器可完成对温度的测量,以12位转化为

例:用16位符号扩展的二进制补码读数形式提供,以0.0625/LSB形式

表达,其中S为符号位。

这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM

中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0

1

11

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5

位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如

+125的数字输出为07D0H+25.0625的数字输出为0191H-25.0625

的数字输出为FE6FH-55的数字输出为FC90H

3DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储

器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存

放高温度和低温度触发器THTL和结构寄存器。

4)配置寄存器该字节各位的意义如下:

2-1配置寄存器结构

TM R1 R0 1 1 1 1 1

低五位一直都是"1"TM是测试模式位,用于设置DS18B20在工作模

式还是在测试模式。DS18B20出厂时该位被设置为0用户不要去改动。

R1R0用来设置分辨率,如下表所示:DS18B20出厂时被设置为12位)

2-2:温度分辨率设置表

R1 R0

分辨率 温度最大转换时间

0 0 93.75ms

0 1 187.5ms

1 0 375ms

1 1 750ms

2、高速暂存存储器

高速暂存存储器由9个字节组成,当温度转换命令发布后,经转换所

得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字

节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。对

应的温度计算: 当符号位S=0时,直接将二进制位转换为十进制;当S=1

时,先将补码变为原码,再计算十进制值。

2-3DS18B20暂存寄存器分布

寄存器内容 字节地址

温度值低位 LS Byte

温度值高位 MS Byte

高温限值(TH

1

12

9

10

11

12

0

1

2

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

低温限值(TL

配置寄存器

保留

保留

保留

CRC校验值

3

4

5

6

7

8

根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转

换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复

位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20

进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,当

DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在

低脉冲,主CPU收到此信号表示复位成功。

3、温度的读取

DS18B20在出厂时以配置为12位,读取温度时共读取16位,前5

位为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读

取的温度为正数。温度为正时读取方法为:将16进制数转换成10进制即

可。温度为负时读取方法为:将16进制取反后加1,再转换成10进制即

可。例:0550H=+85 度,FC90H=-55度。

4 DS18B20控制方法

DS18B20有六条控制命令,指令约定代码操作说明

温度转换 44H 启动DS18B20进行温度转换

读暂存器 BEH 读暂存器9字节二进制数字

写暂存器 4EH 将数据写入暂存器的THTL字节

复制暂存器 48H 把暂存器的THTL字节写到E2RAM

重新调E2RAM B8H E2RAM中的THTL字节写到暂存器THTL

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

CPU

5DS18B20的初始化

1 先将数据线置高电平“1”

2 延时(该时间要求的不是很严格,但是尽可能的短一点)

1

13

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

3 数据线拉到低电平“0”

4 延时750微秒(该时间的时间范围可以从480960微秒)。

5 数据线拉到高电平“1”

6 延时等待(如果初始化成功则在1560微妙时间之内产生一

个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是

应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时

控制)。

7 CPU读到了数据线上的低电平“0”后,还要做延时,其延时的

时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。

8 将数据线再次拉高到高电平“1”后结束。

6DS18B20的写操作

1 数据线先置低电平“0”

2 延时确定的时间为15微秒。

3 按从低位到高位的顺序发送字节(一次只发送一位)。

4 延时时间为45微秒。

5 将数据线拉到高电平。

6 重复上(1)到(6)的操作直到所有的字节全部发送完为止。

7 最后将数据线拉高。

7 DS18B20的读操作

1)将数据线拉高“1”

2)延时2微秒。

3)将数据线拉低“0”

4)延时3微秒。

5)将数据线拉高“1”

6)延时5微秒。

7)读数据线的状态得到1个状态位,并进行数据处理。

8)延时60微秒。

2.4模数转换电路设计

气体传感器出来的信号是模拟信号,而微处理器STC89C52只能处理数

1

14

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

字信号,故需要对模拟信号信号进行转换,将其转换为处理器能识别的数

字信号,由于测试电路出来的模拟电压变化范围在0~5V,故选择性价比比

较合适的ADC0809进行模数转换。其管脚定义如图2-4所示。

2-4ADC0809管脚示意图

ADC0809各脚功能如表2-4

2-4 ADC0809各脚功能

引脚 功能介绍

D7-D0

IN0-IN7

VCC

REF+ 参考电压正端

REF- 参考电压负端

START

ALE

EOC

8位数字量输出引脚

8位模拟量输入引脚

+5V工作电压

A/D转换启动信号输入端

地址锁存允许信号输入端

转换结束信号输出引脚,开始转换时为低电平,当

转换结束时为高电平

OE

CLK

ABC 地址输入线

输出允许控制端,用以打开三态数据输出锁存器。

时钟信号输入端(一般为500KHz

ADC0809对输入模拟量要求:信号单极性,电压范围是05V,若信

号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若

模拟量变化太快,则需在输入前增加采样保持电路。ADC0809的时序接口

51系列单片机的标准总线接口,操作方便,如同对存储器或I/O操作一

1

15

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

样,A/D转换精度为8比特,满足本课题要求。输入的模拟电压为0~5V

一次A/D转换时间为100μS

2.5声光报警电路设计

为了使本系统对室内空气品质的监测更为直观,采用了如图2-52

个发光二极管和一个蜂鸣器构成的声光报警电路。温度超标时D1灯亮蜂

鸣器报警,其中危险气体含量超标时D2灯亮蜂鸣器报警。

2-5 声光报警电路

2.6液晶显示电路设计

本课题所要显示的数据一共有2个,分别是有毒气体的浓度和室内的

温度范围和测量值,故选用216个字符的LCD1602作为显示模块,满

足显示要求。液晶显示模块具有体积小、功耗低、显示内容丰富等特点,

现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件

了。

字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式

LCD,目前常用16*116*220*240*2行等的模块。下面以长沙太阳

人电子有限公司的1602字符型液晶显示器为例,介绍其用法。

2.6.1 LCD1602的基本参数及引脚功能

1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780

带背光的比不带背光的厚,是否带背光在应用中并无差别。

1602LCD主要技术参数:

1)显示容量:16x2个字符芯片

2)工作电压:4.5V5.5V

1

16

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

3)工作电流:2.0Ma5V

4)模块儿最佳工作电压:5.0V

5)字符尺寸:2.95×4.35(W×H)mm

引脚功能说明:

1602LCD采用标准的14脚(无背光)或16脚(有背光)接口,各引

脚说明如表2-5所示:

2-5 1602引脚说明

编号 符号 引脚说明 编号 符号 引脚说明

1 VSS 9 D2

2 VDD 10 D3

3 VL 11 D4

4 RS 12 D5

5 R/W 13 D6

6 E 14 D7

7 D0 15 BLA

8 D1 16 BLK

电源地 数据

电源正极 数据

液晶显示偏压 数据

数据/命令选择 数据

/写选择 数据

使能信号 数据

数据 背光源正极

数据 背光源负极

1脚:VSS为地电源。

2脚:VDD+5V正电源。

3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接

地时对比度最高,对比度过高时会产生鬼影,使用时可以通过一个10K

的电位器调整对比度。

4脚:PS为寄存器选择,高电平时选择数据寄存器、低电平时选择

指令寄存器。

5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写

操作。当RSR/W共同为低电平时可以写入指令或者显示地址,当RS

为低电平R/W为高电平时可以读忙信号,RS为高电平R/W为低电平时

可以写入数据。

6脚:E端为使能端,当E端由高电平跳变成低电平时,夜景模块

执行命令。

7~14脚:D0~D7为八位双向数据线。

15脚:背光源正极。

1

17

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

16脚:背光源负极。

2.6.2 LCD1602的指令说明及时序

1602液晶模块内部的控制器共有11条控制指令,1602液晶模块的读

写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明: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的点阵字符。

指令7:字符发生器RAM地址设置。

指令8DDRAM地址设置。

指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时

模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:写数据。

指令11:读数据。

HD44780相兼容的芯片时序如表2-6

2-6 基本操作时序表

读状态 输入 输出 D0D7=状态字

写指令 输入 RS=L,R/W=L,D0D7=指令码,E=高脉输出

RS=L,R/W=H,E=H

读数据 输入 输出 D0D7=数据

RS=H,R/W=H,E=H

1

18

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

写数据 输入 RS=H,R/W=L,D0D7=数据,E=高脉冲 输出

2.6.3 1602LCDRAM地址映射及标准字库表

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确

认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要

先输入显示字符地址,也就是告诉模块在哪里显示字符,图2-61602

内部显示地址。

2-6 1602LCD内部显示地址

第二行第一个字符的地址是40H写入显示地址时要求最高位D7恒定

为高电平1所以实际写入的数据应该是:

01000000B40H+10000000B(80H)=11000000B(C0H)

在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符

时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块

是否处于忙的状态。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不

同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用

的符号、和日文假名等,每一个字符都有一个固定的代码。

2.6.4 LCD1602的一般初始化过程

延时15mS

写指令38H(不检测忙信号)

延时5mS

写指令38H(不检测忙信号)

1

19

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

延时5mS

写指令38H(不检测忙信号)

以后每次写指令、读/写数据操作均需要检测忙信号

写指令38H:显示模式设置

写指令08H:显示关闭

写指令01H:显示清屏

写指令06H:显示光标移动设置

写指令0CH:显示开及光标设置

2.7按键电路设计

考虑到整个测量系统中不同环境对气体浓度及温湿度范围要求不同,

故设置了按键功能,用于实现测量范围的调整,参考单片机引脚使用情况,

2个独立按键,按键按下时可以显示对应参数值。

2.8电路电源设计

本设计采用集成稳压器7805C2C5分别为输入端和输出端滤波电容,

D1为续流二极管。当输出电流较大时,7805应配上散热板。电源电路如

2-7所示:

2-7 电源电路

2.9本章小结

本章首先介绍了便携式室内空气质量监测仪的硬件结构以及系统功

能,该仪器以8位单片机STC89C52作为控制核心,设计并构建了系统的

1

20

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

硬件平台,完成了有害气体浓度信号的采集转换电路、液晶显示电路、声

光报警电路等的设计。该仪器能够实现有毒气体浓度信号和温度信号采集

与显示及超标声光报警等功能。本章重点介绍了信号采集模拟电路和以主

控制器为中心的数字电路的设计与工作原理。首先讨论了有毒气体采集模

块中传感器选择问题,最后讨论了系统的外围接口电路模块,包括液晶显

,声光报警等,实现了各外围接口电路模块与STC89C52的硬件接口设计。

这一章比较具体的说明了系统硬件设计的内容,通过模块化的设计思

想,把一个复杂的单片机系统按照功能划分成一个个单独的电路模型,分

别进行设计,最后在集成到一起。这种方法对于设计复杂的单片机系统很

有效。大大提高系统设计的效率与质量。(说明:系统硬件设计的电路原理

图附在论文的附录里面。

1

21

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

3空气质量检测仪的软件设计

3.1 系统软件设计思路

3.1.1 编程语言的选择

在系统硬件电路确定以后,其主要功能的实现将依赖于软件来实现。

对同一硬件电路,配以不同的软件,它所实现的功能也就不同,其设计软

件基本要求:

1可靠性。可靠性是软件设计的重要指标,具有较强的抗干扰能力。

2)易理解性、易维护性。编制的软件要求易阅读,容易发现和纠正

错误,容易修改和补充。

3)实时性。系统能够及时响应外部事件的发生并能及时做出处理结

果。

4)准确性。保证系统进行计算数据的精度。

目前存在有4种编程语言支持单片机,即汇编语言、PL/M51语言、C

语言和BASI语言。其中汇编语言和C语言应用的较多,汇编语言的机器代

码生成效率高,控制性好,但就是移植性不高。结合本系统的特点,这里

选用了功能强、效率高的C语言。C语言主要有以下特点:用C语言编制

的程序效率高,占用存储空间小,运行速度快。C语言能写出最优化程序,

且能反映出计算机的实际运行情况。C语言能直接与存储器、接口电路打

交道,也能申请中断。具有良好的模块化、容易阅读、维护等优点,且编

写的模块程序易于移植。基于C语言和汇编语言的优缺点,本系统采用C

语言编写方法。

1

22

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

3.1.2 软件功能需求

温度传感

温度传感

MQ-2数据

采集

AD转换

系统软件

键盘检测

人机接口

LCD显示

蜂鸣器报

声光报警

灯光亮

3-1主程序功能需求

A/D转换

结果读取

室内空气质量检测仪系统软件主要由温度传感器采集模块、AD转换模

块、人机接口模块、声光报警模块、核心控制器模块构成,各模块功能概

述如表3-1所示。

3-1 各功能模块功能描述

功能模块 功能描述

温度传感器采集模块 对室内温度测点进行实时监测

AD转换模块 1.完成信号采样

2.完成与核心处理器间的数据传输

核心控制器模块 1.系统时基分配

2.人机接口控制

3.各模块协调工作

人机接口模块 1.按键控制

2.动态信息显示

根据软件设计的基本要求,采取了如下的措施:

1

23

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

1)程序模块化。软件设计中包含有:主程序模块、显示模块、温度

传感器检测函数、A/D数据转换子模块、声光报警模块、数据转换模块、

按键函数。

2)软件设计采用C语言编程。

3)中断响应外部事件,提高了系统的实时处理事件能力。

4.软、硬件抗干扰。软件抗干扰措施提高了系统的可靠性。

以下就对一些主要模块进行详细的阐述。

3.2软件模块设计

3.2.1主程序模块

主程序运行流程图如图3-2所示。由主程序流程图可以看出,软件要

实现的主要功能是实现对传感器信号的数据采集,然后进行数据的计算、

分析、送液晶进行显示及报警功能。程序开始时,对系统进行初始化,包

括单片机的各寄存器、RAM、定时器装载初值、中断设置及各模块初始化

等。完成初始化后,CPU等待传感器传入信号及AD转换结束,从而完成

当前监测参数的正确显示。

1

24

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

上电复位

系统初始

采样子程

按键程序

按键是

否按下

按键1

按键2

显示当前

参数

参数超

声光报警

结束

3-2主程序流程图

3.2.2AD转换模块

AD完成转换需要一定的时间,AD应用中我们可以有两种方法来:

1)中断查询法,AD完成模数转换后会向中断输出端输出一个中断

请求信号,告诉CPU转换已经完成,CPU可以读取数据。

2)延时等待法,设定一定的时间让CPU处于等待状态,此时间足

AD完成转换,过了等待时间CPU再去读取数据。

综合考虑各方面的因素,本研究采用第二种方法:延时等待法。所用

的芯片为AD0809,根据所需的要求。

1

25

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

3.2.3液晶显示模块

本设计所用的显示器件为1602液晶面板,该液晶能显示32个字符,

满足显示要求。1602液晶与CPU是并口通信,由单片机的P2.4P2.5P2.6

引脚来控制1602的读写数据命令功能,单片机P0口传输数据到1602

行显示。

系统上电LCD初始化,液晶显示首先需要要按照时序给定显示地址,

然后传送数据。上电后液晶显示开始显示两个被测量的范围和测量结果。

3.2.4声光报警模块

声音报警采用的是蜂鸣器,光报警是通过2个发光二极管来显示,2

个红灯,当有害气体含量没超标时灯不亮,超标时显示红色并启动蜂鸣器,

报警子程序执行之前,设定的报警阈值存放在两个变量中,传感器输入AD

转换值后,调用比较程序,小于阈值则执行显示程序,若大于阈值进行声

光报警。

3.2.5按键模块

本设计的主要测量参数有两个,一个是温度一个是危险有害气体浓

度,所以设计两个独立按键,操作方便,对测量参数的切换,能够实现对

参数的观测。

3.3本章小结

在这一章里对室内便携式只能空气品质监测仪的软件设计进行了较详

细的介绍。软件采用了模块化设计的思路,以单片机高级语言C51编程。

在本章开始给出了主程序结构流程图,然后分别对各个子模块的软件流程

进行介绍。(说明:程序见附录二)

1

26

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

4系统调试

4.1系统硬件调试

4.1.1 常见的硬件故障

(1)逻辑错误:硬件的逻辑错误是由于设计错误和加工过程中的工艺性错误所

造成的,主要包括:错线、开路、短路等,其中短路最为常见,在印刷电路板布

线密度高的情况下,极易因工艺原因造成短路。

(2)器件失效:元器件失效主要是因为器件本身已损坏或性能不符合要求,或

者是由于组装错误造成的元器件失效,如电解电容、二极管的极性错误,集成块

安装方向错误等。

(3)可靠性差:系统不可靠可能受多种因素影响,如金属化孔、接插件接触不

良会造成系统时好时坏;内部和外部的干扰、器件负载过大等造成逻辑电平不稳

定;另外,走线和布局的不合理等也是系统可靠性差的重要因素之一。

(4)电源故障:若系统中存在电源故障,则加电后将造成器件损坏。

4.1.2硬件调试方法

焊接好电路以后,用万用表直接检查线路板各处是否有明显短路、断路的地

方,尤其是电源是否短路。接着,焊接各元器件及插座,在焊接过程中要对各元

件做逐一检查,比如二极管极性、电容容量及耐压、电阻值大小等。在插座、元

件焊接完毕后,仔细检查元件面各元件之间裸露部分有无相互接触现象,焊接面

的各焊点间、焊点和近邻线有无连接。最后,再给电路板空载上电(未插芯片),检

查线路板各管脚及插件上的电位是否正确,特别是单片机管脚上的各点电压。若

上述的一切都正常,则硬件调试的准备工作完成。

4.2 系统软件调试

系统调试主要通过反复导入程序验证,观察程序实际运行情况,如果有异常

情况,针对异常情况的发生可能是对应的那一部分的程序故障。在电脑上检查对

应可能出现错误的程序,修改程序,然后再进行导入。反复进行,直到实现功能

1

27

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

为止。

4.3本章小结

本次调试过程中遇到了许多问题,例如系统一上电,声光报警电路就发出报

警声音而LED正常,经程序以及电路检查,发现蜂鸣器都是高电平时工作,单片

机复位后四个I/O口都是高电平,而初始化子程序并没有对P1.3引脚清零,这就

使程序刚运行蜂鸣器就发出报警了。发现这个错误,把子程序中P1.3引脚先清零。

另外,传感器输出电压不稳定,把传感器工作电路接好后急于接到0809上,

运行程序发现还没MQ-2气体进传感器而LCD显示的测量数值明显偏大。经看此

传感器说明书发现传感器需预热一段时间,使传感器内部敏感元件恢复到初始状

态,便于测量结果正确。找到错误原因,在测量前先预热5分钟,接入后续电路,

测量结果正常。

1

28

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

1主要结论

1)本系统综合利用传感器技术,自动监测技术,和微控制器技术,开发了

一套对室内的空气质量进行监控的操作方便、简洁实用的自动监测系统。

2)系统软硬件设计合理,其中单片机软件采用模块化的程序设计方法,各

模块相互独立,提高了系统的可靠性和可扩展性,整个系统具有较高的性能价格

比。

3)系统C51语言编程,程序结构清晰,显示板界面非常友好,使得操作者

在使用该系统时就像是在操作一台实际的控制仪器一样。

4)系统功能独立,配置合理。键盘设置为不同的用户提供了一定的选择空

间。

5)经运行验证,系统具有响应速度快,操作简便,工作可靠等特点。

2展望

1)本系统选用了集传感器,转换器于一体,能直接输出标准模拟信号的传

感器,这无疑会增加系统的成本,今后可选用能达到要求的价格低廉的传感器,

而信号的放大和调理电路部分可自行设计。

2)由于室内各种环境因子相互影响,而本系统的控制输出仅为简单的百分

比信号量,这显然不能满足高精度的控制要求,应引入模糊算法,专家系统等技

术以进一步提高系统的智能决策水平。

3)系统可以开发成多机监控模式,这就能同时监测多个环境室内的空气品

质,通过串行通信传到上位机进行综合处理。

4)可通过网络与其他家电相联系,将把家庭中原来孤立、各不相关的设备

统一起来。

5)本设计可改为多路气体检测,未来可以实现更多的检测功能。

6本设计的主要强调智能化和人性化,例如可以适用于特殊人群——病人,

他们可以把舒适的环境的指标通过相应的按键来控制,按下按键后,通过本系统

控制相应的设备调节来达到是以病人的环境。

7)可以用来开发新型空调,现代空调都是针对空气温湿进行调节,可以将

本设计加入空调内部,使其既能控制温湿度。

1

29

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

参考文献

[1] 余永权.单片机原理及应用[M].北京:电子工业出版社,1998.12

[2] 余锡存、曹国华.单片机原理及接口技术[M].第二版.西安:西安电子

科技大学出版社,2007.12

[3] 诸邦田.电子电路实用抗干扰技术[M].北京:人民邮电出版社,1994.5

[4] 曲喜新.电子元件材料手册[M].北京:电子工业出版社,1989.4

[5] 汪吉鹏、马云峰.微机原理与接口技术[M]北京:高等教育出版社,2001.7

[6] 田崴.电工技术(电工学1[M].北京:高等教育出版社,2010.12

[7] 孙立功.电子技术(电工学2[M].北京:高等教育出版社,2010.12

[8] 马玉春.串行通信协议的研究及应用[J].计算机应用研究.2004

[9] 胡汉才.单片机原理及其接口技术[M].清华大学出版社,1996

[10] 楼然苗,李光飞.51系列单片机设计实例[M].北京航空航天大学出版

社,2003

[11] 赵亮,侯国锐.单片机C语言编程与实例[M].人民邮电出版社,2003

[12] 张毅刚.单片机原理及应用[M].北京:高等教育出版社,2003

[13] 何立民.单片机与嵌入式系统应用[M].北京航空航天出版社,2003

[14]谭浩强.C程序设计(第三版)[M].清华大学出版社,2005

[15]清源科技.Protel 99 SE电路原理图与PCB设计及仿真[M].机械工业出版

社,2007

1

30

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

为期两个多月的毕业设计终于完成了,对我个人而言,凝聚了许多努力和汗

水,也经受住了严峻的考验。和普通的课程设计不同,由于毕业设计的综合性,

几乎用到所学的全部知识,而且是我第一次接触传感器的使用,对我来说这是一

个全新的任务。由于基础过于薄弱,专业知识有限,浮躁的心理让我一开始举步

维艰,满脑子想的就是放弃。在心理最为脆弱的时候,宋老师耐心地开导我,给

我鼓励和信心,毕业设计才得以步入正轨。

万事开头难,从研究课题,搜集材料,到正式投入设计,我花费了很多

时间和精力。对于这次全新的设计,老师给了我很大的自由空间,可以充分发挥

自己的创造思维。但是,对于很多新的尝试,我还是有所拘束。可能是性格使然

吧,每当遇到问题,设计处于混沌状态时,烦躁焦虑接踵而来,让我迷失了方向。

又是宋老师在最繁忙的时候,给我做细致的分析指导,让我茅塞顿开,使设计得

以延续直至顺利完成。所以,在这次毕业设计中,我最感谢的是宋老师,他给我

们提供一流的设计场所,还提供了许多实用的设计资料,为我们的设计提供了保

障。在我看来,宋老师不仅是一位态度严谨,学识渊博的优秀教师,也是一位心

理调节师,他总是能在设计氛围紧张的时候,给同学们带来欢乐,缓解同学们的

压力。他那自信乐观的生活态度,也值得我们学习。从宋老师那里,我不仅学到

了许多专业知识和实践经验,而且懂得许多做人的道理和生活的真谛,这些都是

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

附录一

硬件电气原理图

1

32

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

附录二

程序代码

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P2^7;//定义单片机P1口的第1 (即P1.0)为指示端

sbit DQ = P2^3; //定义DS18B20端口DQ

sbit BEEP=P3^4; //蜂鸣器驱动线

sbit LED2=P3^6 ;

bit presence,flag;

bit compare_th,compare_tl,alarm_on_off=0,temp_th,temp_tl;

sbit LCD_RS = P2^4;

sbit LCD_RW = P2^5;

sbit LCD_EN = P2^6;

unsigned char voc_ad;//AD读取数据/******AD管脚定义*****/

sbit STA=P3^0;

sbit OE=P3^1;

sbit EOC=P3^2;

sbit CLK=P3^3;

float temp1;

float temp2;

float x=0,y=0;

unsigned long int a;

unsigned long int b;

unsigned long int abc;

unsigned long int ab;

uchar code cdis1[ ] = {" NiNing_Read "};

uchar code cdis2[ ] = {" "};

uchar code cdis3[ ] = {" DS18B20 ERR0R "};

uchar code cdis4[ ] = {" PLEASE CHECK "};

uchar code cdis5[ ] = {" TEMP: "};

uchar code cdis6[ ] = {"voc: ppm"};

unsigned char data temp_data[2] = {0x00,0x00};

unsigned char data temp_alarm[2] = {0x20,0x10};

unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00}; //温度值显示

unsigned char data display1[5] = {0x00,0x00,0x00,0x00,0x00}; //温度报警值

显示

unsigned char data RomCode[8] =

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

unsigned char code mytab1[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

1

33

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

unsigned char Temp,temp_comp,timecount,count;

unsigned char crc;

void Disp_Temp_alarm(uchar addr,uchar num);

void spk(uchar addr);

void set_temp_alarm();

void temp_compare();

void beep();

void voc_warning();

/******************************************************************

*/

void delay1(int ms)

{

unsigned char z;

while(ms--)

{

for(z = 0; z<250; z++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

/******************************************************************

/

/*检查LCD忙状态

*/

/*lcd_busy1时,忙,等待。lcd-busy0,闲,可写指令与数据。 */

/******************************************************************

/

bit lcd_busy()

{

bit result;

LCD_RS = 0;

LCD_RW = 1;

LCD_EN = 1;

delayNOP();

result = (bit)(P0&0x80);

LCD_EN = 0;

return(result);

}

/******************************************************************

*/

/*写指令数据到LCD

*/

/*RS=LRW=LE=高脉冲,D0-D7=指令码。

*/

/******************************************************************

1

34

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

*/

void lcd_wcmd(uchar cmd)

{

while(lcd_busy());

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

_nop_();

_nop_();

P0 = cmd;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

/******************************************************************

*/

/*写显示数据到LCD

*/

/*RS=HRW=LE=高脉冲,D0-D7=数据。

*/

/******************************************************************

*/

void lcd_wdat(uchar dat)

{

while(lcd_busy());

LCD_RS = 1;

LCD_RW = 0;

LCD_EN = 0;

P0 = dat;

delayNOP();

LCD_EN = 1;

delayNOP();

LCD_EN = 0;

}

/******************************************************************

*/

/*自定义字符写入CGRAM

*/

/******************************************************************

*/

void writetab()

{

unsigned char i;

lcd_wcmd(0x40); //CGRAM

for (i = 0; i< 8; i++)

lcd_wdat(mytab1[i]);

}

/******************************************************************

1

35

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

*/

/* LCD初始化设定

*/

/******************************************************************

*/

void lcd_init()

{

delay1(15);

lcd_wcmd(0x01); //清除LCD的显示内容

lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x38);

delay1(5);

lcd_wcmd(0x0c); //显示开,关光标

delay1(5);

lcd_wcmd(0x06); //移动光标

delay1(5);

lcd_wcmd(0x01); //清除LCD的显示内容

delay1(5);

writetab(); //自定义字符写入CGRAM

}

/******************************************************************

*/

/* 设定显示位置

*/

/******************************************************************

*/

void lcd_pos(uchar pos)

{

lcd_wcmd(pos | 0x80); //数据指针=80+地址变量

}

/******************************************************************

*/

/*us级延时函数

*/

/******************************************************************

*/

void Delay(unsigned int num)

{

while( --num );

}

/******************************************************************

*/

/*初始化ds1820

*/

/******************************************************************

*/

1

36

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

Init_DS18B20(void)

{

DQ = 1; //DQ复位

Delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

Delay(90); //精确延时 大于 480us

DQ = 1; //拉高总线

Delay(8);

presence = DQ; //如果=0则初始化成功 =1则初始化失败

Delay(100);

DQ = 1;

return(presence); //返回信号,0=presence,1= no presence

}

/******************************************************************

*/

/* 读一个字节

*/

/******************************************************************

*/

ReadOneChar(void)

{

unsigned char i = 0;

unsigned char dat = 0;

for (i = 8; i > 0; i--)

{

DQ = 0; // 给脉冲信号

dat >>= 1;

DQ = 1; // 给脉冲信号

if(DQ)

dat |= 0x80;

Delay(4);

}

return (dat);

}

/******************************************************************

*/

/* 写一个字节

*/

/******************************************************************

*/

WriteOneChar(unsigned char dat)

{

unsigned char i = 0;

for (i = 8; i > 0; i--)

{

DQ = 0;

DQ = dat&0x01;

Delay(5);

DQ = 1;

1

37

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

dat>>=1;

}

}

/******************************************************************

*/

/* 温度报警值写入DS18B20

*/

/******************************************************************

*/

Write_Temperature_alarm(void)

{

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0x4e); //将设定的温度报警值写入 DS18B20

WriteOneChar(temp_alarm[0]); //TH

WriteOneChar(temp_alarm[1]); //TL

WriteOneChar(0x7f); //12位精确度

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0x48); //把暂存器里的温度报警值拷贝到

EEROM

}

/******************************************************************

*/

/* 读取64位序列码

*/

/******************************************************************

*/

Read_RomCord(void)

{

unsigned char j;

Init_DS18B20();

WriteOneChar(0x33); // 读序列码的操作

for (j = 0; j < 8; j++)

{

RomCode[j] = ReadOneChar() ;

}

}

/******************************************************************

*/

/*DS18B20CRC8校验程序

*/

/******************************************************************

*/

uchar CRC8()

{

uchar i,x; uchar crcbuff;

crc=0;

for(x = 0; x <8; x++)

1

38

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

{

crcbuff=RomCode[x];

for(i = 0; i < 8; i++)

{

crc >>= 1;

else {

crc >>= 1;

crc |= 0x80;

}

crcbuff >>= 1;

}

}

return crc;

}

if(((crc ^ crcbuff)&0x01)==0)

crc ^= 0x18; //CRC=X8+X5+X4+1

/******************************************************************

*/

/* 数据转换与显示

*/

/******************************************************************

*/

Disp_RomCode(uchar H_num)

{

uchar j;

if(H_num==1)

lcd_pos(0x00);

if(H_num==2)

lcd_pos(0x40);

for(j=0;j<8;j++)

{

Temp = RomCode[j];

display[0]=((Temp&0xf0)>>4);

if(display[0]>9)

{ display[0]=display[0]+0x37;}

else{display[0]=display[0]+0x30;}

lcd_wdat(display[0]); //高位数显示

display[1]=(Temp&0x0f);

if(display[1]>9)

{display[1]=display[1]+0x37;}

else {display[1]=display[1]+0x30;}

lcd_wdat(display[1]); //低位数显示

}

}

/******************************************************************

*/

/* 读取温度

*/

/******************************************************************

1

39

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

*/

Read_Temperature(void)

{

uchar i;

TR0=0; //关中断,防止读数错误

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0x44); //启动温度转换

Init_DS18B20();

WriteOneChar(0x55); //匹配ROM命令

for(i=0;i<8;i++)

WriteOneChar(RomCode[i]);

WriteOneChar(0xBE); //读取温度寄存器

temp_data[0] = ReadOneChar(); //温度低8

temp_data[1] = ReadOneChar(); //温度高8

temp_alarm[0] = ReadOneChar(); //温度报警TH

temp_alarm[1] = ReadOneChar(); //温度报警TL

temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

STA=0;

OE=0;

STA=1; //启动AD转换

_nop_();

STA=0;

while(EOC==1);

{

OE=1;

1

40

/

/

/**

**

**

**

**

AD

**

**

**

**

**/

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

voc_ad=P1;

OE=0;

}

TR0=1; //开中断

}

/******************************************************************

*/

/* 数据转换与温度显示

*/

/******************************************************************

*/

Disp_Temperature()

{

uchar s=0;

if(temp_data[1]>127) //温度为负值

{

temp_data[0]=(~temp_data[0])+1; //取反加一,将补码变成原码

if((~temp_data[0])>=0xff)

temp_data[1]=(~temp_data[1])+1;

else temp_data[1]=~temp_data[1];

s=1;

}

display[4]=temp_data[0]&0x0f;

display[0]=(display[4]*10/16)+0x30;

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

display[3]=display[4]/100+0x30;

display[1]=display[4]%100;

display[2]=display[1]/10+0x30;

display[1]=display[1]%10+0x30;

if(display[3]==0x30) //高位为0,不显示

{

display[3]=0x20;

if(display[2]==0x30) //次高位为0,不显示

display[2]=0x20;

}

if(s)

display[3]=0x2d; //显示负号

lcd_pos(0x07);

lcd_wdat(display[3]); //百位数显示

lcd_wdat(display[2]); //十位数显示

lcd_wdat(display[1]); //个位数显示

lcd_wdat('.');

lcd_wdat(display[0]); //小数位数显示

lcd_wdat(0x00); //显示自定义字符

lcd_wdat('C'); //显示C

temp1=voc_ad;

temp1 = temp1*(4560/255); //5V参考电压

a=temp1;

x=a/1000+((a/100)%10)*0.1+((a%100)/10)*0.01+(a%10)*0.001;

1

41

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

y=1.64*x*x*x*x*x*x*x*x*x;

b=y;

display1[4]=b/10000+0x30;

display1[3]=(b%10000)/1000+0x30;

display1[2]=(b%1000)/100+0x30;

display1[1]=(b%100)/10+0x30;

display1[0]=b%10+0x30;

lcd_pos(0x48);

lcd_wdat(display1[4]); //万位数显

lcd_wdat(display1[3]); //千位数显示

lcd_wdat(display1[2]); //百位数显示

lcd_wdat(display1[1]); //十位数显示

lcd_wdat(display1[0]); //个位数显示

abc=b;

}

/******************************************************************

*/

/* 蜂鸣器响一声

*/

/******************************************************************

*/

void beep()

{

unsigned char y;

for (y=0;y<100;y++)

{

Delay(70);

BEEP=!BEEP; //BEEP取反

}

BEEP=1; //关闭蜂鸣器

Delay(25000);

}

/******************************************************************

*/

/* ROMCORD 显示菜单

*/

/******************************************************************

*/

void RomCode_Menu ()

{

uchar m;

lcd_init(); //初始化LCD

lcd_pos(0); //设置显示位置为第一行

for(m=0;m<16;m++) //显示字符

lcd_wdat(cdis1[m]);

Read_RomCord(); //读取64位序列码

CRC8(); //CRC效验

if(crc==0) //CRC效验正确

{

Disp_RomCode(2); //显示64位序列码

}

1

42

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

}

*/

/* DS18B20 ERROR 显示菜单

*/

/******************************************************************

*/

void Error_Menu ()

{

uchar m;

lcd_init(); //初始化LCD

lcd_pos(0); //设置显示位置为第一行的第1个字符

for(m=0;m<16;m++)

lcd_wdat(cdis3[m]); //显示字符

lcd_pos(0x40); //设置显示位置为第二行第1个字符

for(m=0;m<16;m++)

lcd_wdat(cdis4[m]); //显示字符

}

/******************************************************************

*/

/* DS18B20 正常显示菜单

*/

/******************************************************************

*/

void Natural_Menu ()

{

uchar m;

lcd_init(); //初始化LCD

lcd_pos(0); //设置显示位置为第一行的第1个字符

for(m=0;m<16;m++)

lcd_wdat(cdis5[m]); //显示字符

lcd_pos(0x40); //设置显示位置为第二行第1个字符

for(m=0;m<16;m++)

lcd_wdat(cdis6[m]); //显示字符

Read_Temperature();

Disp_Temperature(); //显示实时温度值

}

/**********************************************************/

// Time0中断函数

/**********************************************************/

void Time0(void) interrupt 1 using 0

{

TH0=0x4c; //50ms定时

TL0=0x00;

timecount++;

if(timecount>9)

{

timecount=0;

flag=~flag;

}

}

void t1(void) interrupt 3 //using 1

{

TH1=(65536-2)%256;

TL1=(65536-2)/256;

CLK=~CLK;

}

/*********************************************************/

1

43

/******************************************************************

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

// 温度比较函数

/*********************************************************/

void temp_compare()

{

if(temp_comp >= temp_alarm[0]) //比较 TH

{

compare_th=1;

}

else compare_th=0;

if(temp_comp < temp_alarm[1]) //比较 TL

{

compare_tl=1;

}

else compare_tl=0;

if(compare_th)

{ if(!alarm_on_off) //静音选择

beep();

count=temp_alarm[0];

}

if(compare_tl)

{ if(!alarm_on_off) //静音选择

beep();

count=temp_alarm[1];

}

if(abc>1000)

{

if(!alarm_on_off)

beep();

LED2=0;

}

}

/*******数据处理********/

void ADC0809_Intit(void)

{

OE=0;

STA=0;

}

/******************************************************************

*/

/* 主函数

*/

/******************************************************************

*/

void main()

{

uchar m;

TMOD=0x11; TH0=0x4c; TL0=0x00; //50ms定时

TH1=(65536-2)%256;

TL1=(65536-2)/256;

ET1=1; //允许T0中断

EA=1; //开总中断

TR1=1; //启动定时器T0

ET0=1; TR0=1;

P0=0;

P2&=0x1F;

Init_DS18B20();

ADC0809_Intit();

Write_Temperature_alarm(); //设定报警上下限温度值

1

44

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

if(presence)

{

Error_Menu ();

do

{

Init_DS18B20();

beep();

}

while(presence);

} //设定报警上下限温度值

RomCode_Menu (); //显示RomCode

for(m=0;m<10;m++)

Delay(50000);

Natural_Menu (); //正常显示界面

Delay(50000);

while(1)

{

LED1=1;

LED2=1;

Read_Temperature(); //读取当前温度

Delay(50000);

Disp_Temperature(); //更新当前温度

temp_compare(); //温度上下限比较

if(compare_th)

{

//上限报警

LED1=0;

Delay(10000);

}

if(compare_tl)

{

LED1=0;

Delay(10000);

}

}//end of while(1)

} //end of main()

/**********************************************************/

1

45

精品企业管理资料,用心整理的下载即可修改使用!!欢迎下载使用!

编号:2

1

46

苏州限购限售升级-伽蓝集团分公司

室内空气质量检测仪设计

更多推荐

室内空气检测设备