您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页基于STC89C52单片机的温湿度检测系统设计 推荐

基于STC89C52单片机的温湿度检测系统设计 推荐

来源:飒榕旅游知识分享网
基于AT89C52单片机的温湿度检测系统设计

基于STC89C52单片机的温湿度检测

系统设计

摘要

随着人们的生活及其生产水平的不断提高,对生活环境和生产环境的要求就显的尤为重要,温湿度的控制就是一个典型的例子,因此温湿度检测系统就是现代生产生活中应运而生的一种智能、快捷、方便可靠的检测系统,特别是在工业生产中如果检测得不准确就会发生许多的生产事故。要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。本设计是以单片机为核心,配合温湿度传感器,以及相关的外围电路组成的检测系统,可以接收所测环境的温度和湿度信号,检测人员可以通过LCD显示的数据,实时监控环境的温度和湿度情况。所有的测量操作都可以通过主机控制软件来实现,温度和湿度传感器得到的测量信号,经电路转换为电信号,然后通过转换送到单片机进行数据处理,经软件分析处理后送显示装置。

本系统包括系统硬件和软件设计,可靠性高,结构简单,实现了对温湿度的自动调节。系统还应用RS232与上位机相连接,可以设置自动记录温度、湿度的相关的参数,也可以设置每隔一定的时间自动记录,可用在气象的观察方面。 关键词:STC89C52单片机,温湿度传感器, LCD显示

As people life level of production and improve the living environment and production environment to the demands of the significant particularly important, control of temperature and humidity is one example, so the temperature and humidity detection system is the modern production and life of a kind of intelligence have emerged in, quick, convenient and reliable detection system, especially in the industrial production, if detection is not accurate will happen many production accidents. For modern people to work, scientific research, and provide a better life more

基于AT89C52单片机的温湿度检测系统设计

convenient facilities will need from single chip technology of digital control to all, intelligent control direction. This design is based on single chip microcomputer as the core, with temperature and humidity sensor, and related peripheral circuit composed of detection system, can receive the environment temperature and humidity signal, testing personnel can through the LCD display data, real-time monitoring of environmental temperature and humidity conditions. This system including the system hardware and software design, high reliability, simple structure, realize the automatic adjustment of the temperature and humidity. System is used RS232 and superordination machine connected, can set up automatic recording of temperature and humidity in related parameters, can also set every certain time to be automatic records, can be used in meteorological observation.

Key words: STC89C52 microcontroller, temperature and humidity sensor, LCD display

目录

第1章 概述 ................................................. 2

1.1课题的研究背景.............................................................................................. 2 1.2温湿度检测的发展状况以及存在的问题...................................................... 3 1.3本课程设计的主要内容.................................................................................. 4 第2章 系统总体方案设计 ..................................... 4

2.1 温湿度传感器................................................................................................. 5

1、DHT11产品概述 ...................................................................................... 5 2接口说明....................................................................................................... 5 3、 电源引脚............................................................................................ 6 4、串行接口 (单线双向)............................................................................ 6 5、DHT11引脚说明......................................................................................... 6 6、 焊接信息.................................................................................................. 6 7、注意事项.................................................................................................... 7 2.2 RS232接口.................................................................................................... 7 2.3 单片机STC89C52............................................................................................ 7 2.4 LCD1602........................................................................................................... 9 第3章 系统的硬件设计和连接 ................................ 10

3.1主控模块........................................................................................................ 10

1

基于AT89C52单片机的温湿度检测系统设计

3.2显示模块........................................................................................................ 12 3.3 温度和湿度采集模块................................................................................... 12 3.4 键盘设计....................................................................................................... 14 3.5与上位机相连电路的设计............................................................................ 15 3.6 报警电路设计............................................................................................... 15 第4章 系统软件方案的设计 .................................. 16

4.1 程序流程图................................................................................................... 16 第5章 总结与展望 .......................................... 36 参考文献 ................................................... 37

第1章 概述

1.1课题的研究背景

工业生产中有些场合需要使用精密的机台设备,这些设备的精密度高、价格高,因此为了保证产品的质量及机台的使用寿命,对其环境的要求也很高,尤其的是对温度、湿度的控制。例如在我工作的生产发光二极管LED的工业现场,前面的两道工序固晶片和焊线要求的精度非常高,晶片必须固到碗杯的中心点,偏差不可超过1/5晶片的宽度,且对胶量的控制也有严格的要求,只有这道工序做好了,

2

基于AT89C52单片机的温湿度检测系统设计

下一个工序焊线才会顺利,否则焊线将会出现很多异常,不仅会降低产量也会造成质量问题,因此要求每三个小时记录一次室内的温湿度,且要保证其温度在18℃--23℃之间,湿度不可超过60%。

随着信息产业的发展及工业化的进步,温度和湿度不仅仅表现在以上几个方面直接或间接影响着人类基本生活条件, 还表现在对工生物制品、医药卫生、科学研究、国防建设等方面的影响。针对以上情况,研制可靠且实用的温湿度控制器显得非常重要。常用温湿度传感器的非线性输出及一致性较差,使温湿度的测量方法和手段相对较复杂,且给电路的调试带来很大的困难。传统的温湿度测量多采用模拟小信号传感器,不仅信号调理电路复杂,且温湿度值的标定过程也极其复杂,并需要使用昂贵的标定仪器设备。因此对于温湿度控制器的设计有着很大的现实生产意义。

