利用DHT11测温度湿度实验报告讲解

更新时间:2023-05-03 04:40:02 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微电子工艺实验题目气压温度测量系统

学生姓名洪强

学号20121321027

学院电子与信息工程学院

专业电子科学与技术

指导教师曹鸿霞

二O一五年十一月二十二日

目录

目录............................................... 错误!未定义书签。

1 系统描述......................................... 错误!未定义书签。

1.1 课程设计题目 (2)

1.2 系统设计方案介绍 (2)

1.3 方案论证 (3)

2 硬件电路设计 (3)

2.1 LCD1602液晶显示模块 (3)

2.1.1 LCD1602原理图及引脚说明 (4)

2.1.2 LCD1602操作时序 (5)

2.2 AT89C52单片机 (6)

2.3 DHT11传感器模块 (7)

2.3.1 DHT11原理图及引脚说明 (7)

2.3.2 DHT11数据帧 (8)

2.3.3 DHT11电气特性 (8)

2.3.4 DHT11操作时序 (9)

2.4 蜂鸣器模块 (10)

2.5 DHT11温湿度检测设计图 (11)

3 软件程序设计 (11)

3.1 程序流程图 (11)

3.2程序设计 (12)

3.2.1主程序 (12)

3.2.2 LCD显示程序 (13)

3.2.3蜂鸣器程序 (20)

4 实验结果 (21)

5 实验总结 (22)

参考文献 (22)

1

测量气压温度测量系统

洪强

南京信息工程大学电子科学与技术,南京 210044

摘要

本实验基于使用STC89C52单片机、DHT11传感器模块、1602液晶显示屏模块以及报警模块。简单明了的实现的可提要求。DHT11数字温湿度传感器把采集到的温湿度数据传给单片机。经过单片机的处理。准确的显示到液晶屏上。并对温湿度设置上下限。越限报警。)

关键词:单片机DHT11传感器1602液晶显示屏STC89C52 报警

1 系统描述

1.1 课程设计题目

温度测量及显示

要求:①基于52系列单片机平台和DHT11温湿度传感器完成温湿度的测量;

②温度测量数据的显示,可以用LCD1602显示;

③对温湿度设置上下限,超过限度报警

1.2 系统设计方案介绍

电路总体上分为温湿度采集部分、中央处理器、显示模块以及报警模块部分。以STC89C52单片机最小系统作为核心控制电路,控制DHT11传感器采集的温湿度的转换,控制1602液晶屏的显示,以及蜂鸣器的报警。具体显示内容及方式由软件来完成。采集温湿度方面由DHT11传感器来完成,它是一个数字温湿度传感器、内置模数转换,可以直接与单片机相连接。而1602液晶屏是插针式,也可以直接与单片机相连接。因此不需要手动焊接等复杂的过程。具体步骤是:按照原理图将传感器、1602液晶显示屏分别接入单片机。通过DHT11传感器采集当前的温湿度值、再经单片机,将处理后的数据传送到液晶屏上显示出来。并且接入蜂鸣器。设置温度的上下限值。(如图一)

2

3

图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.1 LCD1602液晶显示模块

LCD1602液晶显示器是以点阵形式来显示字母、数字、符号和汉字的显示模块,显示内容范围为16*2,即可以显示两行,每行16个字符(即8个汉字)。

P2.0 STC89C52主控模块 P2.2~P2.4 P0.7 DHT11传感器模块 1602字符液晶模块 报警模块

传感器与之相

连 1602字符液晶与之相连

2.1.1 LCD1602原理图及引脚说明

如下图2即为系统板中LCD1602的原理图:

图2 LCD1602原理图

该LCD1602采用16引脚,通过VL口电压来控制背光大小,液晶的各个引脚说明如表3所示:

表3 LCD1602引脚说明

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

1 VSS 电源地9 D

2 数据

2 VDD 电源正极10 D

3 数据

3 VL 液晶显示偏压11 D

4 数据

4 RS 数据/命令选择12 D

5 数据

5 R/W 读/写选择13 D

6 数据

6 E 使能信号14 D

7 数据

7 D0 数据15 BLA 背光源正极

8 D1 数据16 BLK 背光源负极

具体功能如下:

第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

4

5 第5脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和R/W 共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W 为高电平时可以读忙信号,当RS 为高电平R/W 为低电平时可以写入数据。

第6脚:E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。

第15脚:背光源正极。

第16脚:背光源负极。

2.1.2 LCD1602操作时序

LCD1602的读写操作时序如下图4和图5所示: tPW tR

tHD2

tSP1

Valid Data

tc

tD

RS

R/W

E

DB0-DB7tHD1

图4 读操作时序

tsp1 RS

R/W

E

tHD1

tpw

tR

tHD2

tsp2

Valid Data

tc

DB7-DB0

tF

图5 写操作时序

2.2 AT89C52单片机

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

图6 最小系统图

2.3DHT11传感器模块

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。产品为4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

2.3.1 DHT11原理图及引脚说明

DHT11传感器原理图如下7所示:

图7DHT11传感器原理图

单片机的P2.0口用来发收串行数据,即数据口。连接传感器的Pin2(单总线,串行数据)。由于测量范围电路小于20米,建议加一个5K的上拉电阻,因此在传感器的Pin2口与电源之间连接一个5K电阻。而传感器的电源端口Pin1和Pin4分别接单片机的VDD和

