c51单片机dht11程序
时间: 2023-09-22 16:11:01 浏览: 111
C51_DHT11程序.pdf
以下是使用C语言编写的C51单片机DHT11温湿度传感器程序:
```c
#include <reg51.h>
sbit DHT11 = P2^0; // DHT11传感器连接的引脚
void delay_us(unsigned int us) // 延时函数,延时us微秒
{
while(us--);
}
void delay_ms(unsigned int ms) // 延时函数,延时ms毫秒
{
while(ms--)
delay_us(1000);
}
unsigned char read_byte(void) // 读取一个字节的数据
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
while(!DHT11); // 等待DHT11拉低引脚
delay_us(30); // 等待30us
if(DHT11)
dat |= 1 << (7 - i); // 如果DHT11仍然是高电平,说明是1
while(DHT11); // 等待DHT11拉高引脚
}
return dat;
}
void read_dht11(unsigned char *temp, unsigned char *humi) // 读取DHT11传感器的温度和湿度
{
unsigned char buf[5], i;
// 发送起始信号
DHT11 = 0; // 拉低引脚
delay_ms(20); // 持续至少18ms
DHT11 = 1; // 拉高引脚
delay_us(30); // 等待30us
// 接收响应信号
if(!DHT11) // 低电平持续80us后,DHT11拉高引脚50us,然后再拉低50us
{
while(!DHT11); // 等待DHT11拉高引脚
while(DHT11); // 等待DHT11拉低引脚
for(i = 0; i < 5; i++)
buf[i] = read_byte(); // 依次读取40位数据
if(buf[0] + buf[1] + buf[2] + buf[3] == buf[4]) // 校验数据
{
*humi = buf[0]; // 湿度
*temp = buf[2]; // 温度
}
}
}
void main()
{
unsigned char temp, humi;
while(1)
{
read_dht11(&temp, &humi);
// 将温度和湿度显示到数码管或LCD屏幕上
// ...
}
}
```
该程序首先定义了DHT11传感器连接的引脚为P2.0,并编写了延时函数和读取一个字节数据的函数read_byte。然后编写了读取DHT11传感器温度和湿度的函数read_dht11,包括发送起始信号、接收响应信号和读取40位数据,并进行校验。最后在主函数中循环读取DHT11传感器的温度和湿度,并将其显示到数码管或LCD屏幕上。需要注意的是,DHT11传感器的数据格式是4个字节的数据,其中第一个字节是湿度的整数部分,第二个字节是湿度的小数部分,第三个字节是温度的整数部分,第四个字节是温度的小数部分,最后一个字节为校验和。因此需要在读取40位数据后进行校验。
阅读全文