本文设计的是基于单片机STC89C52的温湿度检测和控制系统,主要以广泛应用的DHT11作为温度和湿度的检测,该仪器具有测量精度较高、硬件电路简单、并能很好的进行显示,可测试不同环境温湿度的特点。另外和控制电路相连,可以进行加湿电路和除湿电路的控制,使温度和湿度参数在预先设定的范围内,不需要人的直接参与。本系统还通过RS232和上位机相连,可以设置每隔一定的时间进行温度和湿度的采集,上传到上位机,以供查询。

1.2温湿度检测的发展状况以及存在的问题

传统的温度和湿度检测系统主要有以下几种: (1)水汽压(e):是水汽在大气总压力中的分压力。它表示了空气中水汽的绝对含量的大小,以毫巴为单位。 (2)相对湿度(rh):湿空气中实际水汽压e与同温度下饱和水汽压E的百分比,相对湿度的大小能直接表示空气距离饱和的相对程度。空气完全干燥时,相对湿度为零。相对湿度越小,表示当时空气越干燥。当相对湿度接近于100%时,表示空气很潮湿,越接近于饱和。

(3)露点(或霜点)温度:指空气在水汽含量和气压都不改变的条件下,冷却到饱和时的温度。

(4)干湿球温度表:用一对并列装置的、形状完全相同的温度表,一支测气温,称干球温度表,另一支包有保持浸透蒸馏水的脱脂纱布,称湿球温度表。 (5)发湿度表(计):利用脱脂人发(或牛的肠衣)具有空气潮湿时伸长,干燥时缩短的特性,制成毛发湿度表或湿度自记仪器,它的测湿精度较差,毛发湿度表通常在气温低于-10℃时使用。

(6)电阻式湿度片:利用吸湿膜片随湿度变化改变其电阻值的原理,常用的有碳膜湿敏电阻和氯化锂湿度片两种。前者用高分子聚合物和导电材料碳黑,加上粘合剂配成一定比例的胶状液体,涂覆到基片上组成的电阻片;后者是在基片上涂上一层氯化锂酒精溶液,当空气湿度变化时,氯化锂溶液浓度随之改变从而也改变了测湿膜片的电阻。

(7)薄膜湿敏电容:是以高分子聚合物为介质的电容器,因吸收(或释放)水汽而改变电容值。它制作精巧,性能优良,常用在探空仪和遥测中。 随着智能检测系统的飞速发展,基于单片机的温湿度检测系统将多传感器系统结合在一起。如何把多传感器集中于一个检测控制系统,综合利用来自多传感器的信息,获得对被测对象的可靠了解和解释,以利于系统做出正确的响应、决策和

3

基于AT89C52单片机的温湿度检测系统设计

控制,是智能检测控制系统中需要解决的首要问题。在温湿度要求严格的场合,利用多传感技术可以提高系统的可靠性和精度,亦可以提高系统的时间空间的覆盖范围。

1.3本课程设计的主要内容

单片机是系统的控制核心,所以单片机的性能关系到整个系统的好坏。因此单片机的选择,对所设计系统的实现以及功能的扩展有着很大的影响。单片机种类很多,在众多51系列单片机中,较为常用的是ATMEL 公司的AT89C51和AT89S52单片机,AT89C51片内4KROM是Flash工艺的,使用专用的编程器自己就可以随时对单片机进行电擦除和改写,片内有128字节的RAM。而AT89S52含有在系统可编程的Flash存储器,片内有8K闪存,RAM的容量也较AT89C51大,为256字节。显然这种单片机优点更多,开发时间也大为缩短。在本次设计中选用了STC89C52单片机。

键盘接口电路较为简单,而显示部分有两种方案供选择:一种为LCD,一种为LED。LCD液晶显示的像素单元是整合在同一块液晶版当中分隔出来的小方格。通过数码控制这些极小的方格进行显像。显示非常细腻但是造价很高。而LED数码显示中每一个像素单元就是一个发光二极管,如果是单色,一般是红色发光二极管。如果是彩色,一般是三个三原色小二极管组成的一个大二极管。这些二极管组成的矩阵由数码控制实时显示文字或图象,造价相对低廉,显示效果也较好。 本设计中,最终选用的集成温度传感器DHT11,采集到的温湿度信号送至单片机,实现温湿度的显示与控制。 系统主要由以上元器件组成,通过硬件电路和软件程序的设计,实现系统的基本功能。

第2章 系统总体方案设计

本设计是基于单片机对数字信号的高敏感和可控性、温湿度传感器可以产生模拟信号,和A/D模拟数字转换芯片的性能,此设计以STC89C52基本系统为核心的一套检测系统,其中包括单片机、复位电路、温湿度检测、键盘及显示、报警电路、系统软件等部分的设计。系统总体方框图如图2.1。

4

基于AT89C52单片机的温湿度检测系统设计

显示电路 单片机 键 盘 控制 电平变换 系统晶振 PC机 系统重点及组成:温湿度的检测 温湿度的显示 单片机与PC机间的通信 通过开关量控制实现温湿度上下限调节 温湿度传感器 报警电路 图2.1 系统总体框图 2.1 温湿度传感器

