基于HAL库,读取DHT11传感器温湿度数据的代码
时间: 2024-05-07 10:18:58 浏览: 86
以下是基于HAL库的读取DHT11传感器温湿度数据的代码:
```c
#include "stm32f1xx_hal.h"
#define DHT11_PIN GPIO_PIN_0
#define DHT11_PORT GPIOA
void delay_us(uint16_t us)
{
__HAL_TIM_SET_COUNTER(&htim3, 0);
while (__HAL_TIM_GET_COUNTER(&htim3) < us);
}
void DHT11_start(void)
{
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); // 拉低总线
delay_us(18000); // 等待18ms
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); // 拉高总线
delay_us(20); // 等待20us
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); // 拉低总线
}
uint8_t DHT11_read(void)
{
uint8_t i, j, data = 0;
for (j = 0; j < 8; j++)
{
i = 0;
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET) // 等待低电平结束
{
i++;
if (i > 100)
return 0;
delay_us(1);
}
i = 0;
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET) // 计算高电平时间
{
i++;
if (i > 100)
return 0;
delay_us(1);
}
if (i > 30) // 高电平时间超过30us,认为是数据1
data |= (1 << (7 - j));
}
return data;
}
uint8_t DHT11_read_data(uint8_t *temp, uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
DHT11_start();
if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET) // 等待DHT11响应
{
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET);
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET);
for (i = 0; i < 5; i++)
buf[i] = DHT11_read();
if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) // 校验数据
{
*humi = buf[0];
*temp = buf[2];
return 1;
}
}
return 0;
}
```
在上面的代码中,`DHT11_start()` 用于发送启动信号,`DHT11_read()` 用于读取单个数据位,`DHT11_read_data()` 用于读取温度和湿度值。其中,`delay_us()` 函数用于延时,可以根据实际情况进行修改。需要注意的是,此代码仅适用于单个DHT11传感器,如果需要读取多个DHT11传感器,需要使用不同的引脚和端口,并对代码进行相应修改。
阅读全文