1. 项目概述
这个基于STM32的DS18B20温度报警器仿真设计,是我去年帮一个食品仓储监控项目做的原型验证方案。相比市面上常见的固定阈值报警器,它的核心优势在于可以通过按键动态调整温度上下限,特别适合需要频繁变更监测标准的场景。
整个系统在Proteus环境下实现了从传感器数据采集、阈值设置到声光报警的完整闭环。DS18B20作为数字温度传感器界的"老将",以其单总线通信、±0.5℃的精度和-55~+125℃的宽量程,依然是嵌入式温控项目的首选。而STM32F103C8作为主控,凭借其丰富的外设资源和Cortex-M3内核的处理能力,轻松驾驭了传感器驱动、阈值判断和人机交互三大任务。
2. 硬件设计解析
2.1 核心器件选型
主控芯片选择:
最终选定STM32F103C8T6主要基于三点考量:
- 48KB Flash完全够用(实际代码仅占用32%)
- 内置的12位ADC可扩展其他模拟传感器
- 多达37个GPIO为后续功能扩展预留空间
温度传感器对比:
测试过DHT11和DS18B20后,选择后者是因为:
- 分辨率可配置(9~12位)
- 无需额外校准电路
- 实测在-10~60℃范围内误差≤±0.3℃
2.2 电路设计要点
单总线电路设计:
DS18B20的DQ线需要4.7kΩ上拉电阻,这个值是通过计算总线电容(约100pF)和上升时间要求(<15μs)得出的。实际布线时要注意:
传感器距离MCU最好不超过10米,每增加1米需减小500Ω上拉电阻
报警电路设计:
采用NPN三极管驱动蜂鸣器,基极电阻选择2.2kΩ确保饱和导通:
- 蜂鸣器电流:10mA
- 三极管β值:100(最小值)
- 计算得基极电流需≥0.1mA
3. 软件实现细节
3.1 单总线通信协议
DS18B20的时序要求极为严格,这里分享几个关键时间参数的处理技巧:
c复制// 复位脉冲(480us以上)
void DS18B20_Reset(void) {
DQ_OUT_MODE();
DQ_LOW();
delay_us(500); // 实测480us偶尔失败
DQ_HIGH();
delay_us(60); // 等待传感器响应
}
数据读取优化:
发现标准15μs采样窗口容易受干扰,改为在下降沿后12μs读取:
- 温度转换时间:12位精度时750ms
- 采用寄生供电时需在转换期间强上拉总线
3.2 温度阈值管理
使用结构体存储阈值参数,方便EEPROM存储:
c复制typedef struct {
float temp_high;
float temp_low;
uint8_t alarm_enable;
} TempThreshold_t;
按键消抖方案:
对比了延时法和状态机法,最终选择后者:
c复制if(GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN) == 0) {
if(++key_cnt > 3) { // 连续3次检测到低电平
key_action = 1;
key_cnt = 0;
}
}
4. Proteus仿真技巧
4.1 元件模型配置
DS18B20仿真模型:
在Proteus中需设置初始温度值:
- 右键点击传感器 → Edit Properties
- 在"Initial Temperature"输入25(默认摄氏度)
- 勾选"Digital"模式
虚拟终端调试:
添加COMPIM组件实现printf输出:
- 波特率:115200
- 数据位:8
- 停止位:1
4.2 动态测试方法
温度曲线模拟:
- 添加模拟信号发生器(SINE)
- 设置幅度=30,偏移=25(模拟25±30℃变化)
- 连接至DS18B20的TEMP引脚
报警测试技巧:
同时观察三个窗口:
- 传感器数据窗口(右键 → Virtual Terminal)
- LED状态指示
- 蜂鸣器声波显示(添加音频图表)
5. 常见问题排查
5.1 传感器无响应
现象:始终读取到85℃(默认值)
排查步骤:
- 检查上拉电阻是否焊接良好
- 用逻辑分析仪捕捉复位时序
- 测量DQ线电压(正常应为3V左右)
曾遇到过一个隐蔽问题:PCB走线过长导致信号畸变,解决方法是在传感器端并联100pF电容
5.2 阈值保存异常
EEPROM写入失败处理:
- 先擦除整个页(STM32F103页大小为1KB)
- 写入前关闭所有中断
- 采用校验和机制验证数据完整性
c复制void EEPROM_WriteBuffer(uint16_t addr, uint8_t *buf, uint16_t len) {
FLASH_Unlock();
FLASH_ErasePage(EEPROM_START_ADDR);
for(int i=0; i<len; i+=2) {
uint16_t data = buf[i] | (buf[i+1]<<8);
FLASH_ProgramHalfWord(EEPROM_START_ADDR+addr+i, data);
}
FLASH_Lock();
}
6. 功能扩展建议
无线传输模块:
可添加ESP-01S WiFi模块实现:
- 通过AT指令连接MQTT服务器
- 定时上报温度数据
- 接收手机APP的阈值设置
多传感器网络:
- 给每个DS18B20设置不同ROM地址
- 采用总线拓扑结构
- 轮询间隔建议≥2秒(考虑12位转换时间)
这个项目最让我惊喜的是DS18B20的稳定性——在三个月连续测试中,没有出现一次数据异常。建议在正式产品中增加传感器冗余设计,比如并行连接两个DS18B20,取中值作为最终温度值。