1、DHT11产品概述

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

2接口说明

建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻

5

基于AT89C52单片机的温湿度检测系统设计

3、 电源引脚

DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。

4、串行接口 (单线双向)

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右, 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

5、DHT11引脚说明

Pin 1 2 3 4 名称 VDD DATA NC GND 注释 供电 3-5.5VDC 串行数据,单总线 空脚,请悬空 接地,电源负极 6、 焊接信息

手动焊接,在最高260℃的温度条件下接触时间须少于10秒。

6

基于AT89C52单片机的温湿度检测系统设计

7、注意事项

(1)避免结露情况下使用。

(2)长期保存条件:温度10-40℃,湿度60%以下

2.2 RS232接口

RS232接口是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。 该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。随着设备的不断改进,出现了代替DB25的DB9接口,现在都把RS232接口叫做DB9。

2.3 单片机STC89C52

STC89C52是一种低功耗、高性能CMOS八位微控制器,具有8K在系统可编程

7

基于AT89C52单片机的温湿度检测系统设计

Flash存储器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许ROM在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使其为众多嵌入式控制应用系统提供灵活的解决方案。 2.3.1 主要特性

(1) 与MCS-51单片机产品兼容;

(2) 8K字节在系统可编程Flash存储器; (3) 1000次擦写周期;

(4) 全静态操作:0Hz~33Hz; (5) 三级加密程序存储器; (6) 32个可编程I/O口线; (7) 三个16位定时器/计数器; (8) 八个中断源;

(9) 全双工UART串行通道; (10) 低功耗空闲和掉电模式;

(11) 掉电后中断可唤醒; 图2.3 STC89C52芯片的引脚图 (12) 看门狗定时器; (13) 双数据指针; (14) 掉电标识符。

如图2.3所示STC89C52芯片的引脚图 VCC:电源 Vss:地 P0口:8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在Flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。

P1口:具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如表3-1所示。在Flash编程和校验时,P1口接收低8位地址字节。

P2口:具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动四个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在方位外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。在Flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动四个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

P3口亦作为STC89C52特殊功能(第二功能)使用

8

基于AT89C52单片机的温湿度检测系统设计

RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。DISRTO默认状态下,复位高电平有效。

ALE/PROG:控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚(PROG)也用作编程输入脉冲。

在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时, ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当89S52PSEN:

从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。

EA/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序

存储器读取指令,EA必须接地。 为执行内部程序指令,EA应该接VCC。 在Flash编程期间,EA也接收12伏VPP电压。

XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。

XTAL2:振荡器反相放大器的输出端。

2.4 LCD1602

工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线

VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中: 引脚 符号 功能说明 1 2 3 4 9

VSS VDD V0 RS 一般接地 接电源(+5V) 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 RS为寄存器选择,高电平1时选择数据寄存器、低电平0时

基于AT89C52单片机的温湿度检测系统设计

选择指令寄存器。 5 6 7 8 9 10 11 12 13 14 15 R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BLA R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 E(或EN)端为使能(enable)端,下降沿使能。 低4位三态、 双向数据总线 0位(最低位) 低4位三态、 双向数据总线 1位 低4位三态、 双向数据总线 2位 低4位三态、 双向数据总线 3位 高4位三态、 双向数据总线 4位 高4位三态、 双向数据总线 5位 高4位三态、 双向数据总线 6位 高4位三态、 双向数据总线 7位(最高位)(也是busy flag) 背光电源正极 16 BLK 背光 电源负极 寄存器选择控制表 RS R/W 操作说明 0 0 1 1 0 1 0 1 写入指令寄存器(清除屏等) 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 写入数据寄存器(显示各字型等) 从数据寄存器读取数据

第3章 系统的硬件设计和连接

3.1主控模块

采用STC89C52单片机作为系统的控制器。Pl口控制数码管显示温度和湿度值。P2口与DHT11连接.实现湿度模拟电压量转换为数字量便于单片机处理。键盘控制采用PO口.其中PO.O是温度的设置,PO.1是湿度的设置,PO.2/PO.3是分别对温度与湿度的上/下限值进行设置。原理如下图:

10

基于AT89C52单片机的温湿度检测系统设计

图3.1 STC89C52单片机各引脚功能

11

基于AT89C52单片机的温湿度检测系统设计

3.2显示模块

VCCJ1RP110KVCCRSRWEP00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P273938373635343332212223242526RS27RW28EVCC12345678910111213141516LCD1602U1123456781312151431191891716P10P11P12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWRAT89S51RXDTXDALE/PPSEN10113029 3.3 温度和湿度采集模块

1.通讯过程如图1所示

图1

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

12

基于AT89C52单片机的温湿度检测系统设计

图2

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

数字0信号表示方法如图4所示

图4

数字1信号表示方法.如图5所示

13

基于AT89C52单片机的温湿度检测系统设计

图5

3.4 键盘设计

用了几个简单的按键将它们拼成了一个简易的键盘。为提高CPU的效率,键盘采用中断方式。按键对单片机的接口电路图如图所示。

