stm32 dht 11
时间: 2025-05-15 16:06:32 浏览: 29
### STM32 上使用 DHT11 传感器的教程
#### 驱动代码实现
为了在 STM32 平台上成功使用 DHT11 温湿度传感器,需要完成初始化、发送启动信号以及接收数据的过程。以下是具体的驱动代码示例:
```c
#include "stm32f10x.h"
#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_Pin_1
void DHT11_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
// 发送启动信号给 DHT11
void DHT11_Start(void) {
DHT11_GPIO_Init();
DHT11_PORT->CRH &= ~(0xF << (4 * ((uint16_t)(DHT11_PIN >> 8)))); // 设置为推挽输出
DHT11_PORT->ODR &= ~DHT11_PIN; // 输出低电平
Delay_ms(20); // 延迟 20ms
DHT11_PORT->ODR |= DHT11_PIN; // 拉高电平
Delay_us(40); // 延迟 40us
DHT11_PORT->CRH |= (0x4 << (4 * ((uint16_t)(DHT11_PIN >> 8)))); // 切换为输入浮空模式
}
// 等待 DHT11 的响应
u8 DHT11_WaitAck(void) {
u8 retry = 0;
while (DHT11_PORT->IDR & DHT11_PIN && (++retry < 200));
if (retry >= 200) return 1; // 超时返回错误
retry = 0;
while (!(DHT11_PORT->IDR & DHT11_PIN) && (++retry < 200));
if (retry >= 200) return 1; // 超时返回错误
return 0; // 成功接收到应答信号
}
```
上述代码实现了对 DHT11 的硬件接口配置和通信协议支持[^3]。
#### 数据解析逻辑
当设备发出请求并接收到应答后,需进一步读取来自 DHT11 的温湿度数据包。每组数据由 40bit 组成,具体含义如下:
- **第 1 至 8 bit**: 整数部分湿度;
- **第 9 至 16 bit**: 小数部分湿度;
- **第 17 至 24 bit**: 整数部分温度;
- **第 25 至 32 bit**: 小数部分温度;
- **最后 8 bit**: 校验位(前四个字节之和的最低有效字节)。
通过逐位读取这些数据,并验证校验值的一致性来确保传输无误[^1]。
#### 完整流程概述
整个工作流包括以下几个阶段:
1. 初始化 GPIO 引脚用于控制与采集。
2. 向 DHT11 提供至少持续 `20ms` 的低电平作为触发条件。
3. 进入监听状态等待其回应脉冲。
4. 解码后续传来的序列化数值片段直至结束标志到达为止[^2]。
---
阅读全文
相关推荐

















