51单片机dht11代码
时间: 2023-07-02 22:11:40 浏览: 84
以下是基于51单片机的DHT11温湿度传感器读取代码,供参考:
```
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DHT11 = P1^0; // DHT11数据线连接的单片机IO口
uchar T_data_H, T_data_L, RH_data_H, RH_data_L, checkdata; // 定义传感器数据存储变量
void delay_us(uint us) // 微秒级延时函数
{
while(us--);
}
void delay_ms(uint ms) // 毫秒级延时函数
{
uint i, j;
for(i=0; i<ms; i++)
{
for(j=0; j<114; j++);
}
}
void Init_DHT11() // DHT11初始化函数
{
DHT11 = 1; // 主机先将总线拉高
delay_ms(30); // 延时等待DHT11稳定
DHT11 = 0; // 主机将总线拉低,开始传输数据
delay_us(18); // 拉低18ms
DHT11 = 1; // 主机将总线拉高
delay_us(40); // 延时等待DHT11响应
while(DHT11); // 等待DHT11拉低数据线,开始数据传输
while(!DHT11); // 等待DHT11拉高数据线,开始数据传输
while(DHT11); // 等待DHT11拉低数据线,开始数据传输
}
uchar Read_DHT11() // 读取DHT11传感器数据
{
uchar i, j;
for(j=0; j<8; j++)
{
while(!DHT11); // 每一位数据开始,DHT11拉低数据线50us
delay_us(30); // 若数据为0,继续拉低30us,若为1,拉高70us
if(DHT11 == 0)
{
i <<= 1; // 如果拉低了30us,说明数据为0
}
else
{
i <<= 1; // 如果拉高了70us,说明数据为1
i |= 1;
}
while(DHT11); // 一位数据读取完毕后,DHT11拉高数据线等待下一位数据
}
return i;
}
void main()
{
Init_DHT11(); // 初始化DHT11传感器
RH_data_H = Read_DHT11(); // 读取湿度高8位数据
RH_data_L = Read_DHT11(); // 读取湿度低8位数据
T_data_H = Read_DHT11(); // 读取温度高8位数据
T_data_L = Read_DHT11(); // 读取温度低8位数据
checkdata = Read_DHT11(); // 读取校验和数据
if(checkdata == (RH_data_H + RH_data_L + T_data_H + T_data_L)) // 校验数据是否正确
{
// 数据处理,温湿度数据为:T_data_H、T_data_L、RH_data_H、RH_data_L
}
else
{
// 校验失败,数据无效
}
}
```
需要注意的是,DHT11传感器的数据线需要通过一个上拉电阻连接到单片机的IO口上,并且在初始化时需要先将总线拉高,等待传感器稳定后再开始传输数据。读取数据时,需要通过延时函数控制数据线的高低电平时间,根据不同的高低电平时间判断数据为0或1。最后还需要校验数据的正确性。
阅读全文