行信号(KEY)接到高电平,当没有键按时,行线与列线(KEYSCAN)是断开的,且行线都是高电平(1111),行信号作为的输入端、列信号作为的输出端。可以设置列线初始状态为低电平(0000)。信号为从上到下的顺序

当有键按下时,假如是K1按下,行信号与列信号接通,这时相应的行线(KEY0)变为低电平(01111),可以肯定第一行(K1,5,9,13)有键按下。 下面就要运用扫描的原理了:

14

基于AT89C52单片机的温湿度检测系统设计

1、因为只知道第一行有键按下,不知道是那个,可以设置列信号为0111,这时行信号变为(1111)(注:假设时钟周期很短,手还没松开,即键还在按下的状态)

2、设置列信号为1011,行信号也变成(1111) 3、设置列信号为1101,行信号也变成(1111)

4、设置列信号为1110,行信号也变成(0111),这时就可以肯定是第一个键按下。

3.5与上位机相连电路的设计

通过和MAX232和上位机相连接,如图3-9所示。在大气气候的检测中需要做记录时,可以通过设置单片机的参数,每隔一定的时间进行自动的做记录,省去人工的记录麻烦。Max232的T1IN和单片机的P3.2相连,R1 OUT和单片机的P3.1相连。

3.5 单片机系统与上位机的连接

3.6 报警电路设计

本设计采用峰鸣音报警电路。峰鸣音报警接口电路的设计只需购买市售的压电式蜂鸣器,然后通过MCS-51的1根口线经驱动器驱动蜂鸣音发声。压电式蜂鸣器约需10mA的驱动电流,可以使用TTL系列集成电路7406或7407低电平驱动,也可以用一个晶体三极管驱动。在图中,P3.2接晶体管基极输入端。当P3.2输出高电平“1”时,晶体管导通,压电蜂鸣器两端获得约+5V电压而鸣叫;当P3.2输出低电平“0”时,三极管截止,蜂鸣器停止发声。

15

+5V

AT89S52 PB2130UP002A

基于AT89C52单片机的温湿度检测系统设计

图3.6 三极管驱动的峰鸣音报警电路

第4章 系统软件方案的设计

温度控制主程序的设计应考虑以下问题:(1)温湿度采样,数字滤波;(2)越限报警和处理;(3)温度标度转换;(4)温湿度显示。通常,符合上述功能的温度控制程序由主程序和T0中断服务程序两部分组成。

在该软件系统中,定时器T0为工作方式1,定时周期为125ms,8次定时器中断为1S,由于实际环境温度和湿度变化是连续和平缓的,故这里采用分段定值平缓滤波算法处理每次测得的温度和湿度值,有效防止了突发干扰使测得值波动很大,导致反馈系统关启工作,影响系统的稳定,提高了系统的抗干扰性。

4.1 程序流程图

LCD1602头文件

#ifndef __LCD_1602_CLIMBERWIN__ #define __LCD_1602_CLIMBERWIN__

#define uchar unsigned char #define uint unsigned int #include

#include\"lcd1602define.h\" /******Port Definitions*****/

#define LCD_Data P0 //LCD的数据口 sbit LCD_BF=LCD_Data^7; //LCD忙信号位 sbit LCD_RS = P2^7; sbit LCD_RW = P2^6; sbit LCD_EN = P2^5;

unsigned char dis_buf[3]; //数值显示缓冲区 unsigned char table[11] = \"0123456789 \";//字码

/*定义子程序*/

void LCD_ClrAll(void); //清屏

16

基于AT89C52单片机的温湿度检测系统设计

void Judge_LCD_busy(void); //检测是否忙碌 void LCD_Write(uchar WriteData); //写控制字 void LCD_write_data(uchar LCD_data); //写数据显示 void LCD_cursor(uchar x); //光标起始地址

void LCD_printc(unsigned char lcd_data) ; //输出一个字符 void LCD_prints(unsigned char *lcd_string);//输出字符串 void delay_ms(unsigned char i);//1ms延时

//************************************************************************ /*LCD1602忙碌判断子程序*/

void Judge_LCD_busy(void) //判断LCD1602是否忙状态 {

while(1) {

LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_Data=0xff;

LCD_EN=1; //EN 是 1—0 使能

if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。 }

LCD_EN=0; }

/******LCD清屏***************/ void LCD_ClrAll(void) {

Judge_LCD_busy(); //判断是否忙碌 LCD_RS=0; LCD_RW=0; LCD_Data=0x01; LCD_EN=1; LCD_EN=0; }

/*******LCD写数据定义各种模式*********/

void LCD_Write(uchar WriteData) //写指令到LCD {

Judge_LCD_busy(); LCD_RS=0; LCD_RW=0;

LCD_Data=WriteData; //把WriteData的数据送到数据口 LCD_EN=1; LCD_EN=0;

17

基于AT89C52单片机的温湿度检测系统设计

}

/********LCD显示数据***********/

void LCD_write_data(uchar LCD_data) //输出一个字节数据到LCD {

Judge_LCD_busy(); LCD_RS=1; LCD_RW=0;

LCD_Data=LCD_data; LCD_EN=1; LCD_EN=0; }

/****光标位置的确定***/

void LCD_cursor(uchar x) //LCD光标定位到x处 {

