利用DHT11测温度湿度实验报告讲解.docx
《利用DHT11测温度湿度实验报告讲解.docx》由会员分享,可在线阅读,更多相关《利用DHT11测温度湿度实验报告讲解.docx(26页珍藏版)》请在冰豆网上搜索。
利用DHT11测温度湿度实验报告讲解
微电子工艺实验
题目气压温度测量系统
学生姓名洪强
学号***********
学院电子与信息工程学院
专业电子科学与技术
指导教师曹鸿霞
二O一五年十一月二十二日
参考文献22
测量气压温度测量系统
洪强
南京信息工程大学电子科学与技术,南京210044
摘 要
本实验基于使用STC89C52单片机、DHT11传感器模块、1602液晶显示屏模块以及报警模块。
简单明了的实现的可提要求。
DHT11数字温湿度传感器把采集到的温湿度数据传给单片机。
经过单片机的处理。
准确的显示到液晶屏上。
并对温湿度设置上下限。
越限报警。
)
关键词:
单片机 DHT11传感器 1602液晶显示屏 STC89C52 报警
1系统描述
1.1课程设计题目
温度测量及显示
要求:
①基于52系列单片机平台和DHT11温湿度传感器完成温湿度的测量;
②温度测量数据的显示,可以用LCD1602显示;
③对温湿度设置上下限,超过限度报警
1.2系统设计方案介绍
电路总体上分为温湿度采集部分、中央处理器、显示模块以及报警模块部分。
以STC89C52单片机最小系统作为核心控制电路,控制DHT11传感器采集的温湿度的转换,控制1602液晶屏的显示,以及蜂鸣器的报警。
具体显示内容及方式由软件来完成。
采集温湿度方面由DHT11传感器来完成,它是一个数字温湿度传感器、内置模数转换,可以直接与单片机相连接。
而1602液晶屏是插针式,也可以直接与单片机相连接。
因此不需要手动焊接等复杂的过程。
具体步骤是:
按照原理图将传感器、1602液晶显示屏分别接入单片机。
通过DHT11传感器采集当前的温湿度值、再经单片机,将处理后的数据传送到液晶屏上显示出来。
并且接入蜂鸣器。
设置温度的上下限值。
(如图一)
图1系统框图
1.3方案论证
方案一:
选用DS18B20温度传感器作为温度检测模块。
DS18B20是一线式数字温度传感器。
具有独特的单线式接口方式。
测量范围在—55℃~125℃,—10℃~85℃,误差范围在-\+0.5℃。
最高精度可达0.0625℃。
HS1101是电容式湿度传感器。
可测量相对湿度范围在0%~100%RH。
误差为-\+2%RH。
方案二:
选用DHT11作为设计的温湿度检测模块。
DHT11是一款集成型的数字温湿度一体传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
测量范围20%~90%RH,0℃~50℃。
测温精度为-\+2℃,测湿精度为-\+5%RH。
完全符合本次毕业设计的要求。
比较以上两种方案,虽然第一种方案在测量的精度方面比第二种更高,但是第二中方案的电路、软件设计更简单,在功耗、范围等方面达到要求,故本设计采用方案二。
2硬件电路设计
2.1LCD1602液晶显示模块
LCD1602液晶显示器是以点阵形式来显示字母、数字、符号和汉字的显示模块,显示内容范围为16*2,即可以显示两行,每行16个字符(即8个汉字)。
2.1.1LCD1602原理图及引脚说明
如下图2即为系统板中LCD1602的原理图:
图2LCD1602原理图
该LCD1602采用16引脚,通过VL口电压来控制背光大小,液晶的各个引脚说明如表3所示:
表3LCD1602引脚说明
编号
符号
引脚说明
编号
符号
引脚说明
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脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
2.1.2LCD1602操作时序
LCD1602的读写操作时序如下图4和图5所示:
图4读操作时序
图5写操作时序
2.2AT89C52单片机
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在线系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
下图为52单片机最小系统图
图6最小系统图
2.3 DHT11传感器模块
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
2.3.1DHT11原理图及引脚说明
DHT11传感器原理图如下7所示:
图7 DHT11传感器原理图
单片机的P2.0口用来发收串行数据,即数据口。
连接传感器的Pin2(单总线,串行数据)。
由于测量范围电路小于20米,建议加一个5K的上拉电阻,因此在传感器的Pin2口与电源之间连接一个5K电阻。
而传感器的电源端口Pin1和Pin4分别接单片机的VDD和GND端。
传感器的第三脚悬浮放置。
DHT11传感器原件的电路原理图如下8所示:
图8DHT11电路原理图
具体引脚如下
Pin1:
(VDD),电源引脚,供电电压为3~5.5V。
Pin2:
(DATA),串行数据,单总线。
Pin3:
(NC),空脚,请悬浮。
Pin4(VDD),接地端,电源负极。
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
2.3.2DHT11数据帧
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
2.3.3DHT11电气特性
电气特性:
VDD=5V,T=25℃,除非特殊标注(采样周期间隔不得低于1秒钟)
表8DHT11的电气特性
参数
条件
Min
typ
max
单位
供电
DC
3
5
5.5
V
供电电流
测量
0.5
2.5
mA
平均
0.2
1
mA
待机
100
150
uA
采样周期
秒
1
次
2.3.4DHT11操作时序
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
图9 通讯图
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
图10 通讯图
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如下图12所示:
图11数字信号0表示
数字1信号表示方法如下图13所示
图12数字1信号表示
2.4 蜂鸣器模块
蜂鸣器是一种一体化结构的电子讯响器。
采用直流电压供电,主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。
图13 蜂鸣器工作原理图
2.5 DHT11温湿度检测设计图
图14DHT11温湿度检测设计图
3软件程序设计
3.1程序流程图
图16 主程序流程图
3.2程序设计
3.2.1主程序
#include
#include
#include
typedefunsignedcharU8;/*definedforunsigned8-bitsintegervariable无符号8位整型变量*/
typedefunsignedintU16;/*definedforunsigned16-bitsintegervariable无符号16位整型变量*/
#definelcd_H
#include
#defineHIGH1
#defineLOW0
#defineTRUE1
#defineFALSE0
#defineZERO0
#defineMSB0x80
#defineLSB0x01
3.2.2LCD显示程序
#defineLINE10
#defineLINE21
#defineLINE1_HEAD0x80
#defineLINE2_HEAD0xC0
#defineDATA_MODE0x38
#defineOPEN_SCREEN0x0C
#defineDISPLAY_ADDRESS0x80
#defineCLEARSCREENLCD_en_com(0x01)
#defineLCDIOP1
sbitLCD1602_RS=P2^4;//定义端口
sbitLCD1602_RW=P2^3;
sbitLCD1602_EN=P2^2;
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//
sbitP2_0=P2^0;
sbitSPK=P0^7;
intt1,t2,ss;
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//
U8U8FLAG;
U8U8count,U8temp;
U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8U8comdata;
unsignedcharstr1[]={'s','h','i','d','u',':
'};
unsignedcharstr2[]={'w','e','n','d','u',':
'};
LCD_init();
voidDelay(U16j)
{U8i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDelay_10us(void)
{
U8i;
i--;
i--;
i--;
i--;
i--;
i--;
}
voidCOM(void)
{
U8i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!
P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
//如果高电平高过预定0高电平值则数据位为1
U8comdata<<=1;
U8comdata|=U8temp;//0
}//rof
}
voidLCD_Read_BF(void)
{
unsignedcharread=0;
LCD1602_RS=LOW;
LCD1602_RW=HIGH;
LCD1602_EN=HIGH;
LCDIO=0XFF;
read=LCDIO;}
voidLCD_en_com(unsignedcharcommand)//写指令
{
LCD_Read_BF();
LCD1602_RS=LOW;
LCD1602_RW=LOW;
LCD1602_EN=HIGH;
LCDIO=command;
LCD1602_EN=LOW;
}
voidLCD_en_dat(unsignedchardat)//写数据
{
LCD_Read_BF();
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=HIGH;
LCDIO=dat;
LCD1602_EN=LOW;
}
voidLCD_set_xy(unsignedcharx,unsignedchary)//写入地址函数
{
unsignedcharaddress;
if(y==LINE1)
address=LINE1_HEAD+x;
elseaddress=LINE2_HEAD+x;
LCD_en_com(address);
}
voidLCD_write_char(unsignedcharx,unsignedchary,unsignedchardat)//写入字符函数
{
LCD_set_xy(x,y);
LCD_en_dat(dat);
}
voidLCD_write_string(unsignedcharx,unsignedchary,unsignedchar*s)//写入字符串函数
{
LCD_set_xy(x,y);
while(*s)
{
LCDIO=*s;
LCD_en_dat(*s);
s++;
}
}
voidLCD_Init(void)//初始化函数
{
LCD_en_com(0x38);/*显示模式设置*/
Delay(5);
LCD_en_com(0x38);
Delay(5);
LCD_en_com(0x38);
Delay(5);
LCD_en_com(0x38);
LCD_en_com(0x08);/*显示关闭*/
LCD_en_com(0x01);/*显示清屏*/
LCD_en_com(0x06);/*显示光标移动设置*/
Delay(5);
LCD_en_com(0x0C);/*显示开及光标设置*/
}
//--------------------------------
//-----湿度读取子程序------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位==U8T_data_H------
//----温度低8位==U8T_data_L------
//----湿度高8位==U8RH_data_H-----
//----湿度低8位==U8RH_data_L-----
//----校验8位==U8checkdata-----
//----调用相关子程序如下----------
//----Delay();,Delay_10us();,COM();
//--------------------------------
voidRH(void)
{
//主机拉低18ms
P2_0=0;
Delay(180);
P2_0=1;
//总线由上拉电阻拉高主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入判断从机响应信号
P2_0=1;
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!
P2_0)//T!
{
U8FLAG=2;
//判断从机是否发出80us的低电平响应信号是否结束
while((!
P2_0)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
while((P2_0)&&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;
P2_0=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;
}
//湿度整数部分
str1[6]=(char)(0X30+U8RH_data_H/10);
str1[7]=(char)(0X30+U8RH_data_H%10);
//湿度小数部分
str1[9]=(char)(0X30+U8RH_data_L/10);
//温度整数部分
str2[6]=(char)(0X30+U8T_data_H/10);
str2[7]=(char)(0X30+U8T_data_H%10);
//温度小数部分
str2[9]=(char)(0X30+U8T_data_L/10);
t1=(int)(0X30+U8T_data_H/10);
t2=(int)(0X30+U8T_data_H%10);
ss=t1*10+t2;
}
}
voidxianshi(void)
{
LCD_write_char(0x00,0,'s');
LCD_write_char(0x01,0,'h');
LCD_write_char(0x02,0,'i');
LCD_write_char(0x03,0,'d');
LCD_write_char(0x04,0,'u');
LCD_write_char(0x05,0,':
');
LCD_write_char(0x06,0,str1[6]);
LCD_write_char(0x07,0,str1[7]);
LCD_write_char(0x08,0,'.');
LCD_write_char(0x09,0,str1[9]);
LCD_write_char(0x0B,0,'%');
LCD_write_char(0x0C,0,'R');
LCD_write_char(0x0D,0,'H');
LCD_write_char(0x00,1,'w');
LCD_write_char(0x01,1,'e');
LCD_write_char(0x02,1,'n');
LCD_write_char(0x03,1,'d');
LCD_write_cha