dht11温湿度传感器stm32f103c8
时间: 2025-06-05 10:32:58 浏览: 26
### STM32F103C8与DHT11温湿度传感器驱动代码及配置
#### 1. 硬件连接
在使用 STM32F103C8T6 和 DHT11 温湿度传感器时,需要正确连接硬件。通常情况下,DHT11 的引脚包括 VCC、GND、DATA 和 NC(未连接)。以下是推荐的硬件连接方式[^2]:
- VCC 连接到 STM32 的 3.3V 或 5V 电源。
- GND 连接到 STM32 的地线。
- DATA 引脚连接到 STM32 的一个 GPIO 引脚,例如 PA0。
#### 2. 软件配置
STM32 的软件配置主要包括初始化 GPIO 引脚以及编写 DHT11 的驱动代码。以下是一个完整的示例配置和驱动代码。
#### 3. 驱动代码示例
以下是一个基于标准库的 DHT11 驱动代码示例[^3]:
```c
#include "stm32f10x.h"
#include "Delay.h"
#define DHT11_PIN GPIO_Pin_0
#define DHT11_PORT GPIOA
void DHT11_GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置为输出模式
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
uint8_t DHT11_Read_Bit(void) {
uint8_t retry = 0;
while ((GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET) && (retry < 100)) {
retry++;
}
retry = 0;
while ((GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET) && (retry < 100)) {
retry++;
}
if (retry >= 40) return 1; // 高电平持续时间较长,表示读取到的是1
else return 0; // 否则为0
}
uint8_t DHT11_Read_Byte(void) {
uint8_t i, dat = 0;
for (i = 0; i < 8; i++) {
dat <<= 1;
dat |= DHT11_Read_Bit();
}
return dat;
}
void DHT11_Start(void) {
uint8_t retry = 0;
GPIO_SetBits(DHT11_PORT, DHT11_PIN); // 设置为高电平
Delay_ms(100); // 延时100ms
GPIO_WriteBit(DHT11_PORT, DHT11_PIN, Bit_RESET); // 拉低至少18ms
Delay_ms(20);
GPIO_WriteBit(DHT11_PORT, DHT11_PIN, Bit_SET); // 拉高并等待响应
Delay_us(30);
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_SET && retry < 100) { // 等待下降沿
retry++;
}
retry = 0;
while (GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN) == Bit_RESET && retry < 100) { // 等待上升沿
retry++;
}
}
uint8_t DHT11_Read_Data(uint8_t *humidity, uint8_t *temperature) {
uint8_t buf[5];
uint8_t checksum = 0;
DHT11_Start(); // 发送开始信号
buf[0] = DHT11_Read_Byte(); // 湿度整数部分
buf[1] = DHT11_Read_Byte(); // 湿度小数部分
buf[2] = DHT11_Read_Byte(); // 温度整数部分
buf[3] = DHT11_Read_Byte(); // 温度小数部分
buf[4] = DHT11_Read_Byte(); // 校验和
checksum = buf[0] + buf[1] + buf[2] + buf[3];
if (checksum == buf[4]) {
*humidity = buf[0];
*temperature = buf[2];
return 1; // 成功
} else {
return 0; // 失败
}
}
```
#### 4. 使用说明
上述代码实现了对 DHT11 的基本操作,包括启动信号发送、数据读取和校验。用户可以通过调用 `DHT11_Read_Data` 函数获取湿度和温度值[^3]。
#### 5. OLED 显示代码
如果需要将温湿度数据显示在 OLED 屏幕上,可以参考以下代码片段:
```c
#include "OLED.h"
void Display_Temperature_Humidity(uint8_t humidity, uint8_t temperature) {
char buffer[20];
OLED_Clear();
OLED_ShowString(0, 0, "Humidity:");
OLED_ShowString(0, 1, "Temperature:");
sprintf(buffer, "%d%%", humidity);
OLED_ShowString(80, 0, buffer);
sprintf(buffer, "%dC", temperature);
OLED_ShowString(80, 1, buffer);
}
```
#### 6. 主函数示例
以下是一个主函数示例,展示如何结合 DHT11 和 OLED 显示屏工作[^2]:
```c
int main(void) {
DHT11_GPIO_Config();
OLED_Init();
while (1) {
uint8_t humidity, temperature;
if (DHT11_Read_Data(&humidity, &temperature)) {
Display_Temperature_Humidity(humidity, temperature);
}
Delay_ms(2000); // 每2秒刷新一次
}
}
```
阅读全文
相关推荐


