LCD_Write(0x80+x); //第一行地址是0x80 }

/*输出一个字符*/

void LCD_printc(unsigned char lcd_data) {

LCD_write_data(lcd_data); }

/*输出字符串*/

void LCD_prints(unsigned char *lcd_string) {

unsigned char i=0;

while(lcd_string[i]!=0x00) {

LCD_write_data(lcd_string[i]); i++; } }

/*显示整数*/

void LCD_ints(unsigned char num) {

signed char i=0;

for(i=0;i<3;i++)//拆分bcd {

18

基于AT89C52单片机的温湿度检测系统设计

dis_buf[i] = num%10;; num = num/10; }

for(i=2;i>0;i--)//灭零 {

if(dis_buf[i]==0)dis_buf[i]=10; else break; }

for(i=2;i>=0;i--)//逐个显示 {

LCD_write_data(table[dis_buf[i]]); } }

/*初始化程序*/

void LCD_initial(void) //初始化LCD {

LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_Write(LCD_DISPLAY_DOUBLE_LINE); LCD_ClrAll(); }

#endif

UART头文件

bit flag_uart = 0; //字符串接受完成后标志位置位,须软件复位 unsigned char S_LEN = 4;

unsigned char Res_buf[20]={0};

void Uart_init() { ES = 1; //set ES SCON = 0x52; //set SM1、REN and TI; TMOD = 0x20; //set M1,方式2; TH1 = 0xf3; TL1 = 0xf3; //baud rate 2400b/s TR1 = 1; //计数使能 }

void Uart_sc(unsigned char byte) //发送单字符 { while(!TI);

19

基于AT89C52单片机的温湿度检测系统设计

SBUF = byte; TI = 0; }

void Uart_ss(unsigned char *p,bit flag) //发送字符串 { while(*p) { Uart_sc(*p++); } if(flag==1) { Uart_sc(0x0D); Uart_sc(0x0A); //结尾发送回车换行 } }

KEY头文件

unsigned char code row_scan[4]={0xef,0xdf,0xbf,0x7f};

void delay_1ms(unsigned int i) //1ms延时 { unsigned char x,j; for(j=0;junsigned char key_scan() { unsigned char i,j; unsigned char temp,key_vaul; for(i=0;i<4;i++) { P1=row_scan[i]; temp=0x01; for(j=0;j<4;j++) {

20

基于AT89C52单片机的温湿度检测系统设计

if(!(P1&temp)) { key_vaul=i*4+j+1; while(!(P1&temp)); return key_vaul; } temp<<=1; } } }

bit key_check() //检测有无键按下 { bit key_flag=0; //键标志。有键按下时为1 P1=0x0f; if(P1!=0x0f) { delay_1ms(1); if(P1!=0x0f) { key_flag=1; //有键按下 } else key_flag=0; //为抖动 } return key_flag; }

DHT11头文件

#ifndef __DHT11_H__ #define __DHT11_H__

sbit DT0 = P2^0; sbit DT1 = P2^1; sbit BEEP = P2^3; #define OK 1 #define ERROR 0 #define NUMBER 20 #define SIZE 5

static unsigned char status; // 存放五字节数据的数组 static unsigned char value_array_0[SIZE];

21

基于AT89C52单片机的温湿度检测系统设计

static unsigned char value_array_1[SIZE];

int humi_value0,temp_value0,humi_value1,temp_value1;

void delay_ms(unsigned char i) //ms延时 { unsigned char x,j; for(j=0;jvoid delay(unsigned char x) //x*0.14MS { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } }

void delay_1(unsigned char x) //x*1.4MS { unsigned char i; while(x--) { for (i = 0; i<130; i++) {} } }

void beep() { unsigned char i; BEEP=0; for(i=0;i<6;i++) { BEEP = !BEEP; delay_1(5000); delay_1(5000); } }

void delay_10us() { unsigned char i; i--;i--;i--;i--;i--;i--; }

22

基于AT89C52单片机的温湿度检测系统设计

void Node_sensor_0(unsigned int TEP,unsigned int DAM,int flag_send) { unsigned char i,j,N=0; unsigned char buf[5] = {0}; unsigned char tem,teml=10,temh=40; DT0 = 0; delay_ms(30); DT0 = 1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); DT0 = 1; if(DT0==0) //是否响应信号 { while(DT0==0); //跳过 80us DHT响应信号 while(DT0==1); //跳过 80us DHT拉高信号 //准备接受温湿度数据 for(i=0;i<5;i++) { for(j=0;j<8;j++) { N = 0; while(DT0==0);//bit数据头 while(DT0==1) { delay_10us();//适当延时 N++; } buf[i] <<= 1; if(N>3)buf[i]++; } } DT0 = 1; //接受完成,准备校验数据 tem = buf[0]+buf[1]+buf[2]+buf[3]; if(tem==buf[4]) {

23

基于AT89C52单片机的温湿度检测系统设计

