嵌入式开发

# 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 时钟配置
![时钟树配置截图](https://img-blog.csdnimg.cn/direct/123456.png)  
- 系统时钟源: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 接线检查
![硬件连接示意图](https://img-blog.csdnimg.cn/direct/654321.png)

#### 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实战 #传感器开发 #嵌入式系统 #毕业设计**

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值