GND端。传感器的第三脚悬浮放置。DHT11传感器原件的电路原理图如下8所示:

7

8

图8 DHT11电路原理图

具体引脚如下

Pin1:(VDD),电源引脚,供电电压为3~5.5V 。

Pin2:(DATA ),串行数据,单总线。

Pin3:(NC ),空脚,请悬浮。

Pin4(VDD ),接地端,电源负极。

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

2.3.2 DHT11数据帧

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms 左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:

一次完整的数据传输为40bit,高位先出。

数据格式:8bit 湿度整数数据+8bit 湿度小数数据

+8bi 温度整数数据+8bit 温度小数数据

数据传送正确时校验和数据等于“8bit 湿度整数数据+8bit 湿度小数数据+8bi 温度整数数据+8bit 温度小数数据”所得结果的末8位。

2.3.3 DHT11电气特性

电气特性:VDD=5V ,T = 25℃,除非特殊标注(采样周期间隔不得低于1秒钟)

表8 DHT11的电气特性

9

2.3.4 DHT11操作时序

用户MCU 发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit 的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

图9 通讯图

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

图10 通讯图

参数 条件 Min typ max 单位 供电 DC 3 5

5.5 V 供电电流

测量 0.5 2.5 mA 平均 0.2 1 mA 待机

100 150 uA 采样周期

1

总线为低电平,说明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”等)表示。

10

图13蜂鸣器工作原理图2.5DHT11温湿度检测设计图

图14 DHT11温湿度检测设计图

3 软件程序设计

3.1 程序流程图

11

12

图 16 主程序流程图

3.2程序设计

3.2.1主程序

#include

#include

#include

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */

#define lcd_H

#include

#define HIGH 1

#define LOW 0

#define TRUE 1

#define FALSE 0 开始

初始化

延时

温湿度测量 1602显示数

据 判断温

温度

低于a ℃ 高于b ℃

蜂鸣器铃响 蜂鸣器铃响

结束

#define ZERO 0

#define MSB 0x80

#define LSB 0x01

3.2.2 LCD显示程序

#define LINE1 0

#define LINE2 1

#define LINE1_HEAD 0x80

#define LINE2_HEAD 0xC0

#define DATA_MODE 0x38

#define OPEN_SCREEN 0x0C

#define DISPLAY_ADDRESS 0x80

#define CLEARSCREEN LCD_en_com(0x01)

#define LCDIO P1

sbit LCD1602_RS = P2^4; //定义端口

sbit LCD1602_RW = P2^3;

sbit LCD1602_EN = P2^2;

//----------------------------------------------//

//----------------IO口定义区--------------------//

//----------------------------------------------//

sbit P2_0 = P2^0 ;

sbit SPK=P0^7;

int t1,t2,ss;

//----------------------------------------------//

//----------------定义区--------------------//

//----------------------------------------------//

U8 U8FLAG;

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_t emp;

13

U8 U8comdata;

unsigned char str1[]={'s','h','i','d','u',':'}; unsigned char str2[]={'w','e','n','d','u',':'};

LCD_init();

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((!P2_0)&&U8FLAG++);

14

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

}

void LCD_Read_BF(void)

{

unsigned char read=0;

LCD1602_RS=LOW;

LCD1602_RW=HIGH;

LCD1602_EN=HIGH;

LCDIO=0XFF;

read=LCDIO;}

void LCD_en_com(unsigned char command)//写指令

{

LCD_Read_BF();

LCD1602_RS=LOW;

LCD1602_RW=LOW;

LCD1602_EN=HIGH;

LCDIO=command;

15

LCD1602_EN=LOW;

}

void LCD_en_dat(unsigned char dat)//写数据

{

LCD_Read_BF();

LCD1602_RS=HIGH;

LCD1602_RW=LOW;

LCD1602_EN=HIGH;

LCDIO=dat;

LCD1602_EN=LOW;

}

void LCD_set_xy(unsigned char x,unsigned char y) //写入地址函数

{

unsigned char address;

if(y==LINE1)

address=LINE1_HEAD+x;

else address=LINE2_HEAD+x;

LCD_en_com(address);

}

void LCD_write_char(unsigned char x,unsigned char y,unsigned char dat)//写入字符函数{

LCD_set_xy(x,y);

LCD_en_dat(dat);

}

void LCD_write_string(unsigned char x,unsigned char y,unsigned char *s)//写入字符串函数{

LCD_set_xy(x,y);

while(*s)

{

LCDIO=*s;

LCD_en_dat(*s);

16

s++;

}

}

void LCD_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();

17

//--------------------------------

void RH(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;

18

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;

}

}

void xianshi(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');

19

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_char(0x04,1,'u');

LCD_write_char(0x05,1,':');

LCD_write_char(0x06,1,str2[6]);

LCD_write_char(0x07,1,str2[7]);

LCD_write_char(0x08,1,'.');

LCD_write_char(0x09,1,str1[9]);

LCD_write_char(0x0B,1,0x27);

LCD_write_char(0x0C,1,'C');

}

3.2.3蜂鸣器程序

void laba()

{

unsigned int i;

if(ss>554||ss<500)

{

for(i=0;i<200;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短{

Delay(160); //参数决定发声的频率,估算值,可以自行更改参数并

SPK=!SPK;

}

20

本文来源:https://www.bwwdw.com/article/10ne.html

Top