51单片机dht11温湿度
时间: 2023-08-26 18:04:49 浏览: 35
51单片机可以通过DHT11模块测量温度和湿度。以下是基本的步骤:
1. 连接DHT11模块到51单片机的GPIO口,其中VCC连接到3.3V电源,GND连接到GND,DATA连接到一个GPIO口(比如P2.0)。
2. 在程序中定义GPIO口为输入模式,并在循环中读取数据。
```
sbit DHT11_DATA = P2^0;
void DHT11_ReadData()
{
uint8_t i, j, checksum;
uint8_t buffer[5];
bit error_flag;
// 拉低DATA口至少18ms
DHT11_DATA = 0;
DelayMs(20);
// 拉高DATA口20-40us
DHT11_DATA = 1;
DelayUs(30);
// 等待DHT11回应,低电平80us,高电平80us
error_flag = DHT11_DATA;
DelayUs(80);
if (DHT11_DATA != error_flag) {
printf("DHT11 no response!\n");
return;
}
error_flag = DHT11_DATA;
DelayUs(80);
if (DHT11_DATA == error_flag) {
printf("DHT11 response error!\n");
return;
}
// 接收40bit数据
for (j = 0; j < 5; j++) {
for (i = 0; i < 8; i++) {
error_flag = DHT11_DATA;
DelayUs(50);
buffer[j] <<= 1;
if (DHT11_DATA != error_flag) {
buffer[j] |= 0x01;
}
}
}
// 验证校验和
checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];
if (checksum != buffer[4]) {
printf("DHT11 checksum error!\n");
return;
}
// 输出温度和湿度
printf("Temperature: %d.%d C\n", buffer[2], buffer[3]);
printf("Humidity: %d.%d RH\n", buffer[0], buffer[1]);
}
```
3. 在主函数中调用DHT11_ReadData()函数即可。
```
void main()
{
while (1) {
DHT11_ReadData();
DelayMs(1000);
}
}
```
注意事项:
- DHT11模块的数据线需要加上上拉电阻,一般使用10K欧姆的电阻即可。
- 在读取数据时需要延时精确,可以使用定时器或者循环延时函数。
- DHT11模块的数据输出为数字信号,需要进行解码和校验。