1. 项目概述
这个基于STM32的DS18B20温度报警器设计,是我最近完成的一个嵌入式系统仿真项目。它实现了温度实时监测、阈值报警、数据上传等核心功能,特别适合作为嵌入式初学者的综合实践案例。整个系统在Proteus环境下仿真运行,硬件部分采用STM32F103作为主控,搭配DS18B20温度传感器和LCD1602显示屏,软件部分使用Keil MDK开发环境进行C语言编程。
提示:这个项目虽然是在仿真环境下完成的,但所有硬件选型和软件设计都完全遵循实际工程规范,可以直接移植到实物开发板上运行。
2. 核心硬件设计解析
2.1 主控芯片选型
选择STM32F103C8T6作为主控芯片主要基于以下几点考虑:
- 72MHz主频完全满足温度采集和显示处理的性能需求
- 内置的USART模块方便实现与PC的串口通信
- 丰富的GPIO资源可以轻松连接LCD、按键和报警装置
- 成本低廉且开发资源丰富,适合教学和实验用途
2.2 温度传感器电路
DS18B20采用单总线协议,硬件连接非常简单:
code复制VDD -- 3.3V
DQ -- PA0 (需接4.7K上拉电阻)
GND -- GND
单总线设计节省了IO资源,但需要注意:
- 必须正确配置上拉电阻值
- 总线长度不宜超过20米
- 多个DS18B20并联时需要处理ROM编码
2.3 显示模块接口
LCD1602采用4位数据线连接方式:
code复制RS -- PB0
RW -- GND (只写模式)
E -- PB1
D4-D7 -- PB12-PB15
这种连接方式比8位模式节省了4个IO口,虽然数据传输速度稍慢,但对于温度显示这种低频更新场景完全够用。
3. 软件架构与关键代码
3.1 主程序流程图
系统软件采用典型的前后台架构:
code复制初始化硬件外设
↓
读取DS18B20温度值
↓
显示温度到LCD1602
↓
通过USART发送温度数据
↓
检查温度阈值并触发报警
↓
检测按键输入调整阈值
3.2 温度采集实现
DS18B20的驱动代码需要严格遵循单总线时序:
c复制float DS18B20_GetTemp(void) {
uint8_t tempL, tempH;
DS18B20_Start();
DS18B20_ReadByte(); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读暂存器
tempL = DS18B20_ReadByte();
tempH = DS18B20_ReadByte();
return (tempH<<8 | tempL) * 0.0625;
}
注意:DS18B20的转换精度可以通过配置寄存器调整,默认12位分辨率下转换时间约750ms。
3.3 报警逻辑处理
报警判断采用简单的阈值比较:
c复制void CheckAlarm(float temp) {
if(temp > highThreshold) {
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
Buzzer_On();
LCD_DisplayString("Hot! ");
}
else if(temp < lowThreshold) {
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_SET);
Buzzer_On();
LCD_DisplayString("Cold!");
}
else {
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, GPIO_PIN_RESET);
Buzzer_Off();
}
}
4. Proteus仿真要点
4.1 仿真环境搭建
- 安装Proteus 8.9及以上版本
- 添加STM32F103C6/8模型库
- 配置DS18B20仿真模型参数:
- 设置初始温度为25℃
- 勾选"Animate"选项观察温度变化
- 虚拟串口配置:
- 波特率115200
- 8位数据位,无校验
4.2 常见仿真问题解决
-
DS18B20不响应:
- 检查单总线时序是否符合规范
- 确认上拉电阻值设置为4.7K
- 在Proteus中右键DS18B20选择"Edit Properties"检查模型配置
-
LCD显示乱码:
- 确认4/8位模式设置正确
- 检查E使能信号的脉冲宽度
- 调整初始化延时,确保LCD完成内部复位
-
串口无输出:
- 检查USART引脚映射是否正确
- 确认虚拟串口终端配置与程序一致
- 在Proteus中右键COMPIM组件检查端口设置
5. 系统优化与扩展
5.1 实际应用改进建议
- 增加滤波算法:
c复制#define FILTER_LEN 5
float tempHistory[FILTER_LEN];
float GetFilteredTemp() {
static uint8_t index = 0;
tempHistory[index] = DS18B20_GetTemp();
index = (index + 1) % FILTER_LEN;
float sum = 0;
for(uint8_t i=0; i<FILTER_LEN; i++) {
sum += tempHistory[i];
}
return sum / FILTER_LEN;
}
-
低功耗设计:
- 使用STM32的睡眠模式
- 设置DS18B20为低分辨率模式
- 采用间歇工作方式(如每10秒唤醒一次)
-
多传感器支持:
- 通过单总线搜索ROM实现多DS18B20识别
- 采用分时复用方式轮询各传感器
5.2 进阶功能扩展
-
无线传输模块:
- 添加ESP8266实现WiFi上传
- 通过AT指令连接云平台
-
历史数据记录:
- 外接SPI Flash存储温度日志
- 实现按时间查询功能
-
手机APP监控:
- 开发简易Android应用
- 通过蓝牙HC-05模块连接
6. 开发经验分享
在实际开发过程中,我总结了以下几点重要经验:
-
DS18B20时序调试:
- 单总线对时序要求严格,建议使用逻辑分析仪抓取波形
- 不同型号STM32的IO速度可能影响时序,需要调整延时函数
- 在Proteus中可以通过"Digital Animation"选项直观观察总线状态
-
STM32CubeMX配置技巧:
- 使用CubeMX生成HAL库框架可以节省大量初始化时间
- 对于USART通信,建议开启DMA传输减轻CPU负担
- 合理配置GPIO的上下拉模式可以减少外部电路
-
Proteus仿真优化:
- 适当降低仿真速度可以提高稳定性
- 对关键信号添加电压探针方便调试
- 使用"Simulation Log"功能查看详细运行信息
这个项目虽然基础,但涵盖了嵌入式开发的完整流程,从硬件选型、电路设计到软件开发和仿真调试。建议初学者可以按照这个框架,逐步添加自己的创新功能,比如加入湿度监测、实现物联网连接等,打造出更完整的环境监测系统。