C51的DHT11(温湿度传感器)LCD1602显示编程
时间: 2023-10-22 12:06:31 浏览: 196
好的,以下是基于C51单片机的DHT11温湿度传感器并通过LCD1602显示的编程步骤:
1. 定义端口:将DHT11的数据线连接到C51单片机的I/O端口上,定义该端口为输入端口;将LCD1602的数据线和控制线连接到C51单片机的I/O端口上,分别定义为输出端口。
2. 初始化LCD1602:发送一系列指令,完成LCD1602的初始化,包括设置显示模式、清屏、光标归位等。
3. 发送起始信号:将数据线拉低至少18ms,然后将数据线拉高20~40us,等待DHT11响应。
4. 接收响应信号:DHT11会通过数据线发送一个80us低电平的响应信号,然后再发送一个80us的高电平信号。
5. 接收数据:DHT11会发送40位的数据,每一位数据都是50us的低电平,或者26~28us的高电平,高电平的时间长短表示0或1。
6. 解析数据:将接收到的40位数据解析,分别得到温度和湿度的数值,并计算出校验和。
7. 显示数据:将温度和湿度的数值显示在LCD1602上。
以下是示例代码:
```
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DHT11=P1^4; //将DHT11数据线连接到P1.4口上
sbit RS=P2^0; //将LCD1602的RS端口连接到P2.0口上
sbit RW=P2^1; //将LCD1602的RW端口连接到P2.1口上
sbit EN=P2^2; //将LCD1602的EN端口连接到P2.2口上
void DHT11_delay(uint i) //延时函数
{
while(i--);
}
void LCD1602_delay(uint i) //LCD1602延时函数
{
while(i--);
}
void LCD1602_write_cmd(uchar cmd) //向LCD1602发送命令
{
RS=0;
RW=0;
P0=cmd;
EN=1;
LCD1602_delay(5);
EN=0;
}
void LCD1602_write_data(uchar dat) //向LCD1602发送数据
{
RS=1;
RW=0;
P0=dat;
EN=1;
LCD1602_delay(5);
EN=0;
}
void LCD1602_init() //初始化LCD1602
{
LCD1602_write_cmd(0x38); //设置显示模式为16×2,5×7点阵,8位数据
LCD1602_delay(100);
LCD1602_write_cmd(0x0c); //开启显示,关闭光标,关闭闪烁
LCD1602_delay(100);
LCD1602_write_cmd(0x06); //光标右移,字符不移动
LCD1602_delay(100);
LCD1602_write_cmd(0x01); //清屏,光标归位
LCD1602_delay(100);
}
void DHT11_start() //发送起始信号
{
DHT11=0;
DHT11_delay(18000);
DHT11=1;
DHT11_delay(40);
while(DHT11==1);
while(DHT11==0);
while(DHT11==1);
}
uchar DHT11_read_byte() //读取一个字节的数据
{
uchar i,j;
uchar dat=0;
for(j=0;j<8;j++)
{
while(DHT11==0);
DHT11_delay(30);
if(DHT11==1)
{
i=1;
while(DHT11==1);
}
else
{
i=0;
}
dat=(dat<<1)|i;
}
return dat;
}
void DHT11_read_data(uchar *buf) //读取温湿度数据
{
uchar R_data_H,R_data_L,T_data_H,T_data_L,checkdata;
DHT11_start();
R_data_H=DHT11_read_byte();
R_data_L=DHT11_read_byte();
T_data_H=DHT11_read_byte();
T_data_L=DHT11_read_byte();
checkdata=DHT11_read_byte();
if(R_data_H+R_data_L+T_data_H+T_data_L==checkdata) //校验数据是否正确
{
buf[0]=T_data_H/10+'0';
buf[1]=T_data_H%10+'0';
buf[2]='.';
buf[3]=T_data_L/10+'0';
buf[4]=T_data_L%10+'0';
buf[5]='C';
buf[6]=' ';
buf[7]=R_data_H/10+'0';
buf[8]=R_data_H%10+'0';
buf[9]='.';
buf[10]=R_data_L/10+'0';
buf[11]=R_data_L%10+'0';
buf[12]='%';
buf[13]='\0';
//将温湿度数据存储到数组中
//依次为:温度整数部分、小数点、温度小数部分、温度单位、湿度整数部分、小数点、湿度小数部分、湿度单位、结束符
}
}
void LCD1602_display(uchar *buf) //在LCD1602上显示温湿度数据
{
uchar i;
LCD1602_write_cmd(0x80); //将光标移动到第一行第一列
for(i=0;i<14;i++)
{
LCD1602_write_data(buf[i]); //依次发送14个字符
}
}
void main()
{
uchar buf[14]; //定义一个数组,用于存放温湿度数据
LCD1602_init(); //初始化LCD1602
while(1)
{
DHT11_read_data(buf); //读取温湿度数据
LCD1602_display(buf); //将温湿度数据显示在LCD1602上
}
}
```
以上是一个基于C51单片机的DHT11温湿度传感器并通过LCD1602显示的编程示例,供您参考。
阅读全文