1. 项目概述
这个基于STM32的温度监测系统设计,是我在工业自动化项目中实际应用过的一个经典方案。它完美展现了如何用低成本器件构建高精度温度监测系统,特别适合需要远程监控的场合。核心在于STM32F103C8T6单片机与DS18B20数字温度传感器的配合,通过单总线协议实现温度采集,再经由串口上传数据并在LCD1602上本地显示。
提示:选择STM32F103C8T6是因为它兼具性价比和丰富外设,72MHz主频完全能满足实时性要求,且内置USART模块方便串口通信。
系统实测温度范围-55~128℃,精度±0.1℃,这个指标已经能满足大多数工业现场需求。我曾将这个方案用于食品冷链运输监控,连续运行三个月误差不超过±0.3℃,稳定性令人满意。
2. 硬件设计详解
2.1 核心器件选型
主控芯片:STM32F103C8T6
- 采用ARM Cortex-M3内核
- 64KB Flash + 20KB SRAM
- 3个USART、2个SPI、2个I2C接口
- 工作电压2.0-3.6V
温度传感器:DS18B20
- 独特单总线接口(仅需1个GPIO)
- 9~12位可编程分辨率(本设计采用12位)
- 内置温度报警功能
- 寄生供电模式可用
显示模块:LCD1602
- 2行16字符显示
- 5V供电(需注意电平转换)
- 4位/8位并行接口可选
2.2 电路设计要点
-
DS18B20接口电路:
- 典型接法:4.7KΩ上拉电阻
- 长距离传输时可减小上拉电阻值
- 建议在传感器端加0.1μF去耦电容
-
电平转换设计:
- LCD1602是5V器件,STM32是3.3V
- 可采用电阻分压或专用电平转换芯片
- 实测74HC245双向缓冲器效果最佳
-
电源设计:
- 建议使用AMS1117-3.3稳压芯片
- 每个IC附近放置0.1μF陶瓷电容
- 总电流需求约150mA
3. 软件实现解析
3.1 开发环境配置
-
Keil MDK配置:
c复制// 关键编译器设置 #pragma optimize=O3 // 优化等级3 #define USE_HAL_DRIVER #define STM32F103xB -
STM32CubeMX配置:
- 启用USART1(波特率115200)
- 配置一个GPIO为开漏输出(DS18B20)
- 系统时钟设置为72MHz
3.2 核心代码实现
DS18B20驱动关键代码:
c复制// 复位脉冲发送
void DS18B20_Reset(void) {
SET_GPIO_OUTPUT();
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET);
delay_us(480);
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET);
delay_us(60);
SET_GPIO_INPUT();
while(HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) == GPIO_PIN_RESET);
delay_us(480);
}
// 温度读取函数
float DS18B20_GetTemp(void) {
uint8_t tempL, tempH;
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 启动转换
delay_ms(750); // 12位分辨率需750ms
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE); // 读暂存器
tempL = DS18B20_ReadByte();
tempH = DS18B20_ReadByte();
return (float)((tempH<<8)|tempL)*0.0625;
}
LCD1602显示驱动:
c复制void LCD_DisplayTemp(float temp) {
char buf[16];
sprintf(buf, "Temp: %.1fC", temp);
LCD_SetCursor(0, 0);
LCD_WriteString(buf);
// 温度异常报警
if(temp > 50.0 || temp < -20.0) {
LCD_SetCursor(0, 1);
LCD_WriteString("ALARM! CHECK!");
}
}
4. Proteus仿真要点
4.1 仿真环境搭建
-
元件清单:
- STM32F103C6(仿真库中无C8T6可用C6替代)
- DS18B20(需加载正确的DLL模型)
- LCD1602
- VIRTUAL TERMINAL(串口调试)
-
关键设置:
- CPU频率设为8MHz(外部晶振)
- 加载编译生成的hex文件
- 设置虚拟串口波特率115200
4.2 常见仿真问题解决
-
DS18B20无响应:
- 检查上拉电阻是否连接
- 确认DLL模型版本(建议用DS18B20.MDF)
- 调整时序延迟参数
-
LCD显示乱码:
- 检查总线模式设置(4位/8位)
- 确认初始化序列完整
- 调整延时时间(特别是EN脉冲)
5. 系统优化与扩展
5.1 性能提升技巧
-
温度采集优化:
c复制// 非阻塞式温度采集方案 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static uint8_t state = 0; switch(state) { case 0: // 启动转换 DS18B20_StartConvert(); state = 1; break; case 1: // 读取温度 currentTemp = DS18B20_GetTemp(); state = 0; break; } } -
通信协议增强:
- 添加Modbus RTU协议支持
- 实现数据校验(CRC16)
- 增加命令响应机制
5.2 功能扩展方向
-
多传感器组网:
- 利用DS18B20的ROM搜索功能
- 实现单总线上挂载多个传感器
- 需要改进搜索算法(参考Maxim应用笔记)
-
无线传输模块:
- 添加ESP8266 WiFi模块
- 通过AT指令上传数据到云平台
- 实现手机APP监控
-
历史数据存储:
- 添加AT24C02 EEPROM
- 实现温度数据记录功能
- 支持历史数据查询
6. 工程实践心得
在实际部署这个系统时,有几个关键点需要特别注意:
-
长距离传输问题:
- 当DS18B20与MCU距离超过3米时,建议:
- 使用屏蔽双绞线
- 将上拉电阻减小到2.2KΩ
- 在MCU端增加TVS二极管保护
- 当DS18B20与MCU距离超过3米时,建议:
-
电源干扰处理:
- 工业现场建议:
- 增加π型滤波电路
- 使用隔离DC-DC模块
- 模拟地与数字地单点连接
- 工业现场建议:
-
EMC设计经验:
- 所有IO口串联22Ω电阻
- 关键信号线走等长线
- 晶振电路包地处理
这个项目最让我自豪的是它的可靠性——在电机变频器干扰严重的环境中仍能稳定工作。关键是在软件上实现了三重保护机制:硬件看门狗、软件心跳包、数据校验。这种设计思路可以推广到其他工业监测系统中。
