51单片机控制DHT11的代码
时间: 2023-11-13 12:03:56 浏览: 92
以下是51单片机控制DHT11的代码,供参考:
```
#include <reg51.h>
sbit DHT11 = P1^4; //定义DHT11数据引脚
void Delay(unsigned int t) //延时函数
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
void DHT11_Start() //DHT11启动函数
{
DHT11 = 0; //拉低数据引脚
Delay(20); //延时20ms
DHT11 = 1; //拉高数据引脚
Delay(30); //延时30us
}
unsigned char DHT11_Response() //DHT11响应函数
{
unsigned char response = 0;
Delay(40);
if(!DHT11) //判断DHT11是否响应
{
Delay(80);
if(DHT11) //判断DHT11是否发出确认信号
response = 1;
else
response = -1; //若无响应则返回-1
}
while(DHT11); //等待DHT11拉低数据引脚
return response;
}
unsigned char Read_DHT11() //读取DHT11数据
{
unsigned char i, j;
unsigned char data = 0;
for(j=0; j<8; j++)
{
while(!DHT11); //等待DHT11拉高数据引脚
Delay(30);
if(DHT11) //若数据为1则记录
{
data |= (1<<(7-j));
}
while(DHT11); //等待DHT11拉低数据引脚
}
return data;
}
void main()
{
unsigned char humi_data, temp_data, check_data;
while(1)
{
DHT11_Start(); //启动DHT11
if(DHT11_Response() == 1) //判断DHT11是否响应
{
humi_data = Read_DHT11(); //读取湿度数据
temp_data = Read_DHT11(); //读取温度数据
check_data = Read_DHT11(); //读取校验和
if((humi_data + temp_data) == check_data) //判断校验和是否正确
{
//将湿度和温度数据输出到串口或LCD等
}
}
Delay(500); //每500ms读取一次
}
}
```
注意事项:
1. DHT11的数据引脚需要接到51单片机的IO口上。
2. 在读取DHT11数据时需要按照数据格式进行读取,具体可以参考DHT11的数据手册。
3. 在读取数据之后需要进行校验和的检测,判断读取是否正确。
阅读全文