//buf[2] = buf[2]-5; LCD_cursor(0); LCD_prints(\" \"); LCD_cursor(0); LCD_prints(\"N1 \"); LCD_prints(\"T:\"); LCD_cursor(0x04); LCD_ints(buf[2]); LCD_cursor(0x07); LCD_write_data(0xDF); LCD_write_data(0x43); LCD_cursor(0x0A); LCD_prints(\"HU: %\"); LCD_cursor(0x0C); LCD_ints(buf[0]); if(flag_send==1) { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON |LCD_CURSOR_BLINK_ON); Uart_ss(\"N1: \ Uart_ss(\"Tem:\ Uart_sc(buf[2]/10+48); Uart_sc(buf[2]%10+48); Uart_ss(\"度 \ Uart_ss(\"Hum:\ Uart_sc(buf[0]/10+48); Uart_sc(buf[0]%10+48); Uart_sc(0xA3); Uart_sc(0xA5); Uart_sc(0x0D); Uart_sc(0x0A); //结尾发送回车换行 LCD_cursor(0x40); } else { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF |LCD_CURSOR_BLINK_OFF); } teml = TEP;

24

基于AT89C52单片机的温湿度检测系统设计

temh = TEP>>8; if((buf[2]temh)) //温度低于于10度或高于40度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); } teml = DAM; temh = DAM>>8; if((buf[0]temh)) //湿度低于15%或高于60%度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); } } } }

void Node_sensor_1(unsigned int TEP,unsigned int DAM,int flag_send) { unsigned char i,j,N=0; unsigned char buf[5] = {0}; unsigned char teml,temh; DT1 = 0; delay_ms(30); DT1 = 1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); DT1 = 1; if(DT1==0) //是否响应信号 { while(DT1==0); //跳过 80us DHT响应信号 while(DT1==1); //跳过 80us DHT拉高信号

25

基于AT89C52单片机的温湿度检测系统设计

26

//准备接受温湿度数据

for(i=0;i<5;i++) { for(j=0;j<8;j++) { N = 0; while(DT1==0);//bit数据头 while(DT1==1) { delay_10us();//适当延时 N++; } buf[i] <<= 1; if(N>3)buf[i]++; } }

DT1 = 1;

//接受完成,准备校验数据

teml = buf[0]+buf[1]+buf[2]+buf[3];

if(teml==buf[4]) { //buf[2] = buf[2]-5;

LCD_cursor(0x40);

LCD_prints(\" \"); LCD_cursor(0x40); LCD_prints(\"N2 \"); LCD_prints(\"T:\"); LCD_cursor(0x44); LCD_ints(buf[2]); LCD_cursor(0x47); LCD_write_data(0xDF); LCD_cursor(0x48); LCD_write_data(0x43); LCD_cursor(0x4A); LCD_prints(\"HU: %\"); LCD_cursor(0x4C); LCD_ints(buf[0]);

基于AT89C52单片机的温湿度检测系统设计

if(flag_send==1) { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON |LCD_CURSOR_BLINK_ON); Uart_ss(\"N2: \ Uart_ss(\"Tem:\ Uart_sc(buf[2]/10+48); Uart_sc(buf[2]%10+48); Uart_ss(\"度 \ Uart_ss(\"Hum:\ Uart_sc(buf[0]/10+48); Uart_sc(buf[0]%10+48); Uart_sc(0xA3); Uart_sc(0xA5); Uart_sc(0x0D); Uart_sc(0x0A); //结尾发送回车换行 Uart_sc(0x0D); Uart_sc(0x0A); //结尾发送回车换行 } else { LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF |LCD_CURSOR_BLINK_OFF); } teml = TEP; temh = TEP>>8; if((buf[2]temh)) //温度低于于10度或高于40度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF); } teml = DAM; temh = DAM>>8; if((buf[0]temh)) //湿度低于15%或高于60%度时候报警 { beep();LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_ON); } else { BEEP=1;LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF);

27

基于AT89C52单片机的温湿度检测系统设计

} }

#endif

}

}

主程序

#include #include \"LCD1602.h\"

#include \"LCD1602define.h\" #include \"uart.h\" #include \"KEY.h\" #include \"dht11.h\"

#define uchar unsigned char #define uint unsigned int

uint TEP1=10250,TEP2=10250;

uint DAM1=15375,DAM2=15375;//15375=60*256+10(60可以在高八位 10在低八位) uchar temx[2],humx[2];

uint tem_down=10,tem_up=40,hum_down=10,hum_up=60,number,t; int flag_true=0;

void Delay1ms(unsigned int count);//延时程序 void show_tem_hum(); void set_tem_up(); void set_tem_down(); void comper_tem(); void set_hum_up(); void set_hum_down(); void comper_hum(); void up_com();

void set_chose(uint flag,uint num); void show_tem_hum(uint flag); int set_tem_key();

int set_tem_key()//输入键值 {

uint flag1=0; uchar i; while(1)

28

基于AT89C52单片机的温湿度检测系统设计

{

while(key_check()!=0) { i=key_scan(); switch(i) { case 2:set_chose(flag1,1);flag1++;break; case 3:set_chose(flag1,2);flag1++;break; case 4:set_chose(flag1,3);flag1++;break; case 6:set_chose(flag1,4);flag1++;break; case 7:set_chose(flag1,5);flag1++;break; case 8:set_chose(flag1,6);flag1++;break; case 10:set_chose(flag1,7);flag1++;break; case 11:set_chose(flag1,8);flag1++;break; case 12:set_chose(flag1,9);flag1++;break; case 15:set_chose(flag1,0);flag1++;break; default:break; } if(flag1==2) return 1; } } }

