资源描述
沈阳航空航天大学课程设计论文 基于单片机的湿度计设计
目 录
0 前言 1
1 总体方案设计 2
2 硬件电路设计 3
2.1 单片机系统 3
2.2 DHT11湿度传感器系统 5
3 软件设计 7
3.1 晶振电路 8
3.2 复位电路 8
3.3 数字显示电路 9
3.4 报警电路 9
3.5 湿度采集电路 10
4 调试分析 10
5 结论及进一步设想 11
参考文献 11
课设体会 12
附录1 电路原理图 13
附录2 程序清单 14
基于单片机的湿度计设计
杨少书 沈阳航空航天大学自动化学院
摘要:本文设计了一种基于单片机控制的数字式湿度计,主要由湿度检测部分、单片机数据采集处理部分、显示部分和报警电路组成。硬件以STC89C52单片机为核心,外接晶振、复位电路、电源、DHT11湿度传感器、LED显示电路组成。本设计利用DHT11湿度传感器能耗低、响应速度快、稳定性强、可靠性高、抗干扰能力强、信号传输距离长、可随时掌握周围环境温度等优点,可以检测周围环境湿度,并且与人体适宜湿度相比较,若超出人体适宜湿度范围则会发出警报。
关键词:单片机 ;DHT11湿度传感器;湿度检测
0 前言
1. 设计背景:湿度是基本的环境参数,人们生活与湿度息息相关。在日常生活、工业、医学、环境保护、化工、石油等领域,经常需要对环境湿度进行测量和控制。准确测量湿度在生物制药、食品加工、造纸等行业更是至关重要。因此,研究湿度的测量方法和装置具有重要的意义。随着科技的不断发展,单片机技术已经普及到我们的工作、生活、科研等各个领域。已经成为一种比较成熟的技术。由于单片机集成度高、功能强、可靠性高、体积小、功耗低、使用方便等优点,目前已经渗透到我们工作和生活的方方面面。本设计介绍了一种以STC89C51为主要控制器件,以DHT11为数字湿度传感器的新型数字湿度计。
2. 设计意义:最近几年来,随着科技的飞速发展,单片机领域正在不断的走向社会各个角落,还带动传统控制检测日新月异更新。在实时运作和自动控制的单片机应用到系统中,单片机如今是作为一个核心部件来使用,仅掌握单片机方面知识是不够的,还应根据其具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。现代社会越来越多的场所会涉及到温度与湿度并将其显示。由于温度与湿度不管是从物理量本身还是在实际人们的生活中都有着密切的关系,例如:冬天温度为18至25℃,湿度为30%至80%;夏天温度为23至28℃,湿度为30%至60%。在此范围内感到舒适的人占95%以上。在装有空调的室内,室温为19至24℃,湿度为40%至50%时,人会感到最舒适。如果考虑到温、湿度对人思维活动的影响,最适宜的室温度应是工作效率高。18℃,湿度应是40%至60%,此时,人的精神状态好,思维最敏捷。所以,本课程设计就是通过单片机驱动LED数码管,数码管显示湿度,通过此设计,可以发现本设计有一定的扩展性,而且可以作为其他有关设计的基础。
3. 设计内容:本设计要求设计的湿度计以单片机为核心,通过湿度传感器对环境湿度进行采样处理,单片机对检测到的湿度与人体的适宜湿度值(38%~65%)进行比较,若不在此范围内,则报警。
4. 设计要求:
(1)按设计内容制定设计方案,并绘制出系统工作框图;
(2)按设计内容设计湿度计的电路,并与单片机仿真器、单片机实验箱、电源等硬件正确可靠地连接,给出电路原理图;
(3)用仿真器及单片机实验箱进行程序设计与调试;
5.设计特点:本设计采用DHT11湿度传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高 的可靠性与长期的稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集 成变得简易快捷。同时还具有体积小、功耗低,信号传输距离长等优点。
1 总体方案设计
针对本课题的设计任务,进行分析得到:本次设计用湿度传感器进行湿度的测量,转化了的湿度信号由传感器得到数字信号。本次设计采用STC89C52单片机作为主机,DHT11湿度传感器作为从机,当要开始测量时,从主机发出信号给从机,此时从机DHT11湿度传感器开始测量周围环境的湿度,并将湿度信号转换为数字信号发送给主机,再由主机发送信号给数码管显示测量湿度。
该湿度计的设计,在总体上大致可分为以下几个部分组成:1湿度检测部分;2晶振部分;3复位电路部分;4 LED显示电路部分。系统原理框图如图1所示。
电源
单片机
STC89C52
复位电路
晶振
湿度传感器
DHT11
湿度显示
\
声音报警
图1 系统原理框图
整个电路的工作原理是:整个湿度检测系统以STC89C52单片机为核心,对整个测试系统进行控制,包括湿度的测量、数据的处理、湿度的显示、声音报警等。湿度传感器DHT11将测量到的湿度进行数据处理经由单片机发送给LED显示输出。当湿度计开始工作时,单片机对所检测到的湿度与人体的适宜湿度值(38%~65%)进行比较,若低于38%或高于65%,则报警。单片机由外接12MHz标准晶振提供时钟电路。
湿度传感器的非电量(湿度)到电量(电压)是非线性的关系,故考虑先将湿度传感器输出的电压信号用A/D转换采样到CPU, CPU再对采样所得的数字信号进行查表计算处理,得到相应的数字量,再将数字量由D/A转换成电压信号输出,最后只要根据输出的电压值即可得出湿度。因DHT11湿度传感器的校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的过程中直接调用这些校准系数,所以不用经过A/D转换,更加简易快捷。
根据设计要求,设计前分别采用了电容式相对湿度传感器HS1101的方案一和采用湿度传感器DHT11的方案二,其中方案一的优点是HS1101传感器具有适应电压范围广、支持多点组网功能、测温范围广等特点。方案二的优点是DHT11传感器具有稳定性高、能耗低、传输距离长、抗干扰能力强、相应速度快、性价比高等特点。综合各方面的因素,DHT11传感器可靠性更高,连接更加方便,调用数据更加简洁,所以本次设计采用了方案二。
2 硬件电路设计
2.1 单片机系统
本次设计采用STC89C52单片机作为核心,对整个测试系统进行控制。STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
STC89C52参数如下:
1. 增强型8051单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.[2]
2. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机)
3.工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz
4. 用户应用程序空间为8K字节
5. 片上集成512 字节RAM
6. 通用I/O 口(32 个),复位后为:P0/P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。
7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片
8. 具有EEPROM 功能
9. 共3 个16 位定时器/计数器。即定时器T0、T1、T2
10.外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒
11. 通用异步串行口(UART),还可用定时器软件实现多个UART
12. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)
13. PDIP封装
STC89C52引脚图如图2所示。
图2 STC89C52引脚图
2.2 DHT11湿度传感器系统
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
DHT11有四个引脚,3号引脚一般悬空,如图3所示。DHT11的供电电压为3—5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF的电容,用以去耦滤波。建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
图3 DHT11引脚图
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数 部分用于以后扩展,现读出为零.操作流程如下:
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后 转换到低速模式。通讯过程如图4所示。
图4 通讯过程图
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必 须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。工作过程图如图5所示。
图5 工作过程图
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。格式如图6所示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。数字0信号表示方法如图7所示。
图6 数字1信号表示方式
图7 数字0信号表示方式
3 软件设计
本课题的软件设计采用了模块化设计的思想。主程序流程如图8所示。
图8 主程序流程图
3.1 晶振电路
单片机工作的时间基准是由时钟电路所控制的。在单片机的两个管脚XTAL1和XTAL2接一只晶振以及两只电容就构成了单片机的时钟电路。电路中的两个电容对震荡频率有微调作用,都选用30pF。晶振电路如图9所示。
图9 晶振电路图
3.2 复位电路
复位电路是保证单片机正常运行的关键因素,所以可靠的复位电路设计是必要的。将RST引脚连续输入2个机器周期(即24个时钟震荡期间)以上高电平,即可以完成单片机的初始化操作。本设计采用按钮复位方式。复位电路图如图10所示。
图10 复位电路图
3.3 数字显示电路
数字显示电路由2个74LS373以及LED数码管组成。其中U2对数码管断选,U4对数码管位选。数字显示电路如图11所示。
图11 数字显示电路图
3.4 报警电路
蜂鸣器是一种一体化的电子通讯响应器。在本系统中,当显示数值超出设定值38~65范围时报警。报警电路如图12所示。
图12 报警电路图
3.5 湿度采集电路
DHT11的供电电压为3—5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电路如图13所示:
图13 湿度采集电路图
4 调试分析
在硬件与软件的调试过程中,由keil uVision4软件生成的.hex文件下载不到89C52单片机中,STC-ISP烧录软件提示MCU不正确,发现MCU Type选择错误,本该选择89C52单片机而错选成了89C51单片机,改正后终于将.hex文件下载至89C52单片机中。将.hex文件下载至单片机后,打开电源,数码管不显示数字,经过检查,发现软件程序中编写的输入口为P1^0口,而在实物连接中错将输入口接到P1^1口上,导致数码管不显示。数码管显示出采集的湿度值之后,警报器一直警报,经过检查发现软件程序中设定的下线和上线范围为38~65,由于软件中设定的最高位为百位,所以导致蜂鸣器一直警报,将范围改为380~650后警报正常。
5 结论及进一步设想
微型计算机在智能化电器发展中起着至关重要的作用,而单片机经济实用、开发简便,因而在工业控制、家电智能化等领域占据了广泛的市场。本次设计是基于单片机的湿度计设计,当超出人体适宜湿度38~65时蜂鸣器发出警报,基本实现了设计要求。但是在硬件软件方面仍然存在着不足。
在硬件选择方面,由于采用湿度传感器DHT11,使电路链接更加方便,并且容易读数,简化了设计。但是由于湿度传感器DHT11的精度不够,只能显示个位而不能精确到小数位,从而存在精确度较差的缺陷。由于只买到了LED数码管,所以显示电路运用LED显示,比较了LED和LCD之后,发现LED显示的信息量较少,外接电路复杂且耗电量大,如果能将LED改成LCD,将会进一步得到完善,使得数据显示信息量增多,同时简化外接电路并且降低能耗。
在软件编程方面,初次完成的程序十分复杂,在很多方面联系不上,我在网上查找了很多的资料,也看了一些教学视频,来不断的完善程序。而且通过和同学、老师的交流讨论,我学到了很多编程方面的技巧和思想,同时也精简了部分程序。虽然已经精简了部分程序,但仍然觉的程序比较复杂,还应该多多学习C语言的编程技巧。
参考文献
[1] 刘复华.单片机及其应用系统.北京:清华大学出版社,1992
[2] 李斌,董慧颖.可重组机器人研究和发展现状.沈阳工业学院学报,2000,19(4):23-27
[3] 何立民.单片机高级教程-应用与设计[M].北京:北京航空航天大学出版社,2002.
[4] 徐爱钧.单片机高级语言C51 Windows环境编程与应用[M].北京:电子工业出版社,2001.
[5] 白雪冰,张延林等.单片机原理及应用[M].哈尔滨:哈尔滨东北林业大学出版社,2006.
[6] 张佳薇,孙丽萍等.传感器原理与应用[M].哈尔滨:哈尔滨东北林业大学出版社,2003.
[7] 何宏.单片机原理与接口技术. 北京:国防工业出版社,2006.
[8] 刘畅生.新型集成电路使用手册及应用实例——具有串行接口的外围器件和模拟信号调理器件.西安:西安电子科技大学出版社,2003.
[9] 刘守义.单片机应用技术.西安:西安电子科技大学出版社,2006.
[10] 张毅坤,陈善久,裘雪红,单片微型计算机原理及应用【M】.西安:西安电子科技大学出版社,1998.9.
[11 张凯等.单片机综合系统及其设计开发【M】.北京科学出版社,1996.
课设体会
本次设计湿度计的制作基本是达到了题目的技术指标,可以检测周围环境的湿度,如果超出人体适宜湿度范围38~65则会发出警报。
单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在。因此作为21世纪的大学生来说掌握单片机的开发技术是十分重要的。回顾起此次单片机课程设计是苦多于甜,但是可以学到很多很多的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计的过程中遇到问题,可以说的是困难重重,难免会遇到各种各样的问题,同时在设计的过程中,发现了自己的不足之处,对以前所学过的知识理解的不够深刻,掌握的不够牢固,比如说不懂一些元器件的使用方法等等。通过这次课程设计之后,一定把以前所学的知识重新温故。
[2014年7月7日完成]
附录1 电路原理图
附录2 程序清单
//头文件:
#include "reg51.h"
//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
//
#define uchar unsigned char
#define uint unsigned int
uchar adval, temp,temp1, key, m=0;
uint shang1[3] = {4, 9, 9};
uint shang[3]={10,10,10};
uint SS;
//引脚定义:
sbit DIn = P1^0; //定义状态输入
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4; //JIA
sbit key2=P3^5;
sbit J1=P2^5;
//sbit J2=P2^2;
uchar bai, shi, ge, flag=0;
//数据定义:
unsigned char ly_dis[4];//定义显示缓冲区
code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//表:共阴数码管 0-9 C
//code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
unsigned char l_posit=0; //显示位置
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
void Delay(U16 j)
{
U8 i;
for(;j>0;j--){
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DIn)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DIn)
U8temp=1;
U8FLAG=2;
while((DIn)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}
}
void RH(void)
{
//主机拉低18ms
DIn=0;
Delay(180);
DIn=1;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
DIn=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DIn) //T !
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!DIn)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DIn)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DIn=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}
}
}
void display()
{
dula=0;
P0=table[ly_dis[0]]; //显示百位
dula=1;
dula=0;
wela=0;
P0=0x7e;
wela=1;
wela=0;
Delay(4);
dula=0;
P0=table1[ly_dis[1]]; //显示十位
dula=1;
dula=0;
wela=0;
P0=0x7d;
wela=1;
wela=0;
Delay(4);
dula=0;
P0=table[ly_dis[2]]; //显示个位
dula=1;
dula=0;
wela=0;
P0=0x7b;
wela=1;
wela=0;
Delay(4);
}
void main(void)
{
U16 i=0;
while(1)
{
//调用温湿度读取子程序 ,读取模块数据周期不易小于 2S
RH();
ly_dis[0]=U8RH_data_H/10; //数据转换,因DHT11小断部份是保留,所以这里只显示出整数部份
ly_dis[1]=U8RH_data_H%10;
ly_dis[2]=((U8RH_data_L/10)%100)%10;
//input();
for(i=0;i<50;i++){//读取模块数据周期不易小于 2S ,这里用显示来等待时间
{
display(); //调用显示
//Show(bai,shi,ge);
}
}
if(((ly_dis[0]*100+ly_dis[1]*10+ly_dis[2])>650)||((ly_dis[0]*100+ly_dis[1]*10+ly_dis[2])<380))
J1=0;
else
J1=1;
}
}
19
展开阅读全文