51单片机dht11代码
时间: 2023-11-06 22:07:15 浏览: 95
以下是51单片机使用DHT11温湿度传感器的代码:
```
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define DHT11_DATA P2_3
u8 Tdata_H,Tdata_L,Rdata_H,Rdata_L;
void Delay10us()
{
u8 i, j;
i = 2;
j = 199;
do
{
while (--j);
}while (--i);
}
void Delay_ms(u16 ms)
{
u16 i;
while(ms--)
{
i = 110;
while (i--);
}
}
void DHT11_Start()
{
DHT11_DATA = 0;
Delay_ms(20);
DHT11_DATA = 1;
Delay10us();
Delay10us();
Delay10us();
}
u8 DHT11_Check()
{
u8 i;
DHT11_DATA = 1;
Delay10us();
i = DHT11_DATA;
Delay10us();
return i;
}
u8 DHT11_ReadBit()
{
u8 i ;
DHT11_DATA = 0;
Delay10us();
i = DHT11_DATA;
Delay10us();
return i;
}
u8 DHT11_ReadByte()
{
u8 i, j, dat = 0;
for (j = 0; j < 8; j++)
{
i = DHT11_ReadBit();
dat <<= 1;
dat |= i;
}
return dat;
}
void DHT11_ReadData()
{
DHT11_Start();
if (DHT11_Check() == 0)
{
Tdata_H = DHT11_ReadByte();
Tdata_L = DHT11_ReadByte();
Rdata_H = DHT11_ReadByte();
Rdata_L = DHT11_ReadByte();
}
}
void main()
{
while(1)
{
DHT11_ReadData();
printf("Temperature: %d.%d\n", Tdata_H, Tdata_L);
printf("Humidity: %d.%d\n", Rdata_H, Rdata_L);
Delay_ms(1000);
}
}
```
在以上代码中,我们先定义了一些数据类型和需要用到的IO口。然后定义了一些延时函数,包括了10微秒的延时和毫秒级的延时。
接下来就是正式的DHT11驱动函数了。其中`DHT11_Start()`是开始信号的发送函数,`DHT11_Check()`是检测DHT11是否正确响应的函数,`DHT11_ReadBit()`是读取一个比特位的函数,`DHT11_ReadByte()`是读取一个字节的函数。`DHT11_ReadData()`则是将温湿度数据读取出来的函数。
最后在`main()`函数中不断读取温湿度数据并输出。
需要注意的是,这里使用了printf()函数,需要在工程中添加对应的库文件支持。
阅读全文