1、摘要:温湿度使我们生产生活中很重要的参数,本设计为基于51单片机的温湿度检测与控制系统,采用模块化、层次化设计。如今采纳新技术,使用新式智能的温湿度传感器DHT11来实现对温度、湿度的监测,运用DHT11来完成湿度信号的收集并将其转换为数字式信号,接着使用单片机AT89C52分析、处置数据,提供信号给显示电路,从而完成对温湿度的检测与监控。采纳LCD1602液晶显示所测得的温湿度值。优点是系统的电路简单、集成度高、运行稳定、调试方便、检测精度很高,有一定的实用价值。关键词:单片机;DHT11温湿度传感器;LCD1602显示目录摘要:I目录II第一章 引言11.1 课题的研究背景11.2 课题的
2、研究内容及目标11.3 本文的结构组织1第二章 设计要求及目的22.1 设计目的22.2 设计要求2第三章 系统方案设计及论证33.1总体方案设计33.2方案比较与论证33.2.1温湿度检测33.2.2处理器选择43.2.3 显示部分4第四章 系统的硬件设计与实现54.1 单片机介绍54.1.1 单片机主要性能54.1.2 单片机各引脚功能介绍54.1.3 单片机特殊功能寄存器介绍64.2 DHT11数字温湿度传感器介绍74.2.1 DHT11产品概述74.2.2 串行接口74.3 1602LCD液晶显示器简介94.3.1 1602LCD的基本参数及引脚功能94.3.1.1 1602LCD主要
3、技术参数:104.3.1.2. 引脚功能说明104.3.2 1602LCD的指令说明及时序114.3.3 1602LCD的一般初始化(复位)过程12第五章 软件设计135.1主程序和中断程序135.2子程序13总 结14附录一 电路图17附录二 程序代码1822第一章 引言1.1 课题的研究背景温度与湿度与人们的生活息息相关。尤其是在工农业生产、气象、国防、科研等部门,必须经常、精确的对环境温度进行监测和控制。此外,在制药,造纸准及温湿度测量,食品加工和其他行业是必要的。比较传统的温度计使用水银制作显示,构造简单、价格低廉,缺憾是精确度不高,不宜读数。传统的干湿球温度计的显示方法,不仅复杂,测
4、量精度不高。而选用单片机对温湿度实施监控和测量,不单单具有节制便利,单一灵活的特点,而且可以大大提高温度控制的灵活性的优点。用LED数码管显示温度和湿度值,看起来更直观。测量温度和湿度最重要的就是传感器。温度和湿度的测量过去是分离的。传感器的成长历经了三个阶段:传统的分立式温度传感器、模拟集成温度传感器、智能集成温度传感器。目前,从模拟到数字温度传感器的模型的方向,从集成化向智能化,网络化的发展。温度传感器也经历过这样的阶段走向数字化、智能化。1.2 课题的研究内容及目标温度和湿度探测器是以AT89C52单片机为核心控制芯片,该芯片具有良好的抗干扰能力,快速响应。使用此单片机构成的温湿度检测仪
5、能够定时、无误的监测周围的温度和相对湿度。 使用高灵敏度收集湿敏电阻阻值变化,然后经由单片机从而得到相应湿度,这就是本检测仪的硬件部份的设计;DHT11数字温度传感器对温度的实时采集和直接控制监测。并用LCD显示屏作为显示设备的硬件设计方案。软件部分选用模块化的方式分成几个个体,一个个进行程序设计,最后连接各部分一起协调工作,从而实现实时监测周围温湿度的目的。1.3 本文的结构组织本文的组织结构安排如下:第一章引言,扼要阐明本课题的研究背景、研究目的、研究意义,以及要实现的目标。第二章设计的要求及目的,阐述要实现的功能,以及主要的参数。第三章系统设计方案及论证,通过分析论证,选出最合适的设计方
6、案,介绍总体方案。第四章主要讲述整个体系硬件的设计及实现,包括单片机的选择、温湿度传感器的选择以及显示电路的设计。第五章是软件设计,基于前面的硬件系统,设计程序。第二章 设计要求及目的2.1 设计目的温度、湿度是工业和农业生产的主要环境参数。是否能够及时、准确地测量很重要。如果单片机来对温度进行控制,利用高精度的温度,湿度控制,强湿功能,体积小,价格低,简单灵活,很好的满足工艺要求。2.2 设计要求1、实现温度和湿度的测量;2、按电源键进行测量;3、湿度的测量范围: 0100%RH;温度的测量范围:-40+85;4、湿度测量精度:2.0%RH;温度测量精度:0.2;5、在LCD显示屏上显示数据
7、和结果;第三章 系统方案设计及论证3.1总体方案设计根据课题要求实现,该系统由采集系统和显示系统组成,以AT89C52单片机为核心,设计如图3-1:信号采集最小系统AT89C51液晶显示图3-1系统图3.2方案比较与论证3.2.1温湿度检测方案一:使用AM2301数字温湿度传感器。该型温湿度传感器,采用3.3-6V直流电源供电,它的各部分参数:湿度测量的范围为2090%RH;温度测量的范围为0+50;湿度测量精度为5.0%RH;温度测量精度为2.0。虽然它的价格比较便宜,但测温的范围和测湿的范围太小,温度的精度和湿度的精度太低,不符合设计的要求。方案二:使用AM2302电容式数字温湿度传感器。
8、它的各部分参数如下:由于传感器参数:湿度0% 100%相对湿度的测量范围;温度测量范围为40 + 80;湿度的测量精度为3.0%RH温度的测量精度:0.5。价格也比较适合,基本可以满足设计要求。方案三:使用数字温湿度传感器DHT11。湿度测量范围: 0100%RH;温度测量范围:40 + 85;湿度测量精度:2%相对湿度0.2温度测量精度。该传感器价格很便宜。温度和湿度都达到或超过了标题的精度要求,属于低功率传感器。经过比较,从系统技术参数要求和低功耗方面考虑,选用方案三。3.2.2处理器选择方案一:采用AT89C51单片机作为处理器,虽能达到要求,但其内存过小,处理精度过低,不是最好的选择;
9、方案二:采用AT89C52单片机,既经济又有较大的内存,能很好的达到设计要求,是本次设计的主选;方案三:采用TI公司的各种单片机,虽然能很好的达到设计的要求,但其成本过高,且程序较复杂,不适宜与本次设计。通过对比,方案二的AT89C52的功能完全能够符合题目的各个部分和发挥部分的设计,故选用方案二。3.2.3 显示部分方案一:采用LED数码管,其操作简单,显示直观。不仅程序的设计简易,而且对周围的环境要求很低,方便维护。但是数码管只可以显示阿拉伯数字,不能显示汉字。而且硬件设计也相当繁复。不适用于本设计。方案二:使用LCD液晶,它具有体积小、低功耗、显示丰富等优点。电路连接简单,价格也便宜。总
10、的来说,LCD液晶显示更多的内容,所以本设计选用LCD液晶显示程序。第四章 系统的硬件设计与实现4.1 单片机介绍4.1.1 单片机主要性能AT89C52是由ATMEL公司生产的51单片机的一个型号。它具有高性能CMOS8位、低电压的优点,使用了该公司的高密度、非易失性存储技术生产,完美兼容MCS-51指令系统,包括8位中央处理器和Flash存储单元,AT89C52功能强大、试用范围非常广。主要功能特性:l 引脚完全兼容MCS-51产品l 具有8K字节的可重擦写Flash闪存l 1000次擦写周期l 2个读写中断口线l 全静态操作:0Hz-24MHzl 三级加密程序存储器l 256*8字节内部
11、RAMl 32可编程双向I/O线l 3个16位定时器/计数器l 2个外部中断源,共6个中断源l 可编程串行UART通道l 低功耗的空间和掉电模式l 软件设置睡眠和唤醒功能4.1.2 单片机各引脚功能介绍AT89C52由40 脚双列直插包装的8 位通用微处理器组成,使用常用的C51内核,它主要用于会聚调整功能的控制。功能主要有对会聚主IC 内部寄存器、数据RAM及外部接口等部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。P0 口:P0 口是8 位的漏极开路型双向的I/O 口,即为地址/数据总线复用口。如果被当作输出口,每位可以吸收电流的形式驱动8 个T
12、TL逻辑门电路,对端口P0 写“1”时,起作用变为高阻抗输入。当需要访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,期间可以激活内部上拉电阻。在Flash 编程时,P0 口负责接受指令字节,但是在程序校验的时候,需要输出指令字节,校验时需要外接上拉电阻。P1 口:P1 是一个带在内部上拉电阻的8 位的双向I/O 口, P1 的输出缓冲级可驱动(吸取或输出电流)4 个TTL 逻辑门电路。对端口写“1”,经过里面 的上拉电阻把端口拉至高电平,就可作输入口使用。作输入口用时,因为里面存在上拉电阻,某引脚被外部的信号拉低时会输出一个电流(IIL)。与AT89C51 不
13、同之处是,P1.0 和P1.1 还有作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)的功能,Flash 编程和程序校验的时候,P1 接收低8 位地址。P2 口:P2 是一个带有上拉电阻的8 位双向的I/O 口,P2 的输出缓冲级能够驱动(吸收或输出电流)4 个TTL 逻辑门电路。将端口P2写“1”,通过内部的上拉电阻来港的高水平,此时,可作为输入,作为输入使用时,因为内部上拉电阻,如果某个引脚被外部信号拉低的时候就会输出一个电流(IIL)。当访问外部程序存储器或16 位地址的外部数据存储器时,P2 口送出高8 位的地址数据。当访问8 位地址的外部数据存储器时,P
14、2 口输出P2 锁存器的内容。编程或检查,P2也获得了很高的地址和控制信号。P3 口:P3 口是一组带有内部上拉电阻的8 位双向I/O 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL 逻辑门电路。对P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3 口将用上拉电阻输出电流(IIL)。P3 口除了作为一般的I/O 口线外,此外,它的第二功能P3 口还接收一些可以用于Flash 闪速存储器编程与程序校验的控制信号才是最重要的。4.1.3 单片机特殊功能寄存器介绍数据存储器:AT89C52 有256 个字节内部RAM,80H-FFH 高128 个字节与特
15、殊功能寄存器(SFR)地址是重复的,虽然物理上分开,但是高128字节的RAM 与特殊功能寄存器的地址相同。当一条指令访问7FH 以上地址单元的时候,指令中使用不同的寻址方式,即为究竟是访问高128 字节RAM 还是访问特殊功能寄存器是由寻址方式决定的。直接寻址方式对应的是访问特殊功能寄存器。定时器0和定时器1:AT89C52的定时器0和定时器1 的工作方式与AT89C51 相同。2定时器:定时器2是一个16位定时器/计数器。不仅仅可以当定时器用,而且可用作外部事件计数器,特殊功能的寄存器T2CON的C/T2 位负责选择它的工作方式。定时器2一共有三种工作方式:捕获方式,向上或向下计数方式以及波
16、特率发生器方式,T2CON 的控制位来决定其工作方式。4.2 DHT11数字温湿度传感器介绍4.2.1 DHT11产品概述DHT11数字温湿度传感器是一种复合传感器,它包含已校准数字信号输出。通过特殊的数字模块采集技术和温湿度传感技术,以确保产品拥有相当高的可靠性和卓越的长期稳定性。传感器由一个电阻式感湿元件与一个NTC测温元件组成,跟一个高性能的8位单片机相连接。因此,产品品质优良,响应速度快,抗干扰能力强,性价比很高。而且它的每次校准都在及其标准的温湿度实验室中进行。将所测的校准系数用程序存储在OTP内存中,当需要处理检测到的信号时,传感器会自动调用这些标准系数。单线串行接口,很容易和快速
17、的系统集成。它的优点是体积小、低功耗、最高20米以上的远距离信号传递,使它能够在最为严格的场合使用。4.2.2 串行接口微处理器与 DHT11之间的联系与同步通过DATA来实现,它选用单总线的数据格式,一次通话时间大约在4ms左右,数据包括小数部分和整数部分,具体格式会在下文中详细介绍, 如果有扩张的小数部分,我们读作零。操作流程如下:一次完整的数据传输为40bit,高位先出。数据格式: bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传递精确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数
18、数据”其结果末8位。当用户MCU传送一次开始的信号后,DHT11就会自动从低功耗模式变换成高速模式,然后等待主机开始信号结束后,DHT11就会传送响应信号,送出40bit的数据, 触发信号的采集,用户可以选择读数据。在从模式下,当DHT11接收到开始信号就会自动触发一次温湿度收集,当接收到主机发送开始信号的时候,他就不会主动进行温湿度的收集.完成收集数据后会自动转换到低速模式。1.通讯过程如图4-1所示:图 4-1 通讯过程图总线空闲时候的状态为高电平,主机会把总线降低然后等着DHT11响应,主机把总线拉低要大于18毫秒,以确保DHT11可以检测到起始的信号。当DHT11收到主机的开始的信号后
19、,就会等待主机的开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换至输入模式,或者是输出高电平, 总线由上拉电阻拉高。总线如果为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都会以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式如图4-2所示.收到高电平响应信号,则DHT11不会响应,检查一下电路连接是否正常.当最后一bit数据传送结束后,DHT11拉低总线50us,然后总线由上拉电阻拉高转为空闲状态。图 4-20
20、数字信号表示,如图4-3所示: 图 4-31数字信号表示。如图4-4所示:图4-44.3 1602LCD液晶显示器简介4.3.1 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图4-5所示:图4-5 LCD尺寸图4.3.1.1 1602LCD主要技术参数:显示容量:162个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm4.3.1.2. 引脚功能说明1602LCD采用标准的14脚(无背光)
21、或16脚(带背光)接口,各引脚接口说明如表4-6所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极表4-64.3.2 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表4-7所示:序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制000000
22、1DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容表4-7与HD44780相兼容的芯片时序表4-8如下:读状态输入RS=L,R/W=H,E=H输出D0D7=状态字写指令输入RS=L,R/W=L,D0D7=指令码,E=高脉冲输出无读数据输入RS=H,R/W=H,E=H输出D0D7=数据写数据输入RS=H,R/W=L,D0D7=数据,E=高脉冲输出
23、无表4-8读写操作时序如图4-9和图4-10所示:图4-9. 读操作时序图4-10. 写操作时序4.3.3 1602LCD的一般初始化(复位)过程写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置第五章 软件设计5.1主程序和中断程序图5-1显示主程序流程,实现了温湿度数据的显示与接收,并通过LCD液晶显示屏显示所测的的温湿度。开始初始化LCD显示驱动DHT11读取温湿度数据处理温湿度显示结束图5-1 主程序流程图5.2子程序子程序主要是一个DHT11和LCD1602的程序。程序的流程图如图5-2所示。目的是实现D
24、HT11和LCD1602的初始化及其数据处理。开始初始化DHT11等待测量写启动测量写测量命令测量结束选位读数据及其结束 读测量数据YY图5-2子程序流程图 YYY总 结通过不懈的努力,终于完成了我的课程设计。在我开始做课程设计之前,我一直片面的觉得课程设计只是对大学这几年来所学的专业知识的简单的总结,但是在实践的过程中我发现我错了,因为毕业设计不仅是对前面所学知识的一种检验,而且也是对自己能力的以一种提高。通过课程设计使我明白了我学到的知识只是知识宝库中的冰山一角,还有许多要学习的地方。原来我总是感觉到已经把所有的东西都学到手了,什么都明白了,有些眼高手低。通过我在课程设计的实践过程,我懂得
25、了活到老学到老这句名言的真正意义,学习是一个循序渐进的过程,不可能一蹴而就,不管是在以后的工作中、或者生活中都不能停止学习,不断的用知识武装自己,让自己全面发展,更能适应这个科技文化高速发展的世界。课程设计的过程,让我养成了独立思考的习惯,培养了我实在实际操作中动手的能力,我领悟到了在实践过程中摸索的困难与最终成功时的喜悦,这些对于我的信心或者是工作能力来说都是极大的鼓励与肯定,相信这些会对未来的工作和生活中有非常重要的影响。虽然我的课程设计是有些缺陷的,但我觉得在此过程中我收获了很多,最大的收获就是在课程设计的设计过程中所学到的财富,他会是我终身受益。在课程设计实践的过程中,我还深深体会到交
26、流和相互讨论的重要性。向老师请教,就能够时刻确保在大的方向上我是朝对的方向走;与同学讨论,可以集思广益、可以迸发灵感,收获新方法。思想和信息的传递,确保了我的课程设计得以顺利完成。另外,我还总结出一个结论:知识要想实现其价值,必须由实践来完成!参考文献1 谢光忠、蒋亚东等. 温湿度智能数据采集控制系统的研制:传感器技术 20004.2 丁元杰.单片微机原理及应用.北京:机械工业出版社.1993.3 喻评,郭文川.单片机原理与接口技术.北京:化学工业出版社,2006.4 李刚.51系列单片机系统设计与应用技巧.北京:北京航空航天大学出版社.2004.5 余永权.MCS-51系列单片机应用技术.北
27、京:北京航空航天出版社.2002.6 刘勇.数字电路.北京电:子工业出版社.2004.7 王法能.单片机原理及应用(简明修订版). 北京:科学出版社.2001. 8 赵伟军.PROTEL 99 SE 教程.北京:人民邮电出版社.2004.9 黄 强.模拟电子技术北京:科学出版社.2003.10 徐正惠,胡海影.单片机原理与应用实训教程.北京:京科学出版社.2004. 11 陈晓文.电子电路课程设计.北京:北京电子工业出版社. 2004.附录一 电路图附录二 程序代码#include #include #include #include #include #define uchar unsign
28、ed char#define uint unsigned inttypedef union uint i; float f; value;int tem,humi,x,y,z,m;enum TEMP,HUMI;sbit DATA = P27;sbit SCK = P26;#define noACK 0#define ACK 1#define STATUS_REG_W 0x06 #define STATUS_REG_R 0x07 #define MEASURE_TEMP 0x03 #define MEASURE_HUMI 0x05 #define RESET 0x1e uchar jgh10=0
29、00%c;/-char s_write_byte(uchar value)/- uchar i,error=0; for (i=0x80;i0;i/=2) if (i & value) DATA=1; else DATA=0; SCK=1; _nop_();_nop_();_nop_(); SCK=0;DATA=1; SCK=1; error=DATA; SCK=0; return error; /-char s_read_byte(uchar ack)/- uchar i,val=0;DATA=1; for (i=0x80;i0;i/=2) SCK=1; if (DATA) val=(val
30、 | i); SCK=0; DATA=!ack; SCK=1; _nop_();_nop_();_nop_(); SCK=0; DATA=1; return val;/-void s_transstart(void) DATA=1; SCK=0; _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; /-void s_connectionreset(void)/- uchar i; DATA=1; SCK=0; for(i
31、=0;i9;i+) SCK=1; SCK=0;s_transstart(); /-char s_measure(uchar *p_value, uchar *p_checksum, uchar mode)/- unsigned error=0;uint i;s_transstart(); switch(mode) case TEMP : error+=s_write_byte(MEASURE_TEMP); break; case HUMI : error+=s_write_byte(MEASURE_HUMI); break; default : break; for (i=0;i100)rh_
32、true=100; if(rh_true0.1)rh_true=0.1; *p_temperature=t_C; *p_humidity=rh_true; /-float calc_dewpoint(float h,float t)/- float logEx,dew_point; logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2); dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);return dew_point;/* 主函数*/void main()value humi_val,temp_va
33、l;float dew_point;unsigned char error,checksum;LCD_Initial();GotoXY(0,0);Print(TEMP: %C);GotoXY(0,1);Print(HUMI: RH);s_connectionreset();while(1) error=0; error+=s_measure(unsigned char*) &humi_val.i,&checksum,HUMI); error+=s_measure(unsigned char*) &temp_val.i,&checksum,TEMP); if(error!=0) s_connec
34、tionreset(); else humi_val.f=(float)humi_val.i; temp_val.f=(float)temp_val.i; calc_sth11(&humi_val.f,&temp_val.f); dew_point=calc_dewpoint(humi_val.f,temp_val.f); tem=temp_val.f*10; humi=humi_val.f*10; GotoXY(5,0);/液晶字符显示位置 x=tem/1000; x+=0x30; jgh0=x; y=tem%1000/100; y+=0x30; jgh1=y; z=tem%1000%100/10; z+=0x30; jgh2=z; m=tem%10; m+=0x30; jgh3=0x2E; jgh4=m; Print(jgh);GotoXY(5,1);/液晶字符显示位置 x=humi/1000; x+=0x30; jgh0=x; y=humi%1000/100; y+=0x30; jgh1=y; z=humi%1000%100/10; z+=0x30; jgh2=z; m=humi%10; m+=0x30; jgh3=0x2E; jgh4=m; Print(jgh);