写程序51单片机dht11湿度
时间: 2023-10-06 20:10:22 浏览: 36
以下是使用51单片机读取DHT11温湿度传感器数据的简单程序,需要使用STC-ISP或其他编程器进行下载。
```c
#include <reg51.h>
sbit DHT11 = P2^0; // DHT11连接到P2.0引脚
void delay_us(unsigned int us)
{
while(us--);
}
void delay_ms(unsigned int ms)
{
while(ms--)
{
delay_us(1000);
}
}
void start_signal()
{
DHT11 = 0; // 主机拉低DHT11引脚
delay_ms(18); // 持续18ms
DHT11 = 1; // 主机拉高DHT11引脚
delay_us(30); // 持续30us
while(DHT11); // 等待DHT11回应
while(!DHT11);
}
unsigned char read_byte()
{
unsigned char i, byte = 0;
for(i=0; i<8; i++)
{
while(!DHT11); // 等待一个高电平的开始位
delay_us(30); // 先延时30us
if(DHT11)
{
byte |= (1<<(7-i)); // 如果是高电平,该位为1
while(DHT11); // 等待该位传输结束
}
else
{
while(!DHT11); // 如果是低电平,等待传输结束
}
}
return byte;
}
void main()
{
unsigned char rh, temp, check;
while(1)
{
start_signal(); // 发送起始信号
rh = read_byte(); // 读取湿度整数部分
read_byte(); // 读取湿度小数部分,不需要使用
temp = read_byte(); // 读取温度整数部分
read_byte(); // 读取温度小数部分,不需要使用
check = read_byte(); // 读取校验和
if(check == (rh+temp)) // 如果校验和正确
{
// 处理温湿度数据,可以发送给其他设备或显示到LCD等
}
delay_ms(1000); // 每隔1s读取一次
}
}
```
需要注意的是,DHT11的数据传输是单线协议,需要使用软件延时来控制时序。同时,DHT11传输的数据是二进制码,需要使用位运算进行处理。在程序中,start_signal()函数用于发送起始信号,read_byte()函数用于读取8位二进制码,main()函数中使用while(1)循环持续读取温湿度数据。