【实验内容】
1.熟悉软件流程(Proteus 8 Professional,Keil uVision5),熟悉烧录流程,熟悉51芯片的引脚。
2.编写程序代码
3.用软件搭建实验电路,实现湿温度显示的功能。
【实验原理】
本项目是通过DHT11传感器获取温湿度数据,并将数据显示在LCD1602液晶屏上的嵌入式系统程序。
具体实验原理如下:
1.硬件连接:DHT11传感器的数据引脚通过P3^6连接到单片机,LCD1602液晶屏通过相应引脚连接到单片机。
2.DHT11_start函数用来发送开始信号给DHT11传感器,启动数据采集。
3.DHT11_rec_byte函数用来接收DHT11传感器传回的一个字节数据。
4.DHT11_receive函数中进行了具体的数据接收流程:发送开始信号、接收湿度和温度数据、校验数据是否正确。
5.如果接收到的数据校验正确,则将湿度和温度数据分别存储在RH、RL、TH、TL中,并将其转换为ASCII码形式存储在rec_dat数组中。
6.在主函数main中,初始化LCD1602液晶屏,然后循环不断地调用DHT11_receive函数获取最新的温湿度数据,并将数据显示在LCD1602液晶屏的第二行上。
整体实验原理就是通过DHT11传感器获取环境的温湿度数据,并通过单片机控制LCD1602液晶屏显示这些数据,实现一个简单的温湿度监测系统。
【实验记录与结果分析】
电路原理图:
程序代码
代码:
#include<reg51.h> |
#include<intrins.h> |
#include<LCD1602.h> |
#define uchar unsigned char |
#define uint unsigned int |
sbit Data=P3^6; |
uchar rec_dat[9]; |
bit fg=1; |
void DHT11_delay_us(uchar n) |
{ |
while(--n); |
} |
void DHT11_delay_ms(uint z) |
{ |
uint i,j; |
for(i=z;i>0;i--) |
for(j=110;j>0;j--); |
} |
void DHT11_start() |
{ |
Data=1; |
DHT11_delay_us(2); |
Data=0; |
DHT11_delay_ms(30); |
Data=1; |
DHT11_delay_us(30); |
} |
uchar DHT11_rec_byte() |
{ |
uchar i,dat=0; |
for(i=0;i<8;i++) |
{ |
while(!Data); |
DHT11_delay_us(8); |
dat<<=1; |
if(Data==1) |
dat+=1; |
while(Data); |
} |
return dat; |
} |
void DHT11_receive() |
{ |
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; |
DHT11_start(); |
if(Data==0) |
{ |
while(Data==0); |
DHT11_delay_us(40); |
R_H=DHT11_rec_byte(); |
R_L=DHT11_rec_byte(); |
T_H=DHT11_rec_byte(); |
T_L=DHT11_rec_byte(); |
revise=DHT11_rec_byte(); |
DHT11_delay_us(25); |
if((R_H+R_L+T_H+T_L)==revise) |
{ |
RH=R_H; |
RL=R_L; |
TH=T_H; |
TL=T_L; |
} |
|
rec_dat[0]='0'+(RH/10); |
rec_dat[1]='0'+(RH%10); |
rec_dat[2]='R'; |
rec_dat[3]='H'; |
rec_dat[4]=' '; |
rec_dat[5]=' '; |
rec_dat[6]='0'+(TH/10); |
rec_dat[7]='0'+(TH%10); |
rec_dat[8]=0xdf; |
rec_dat[9]=0x43; |
} |
} |
void main() |
{ |
LCD_init(); |
LCD_send(1,0,"TEMP&HUM:",9); |
DHT11_delay_ms(100); |
|
while(1) |
{ |
DHT11_receive(); |
LCD_send(2,0,rec_dat,10); |
} |
|
} |
【实验小结】
根据上述代码,这段程序实现了通过DHT11传感器测量温湿度数据,并将数据通过LCD1602显示出来。整体流程如下:
1.初始化LCD1602,显示"TEMP&HUM:"提示信息。
2.延时等待DHT11传感器初始化完成。
3.进入主循环,不断执行以下操作:
调用`DHT11_receive()`函数获取DHT11传感器采集的温湿度数据。
将获取的温湿度数据存储在`rec_dat`数组中。
将温湿度数据通过LCD1602显示出来。
在`DHT11_receive()`函数中:
发送起始信号,开始DHT11传感器数据采集。
判断DHT11传感器是否正确响应,若响应正常则继续接收数据。
通过调用`DHT11_rec_byte()`函数,逐位接收40位数据,包括相对湿度的高低位、温度的高低位和校验位。
对接收到的数据进行校验,如果校验通过则将温湿度数据存储在`RH`、`RL`、`TH`、`TL`变量中。
将温湿度数据转换为字符形式存储在`rec_dat`数组中,用于LCD1602显示。
实验小结:
通过这段代码,我成功实现了DHT11传感器与单片机的连接和数据采集,并通过LCD1602显示出获取的温湿度数据。这个实验展示了如何使用传感器获取环境数据,并通过外设显示模块展示给用户,为后续基于传感器的应用开发奠定了基础。在以后的实验中,可以进一步扩展功能,比如添加温湿度数据的记录和存储,或者实现数据的远程传输等。