void set_tem_down() {

uint flag_down=0; LCD_ClrAll(); while(1) { LCD_cursor(0); LCD_prints(\"set tem down:\"); tem_down=0; while(1) { if(flag_down==0) { set_tem_key(); flag_down++; tem_down=number; LCD_cursor(0x40); LCD_prints(\"number is:\"); LCD_ints(tem_down);

29

基于AT89C52单片机的温湿度检测系统设计

LCD_cursor(0x4d); LCD_write_data(0xDF); LCD_write_data(0x43); } if(key_scan()==16) break; } break; } comper_tem(); }

void set_tem_up() {

uint flag_up=0; LCD_ClrAll(); while(1) { LCD_cursor(0); LCD_prints(\"set tem up:\"); tem_up=0; while(1) { if(flag_up==0) { set_tem_key(); flag_up++; tem_up=number; LCD_cursor(0x40); LCD_prints(\"number is:\"); LCD_ints(tem_up); LCD_cursor(0x4d); LCD_write_data(0xDF); LCD_write_data(0x43); } if(key_scan()==16) break; } break; }

comper_tem(); }

void comper_tem() {

30

基于AT89C52单片机的温湿度检测系统设计

if(tem_upvoid set_hum_down() {

uint flag_down=0; LCD_ClrAll(); while(1) { LCD_cursor(0); LCD_prints(\"set hum down:\"); hum_down=0; while(1) { if(flag_down==0) {

31

基于AT89C52单片机的温湿度检测系统设计

set_tem_key(); flag_down++; hum_down=number; LCD_cursor(0x40); LCD_prints(\"number is:\"); LCD_ints(hum_down); LCD_cursor(0x4d); LCD_prints(\"%\"); } if(key_scan()==16) break; } break; } comper_hum(); }

void set_hum_up() {

uint flag_up=0; LCD_ClrAll(); while(1) { LCD_cursor(0); LCD_prints(\"set hum up:\"); hum_up=0; while(1) { if(flag_up==0) { set_tem_key(); flag_up++; hum_up=number; LCD_cursor(0x40); LCD_prints(\"number is:\"); LCD_ints(hum_up); LCD_cursor(0x4d); LCD_prints(\"%\"); } if(key_scan()==16) break; } break; } comper_hum();

32

基于AT89C52单片机的温湿度检测系统设计

}

void comper_hum() { if(hum_upvoid set_chose(uint flag,uint num) { if(flag==0) number=10*num; if(flag==1) number+=num; }

33

基于AT89C52单片机的温湿度检测系统设计

void show_tem_hum(uint flag) {

if(flag==1) { LCD_ClrAll(); LCD_cursor(0); LCD_prints(\"tem up: \"); LCD_ints(tem_up); LCD_cursor(0x0c); LCD_write_data(0xDF); LCD_write_data(0x43); LCD_cursor(0x40); LCD_prints(\"tem down:\"); LCD_ints(tem_down); LCD_cursor(0x4c); LCD_write_data(0xDF); LCD_write_data(0x43); for(t=0;t<100;t++) { delay_1ms(255); } } if(flag==2){ LCD_ClrAll(); LCD_cursor(0); LCD_prints(\"hum up: \"); LCD_ints(hum_up); LCD_cursor(0x0c); LCD_prints(\"%\"); LCD_cursor(0x40); LCD_prints(\"hum down:\"); LCD_ints(hum_down); LCD_cursor(0x4c); LCD_prints(\"%\"); for(t=0;t<100;t++) { delay_1ms(255); } } }

34

基于AT89C52单片机的温湿度检测系统设计

main() {

uint flag_key=0;

uchar i=0; Uart_init();

LCD_initial(); //LCD初始化 LCD_ClrAll(); //LCD清屏

LCD_cursor(0); //光标起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f LCD_prints(\"MY SYSTEM BEGIN\"); LCD_cursor(0x40);

LCD_prints(\"HAPPY NEW YEAR\"); for(t=0;t<50;t++) // { delay_1ms(255); }

while(1) { Node_sensor_0(TEP1,DAM1,flag_true); Node_sensor_1(TEP2,DAM2,flag_true); for(t=0;t<25;t++) { delay_1ms(255); } if(key_check()!=0) { i=key_scan(); switch(i) { case 1:set_tem_up();break; case 2:set_tem_down();break; case 5:set_hum_up();break; case 6:set_hum_down();break; case 9:flag_true=1;break; case 10:flag_true=0;break; case 14:show_tem_hum(1);break; case 16:show_tem_hum(2);break; default:break; } } } }

35

基于AT89C52单片机的温湿度检测系统设计

第5章 总结与展望

本次专业课程设计:基于STC89C52单片机的温湿度检测系统的设计,已经基本完成。通过这次毕业设计,我掌握了一些实践性质的设计的基本步骤:首先,明确设计任务,并且要对市场上温湿度控制器要有初步了解,还要知道前人做了哪些工作,本设计方案的可利用程度等等。其次,要对整个设计系统做深入的方案论证、计算并且结合现有实际条件,确立自己的设计方案,进而,就是对自己确立的方案进行硬件实现,包括所用原器件选型,以及控制部分整个单片机系统的硬件选型与设计,并用Protel绘制出整个系统总体电路图。接着我们就进入到软件编程设计了,要画出各部分的大体流程图,弄清楚各个部分实现的功能,最后对整个系统进行软件编程实现。到此为止,这个系统的设计基本上已经完成了,最后就是要经过生产实践的检验,确定我们的设计是否符合实际要求,具有可利用价值。

在总结前人的基础上,利用当前最新的传感器技术和数字传感器件。基于单片机的温湿度检测系统实现了自动采集:数字传感器将外界环境温度和湿度的数据直接送给单片机无需经过A/D转换和专门的数据采集部分。实时监测:在24小时内是实时地检测出外界环境的温度和湿度的数据。自动显示:有数码管自动地显示。综合以上的分析可知,基于单片机的温湿度检测系统比起传统的温度计和湿度计有着非常明显的优势。首先在测量精度方面比起传统的温度计和湿度计大大地提高了其测量精度。在测量准度方面比起传统的温度计和湿度计有着抗干扰的能力。在显示方面基于单片机的温湿度检测系统是实时的自动显示而传统的温度计和湿度计还必须从仪器上面用肉眼读出。 由于个人的能力有限,系统肯定存在不完善的地方,还有值得改进和优化的地方。如其中本设计的初步设计思路系统是要存在与上位机相连接的硬件电路及其软件的编写,但是因本人能力有限,加上初步设计中遇到这个方面的问题不能解决,故此设计中只实现了与上位机相连接部分的电路设计而忽略了软件的设计;另外未能全部完成的是软件部分,因为在调试中,有部分软件的编写系统总是不能实现,所以软件程序仅仅附录部分程序。这些方面的问题会在以后的学习和工作中逐步加强与完善。

本系统采用的单片机控制,实现对室内温湿度的智能控制,单片机可完成室内的数据采集、传送预处理和控制任务。用单片机汇编语言编程,采用模块化的结构设计,提高了可靠性和可扩展性。把单片机控制理论与技术应用在监控中,能够实现智能化的控制要求。整个设计过程同时也是一个很好的学习机会,例如运用Proteus绘图,经过这次设计后自己在这方面有很大地进步,画图的熟练度有了明显的提高; 在查找资料方面,认识到:图书资料、网络资料和期刊等都很有价值,以后做设计的时候要注意查找完整的资料,不要只偏重一个方面。当然整个设计过程学到的知识和经验远远比运用Protel、学会查找多方资料多得多,这些对于自己以后的学习和工作将受益匪浅。但必须认识到的是,在设计中也存在着不足之处,例如单片机控制系统在可靠性方面相对于可编程控制器(PLC)控制系统略为欠缺,并且自己深入实践不够,所做的系统也不是很完善。但是我想通过以后的学习和努力一定会有所提高,能够做出更好的设计。所设计系统不仅适用于室内湿度环境的控制,对软件进行一定的扩展后也可用于实验室、医疗室、储藏保鲜、组织培养等生物环境和粮库等环境的控制,具有较强的通用性和

36

基于AT89C52单片机的温湿度检测系统设计

适应性。

虽然到现在为止,有些东西我还是不懂和不理解,但我学会了面对问题,自己尽量解决,先分析,然后解决,一条道通不过然后尝试着其它的方法,最终把问题克服掉。最重要的是锻炼了和同学的协作完成任务,提高了合作能力。我感觉这是这次设计过程中收获最大的,这将是我未来的工作中 用之不尽宝贵的经验。感谢那些帮助过我的同学,感谢他们在自己做毕业设计的情况下还帮我找资料并对我的设计提出宝贵的意见。

总体来说,经过这次课程设计,我受益良多,也得到了很多经验。我明白了只有自己真正接触尝试了,才知道自己的真实水平。也使我看清了自己的知识水平与各种综合能力,找出了自己的不足和差距。我将明确自己在今后要奋斗的目标与方向,勇往直前。

参考文献

1. 周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真.北京航空航天大学出版社,2006

2. 李朝青.单片机原理及接口技术.北京航空航天大学出版社.2009 3. 王忠民.微型计算机原理.西安电子科技大学出版社.2008 4. 李建民.单片机在温度控制系统中的应用.江汉大学学报.1996

5. 沈德金,陈粤初.MCS-51系列单片机接口电路与应用程序实例.北京航空航天大学出版社.1990

6. 童诗白.模拟电子技术基础.高等教育出版社.2001.

7. 刘笃仁,韩保君.传感器原理及应用技术.机械工业出版社.2003 8. 胡汉才.单片机原理及接口技术.清华大学出版社.1996.

9. 孙建军,吴太虎 基于电力线通信技术的远程温湿度数据采集 2004 10.赵修良 于LabVIEW 的多路温湿度测量系统 湖南科技学院学报 2009 11. 何利民.MCS-51系列单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版社,2001

12. 李杏春,徐平,李华,赵嘉蔚编.8098单片机原理及实用接口技术[M].北京航空航天大学出版社,1996

13. 李华,孙晓民,李红青.MCS- 51系列单片机实用接口技术[M].北京:北京航空航天大学出版社,1993

37

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务