# STM32串口采集温度传感器数据实战教程
## 目录
1. [实验目标](#1-实验目标)
2. [硬件准备](#2-硬件准备)
3. [开发环境搭建](#3-开发环境搭建)
4. [CubeMX工程配置](#4-CubeMX工程配置)
5. [代码实现解析](#5-代码实现解析)
6. [调试与效果验证](#6-调试与效果验证)
7. [常见问题解决](#7-常见问题解决)
---
### 1. 实验目标
通过STM32F103C8T6开发板实现:
✅ 串口1(USART1)通信配置
✅ DHT11温湿度传感器数据采集
✅ 十进制数据显示到串口调试助手
✅ 数据每秒更新频率
---
### 2. 硬件准备
| 硬件模块 | 型号/参数 | 连接方式 |
|------------------|--------------------|--------------------------|
| STM32开发板 | STM32F103C8T6 | 核心板 |
| 温湿度传感器 | DHT11 | PA0引脚 |
| USB转TTL模块 | CH340G | TX→PA10(RX), RX→PA9(TX) |
| 杜邦线 | 母对母 | 供电+信号连接 |
---
### 3. 开发环境搭建
```markdown
1. 开发工具:STM32CubeIDE 1.11.2
2. 编译工具:ARM GCC 10.3
3. 调试工具:ST-Link V2
4. 串口工具:XCOM V2.6
```
---
### 4. CubeMX工程配置
#### 4.1 时钟配置

- 系统时钟源:HSE 8MHz
- 主频设置:72MHz
#### 4.2 引脚分配
| 功能 | 引脚 | 模式 |
|--------------|-------|----------------|
| USART1_TX | PA9 | Alternate Push-Pull |
| USART1_RX | PA10 | Input floating |
| DHT11_DATA | PA0 | Output Open-Drain |
#### 4.3 参数配置
```c
// USART1配置
Baud Rate: 115200
Word Length: 8bit
Parity: None
Stop Bits: 1
```
---
### 5. 代码实现解析
#### 5.1 主函数逻辑
```c
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
uint8_t temp, humi;
char buffer[50];
while (1) {
if(DHT11_ReadData(&temp, &humi) == DHT11_OK){
sprintf(buffer, "Temperature: %d℃ Humidity: %d%%\r\n", temp, humi);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100);
}
HAL_Delay(1000);
}
}
```
#### 5.2 DHT11驱动关键代码
```c
#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_PIN_0
typedef enum {
DHT11_OK,
DHT11_ERROR
} DHT11_Status;
DHT11_Status DHT11_ReadData(uint8_t *temp, uint8_t *humi) {
// 发送开始信号
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(18);
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET);
// 等待传感器响应
// ...(完整时序检测代码)
// 解析40位数据
for(int i=0; i<5; i++){
for(int j=0; j<8; j++){
while(!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN));
uint32_t start = HAL_GetTick();
while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN));
if((HAL_GetTick() - start) > 40) {
data[i] |= (1 << (7-j));
}
}
}
// 校验数据
if(data[4] == (data[0]+data[1]+data[2]+data[3])) {
*humi = data[0];
*temp = data[2];
return DHT11_OK;
}
return DHT11_ERROR;
}
```
---
### 6. 调试与效果验证
#### 6.1 接线检查

#### 6.2 串口输出效果
```
Temperature: 25℃ Humidity: 60%
Temperature: 25℃ Humidity: 61%
Temperature: 26℃ Humidity: 59%
```
---
### 7. 常见问题解决
1. **数据读取失败**
- 检查传感器供电(3.3V-5V)
- 确认上拉电阻(4.7KΩ)
- 调整时序延时精度
2. **串口无输出**
- 核对TX/RX交叉连接
- 验证波特率设置一致性
- 检查DMA/中断配置
3. **数据跳变异常**
- 添加软件滤波处理
```c
// 滑动平均滤波示例
#define FILTER_SIZE 5
uint8_t temp_buf[FILTER_SIZE];
uint8_t filter(uint8_t new_val) {
static uint8_t index = 0;
temp_buf[index++] = new_val;
if(index >= FILTER_SIZE) index = 0;
uint16_t sum = 0;
for(int i=0; i<FILTER_SIZE; i++){
sum += temp_buf[i];
}
return sum/FILTER_SIZE;
}
```
---
**源码获取**
👉 [Gitee仓库链接](https://gitee.com/example/dht11_uart_demo)
**开发资料**
📚 [STM32CubeIDE用户手册](https://www.st.com)
📚 [DHT11数据手册](https://www.mouser.cn/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf)
---
**创作不易,欢迎点赞收藏🌟,关注获取更多嵌入式开发教程!**
**#STM32实战 #传感器开发 #嵌入式系统 #毕业设计**
8万+

被折叠的 条评论
为什么被折叠?



