51单片机使用DHT11的代码
时间: 2024-01-11 10:04:31 浏览: 75
51单片机 串口通信
以下是使用51单片机读取DHT11温湿度传感器数据的代码:
```c
#include <reg52.h>
#include <stdio.h>
#define DHT11_PIN P3_4
typedef unsigned char u8;
typedef unsigned int u16;
u8 Tdata[5];
void Delay_us(u16 t)
{
while (t--);
}
void Delay_ms(u16 t)
{
while (t--)
{
Delay_us(1000);
}
}
// 数据口初始化
void DHT11_Init(void)
{
DHT11_PIN = 1;
Delay_ms(20);
}
// 读取一个位
u8 DHT11_Read_Bit(void)
{
u8 retry = 0;
while (DHT11_PIN == 0 && retry < 100)
{
Delay_us(1);
retry++;
}
retry = 0;
while (DHT11_PIN == 1 && retry < 100)
{
Delay_us(1);
retry++;
}
Delay_us(40);
if (DHT11_PIN == 1)
{
return 1;
}
else
{
return 0;
}
}
// 读取一个字节
u8 DHT11_Read_Byte(void)
{
u8 i, dat = 0;
for (i = 0; i < 8; i++)
{
dat <<= 1;
dat |= DHT11_Read_Bit();
}
return dat;
}
// 读取温湿度数据
u8 DHT11_Read_Data(void)
{
u8 i;
// 主机发送起始信号
DHT11_PIN = 0;
Delay_ms(20);
DHT11_PIN = 1;
Delay_us(40);
// 等待DHT11响应
if (DHT11_PIN == 0)
{
while (DHT11_PIN == 0);
while (DHT11_PIN == 1);
for (i = 0; i < 5; i++)
{
Tdata[i] = DHT11_Read_Byte();
}
// 校验数据
if (Tdata[0] + Tdata[1] + Tdata[2] + Tdata[3] == Tdata[4])
{
return 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
void main(void)
{
u8 result;
u16 t, h;
while (1)
{
DHT11_Init();
result = DHT11_Read_Data();
if (result == 1)
{
t = Tdata[2];
h = Tdata[0];
printf("Temperature: %d.%dC, Humidity: %d.%d%%\r\n", t / 10, t % 10, h / 10, h % 10);
}
else
{
printf("Read DHT11 failed!\r\n");
}
Delay_ms(1000);
}
}
```
在使用之前,需要根据实际的硬件连接情况修改相应的引脚定义。
阅读全文