1. 项目概述
这个基于51单片机的体温心率计仿真设计,是我去年在指导电子设计竞赛学生时开发的一个教学案例。它完美展现了如何用最基础的单片机实现医疗级生理参数监测的核心思路。市面上动辄上千元的健康监测设备,其实核心原理并不复杂,通过这个项目你就能亲手搭建一个功能完备的监测系统。
系统通过DS18B20温度传感器采集体温,利用红外对管检测指尖脉搏信号,经信号调理电路处理后由STC89C52单片机进行数据处理,最终在LCD1602显示屏上实时显示体温和心率数值。整个设计包含硬件电路仿真和软件程序设计两大模块,在Proteus中可完整运行验证。
2. 核心硬件设计解析
2.1 主控芯片选型
选用STC89C52RC作为主控芯片主要基于三点考量:
- 成本优势:零售价仅5-8元,批量采购可低至3元
- 开发便利:支持ISP在线编程,调试方便
- 资源充足:4KB Flash ROM足够存储算法代码,32个IO口满足外设连接需求
注意:实际产品开发建议选择STC15系列,其内置RC振荡器可省去外部晶振电路,但教学场景为展示完整时钟系统仍保留传统设计
2.2 体温检测模块
DS18B20数字温度传感器采用单总线协议,其硬件连接非常简单:
c复制P3^7 ------ DQ
|
4.7K上拉电阻
|
VCC
关键参数设置:
- 分辨率:12位(默认)
- 转换时间:750ms
- 测温范围:-55℃~+125℃(人体测温只需35-42℃范围)
实测中发现三个重要细节:
- 每次读取前必须执行温度转换命令(0x44)
- 读取温度寄存器(0xBE)需连续读取2字节
- 负温度值时读取值为补码形式
2.3 心率检测模块
采用反射式红外传感器方案,由以下部件构成:
- 发射端:5mm红外LED(波长940nm)
- 接收端:PT333-3B光电三极管
- 信号调理:两级运放电路(LM358)
信号处理流程:
code复制指尖脉搏信号 → 红外接收管 → 电压跟随器 → 带通滤波(0.5-5Hz) → 电压比较器 → 单片机中断输入
电路调试要点:
- 发射电流控制在20mA左右(串联150Ω电阻)
- 带通滤波中心频率设为2Hz(对应120bpm心率)
- 比较器阈值需根据个体差异调整
3. 软件设计实现
3.1 系统主流程设计
c复制void main() {
init_devices(); // 外设初始化
while(1) {
if(flag_1s) { // 1秒定时标志
flag_1s = 0;
read_temperature(); // 读取体温
calculate_heart_rate(); // 计算心率
display_results(); // 刷新显示
}
}
}
3.2 体温测量实现
DS18B20驱动程序关键函数:
c复制float read_temp() {
reset_pulse(); // 复位脉冲
write_byte(0xCC); // 跳过ROM
write_byte(0x44); // 启动转换
delay_ms(750); // 等待转换
reset_pulse();
write_byte(0xCC);
write_byte(0xBE); // 读取暂存器
temp_L = read_byte();
temp_H = read_byte();
return (temp_H<<8 | temp_L) * 0.0625;
}
3.3 心率算法设计
采用峰值检测算法,通过外部中断捕获脉搏信号:
c复制void EX0_ISR() interrupt 0 {
static uint32_t last_time = 0;
uint32_t current = sys_tick;
if(current > last_time) {
pulse_interval = current - last_time;
last_time = current;
}
}
心率计算公式:
code复制心率(bpm) = 60000 / 平均脉搏间隔(ms)
为提高准确性,采用滑动窗口均值滤波:
c复制#define SAMPLE_SIZE 5
uint16_t hr_filter(uint16_t new_val) {
static uint16_t buf[SAMPLE_SIZE];
static uint8_t index = 0;
uint16_t sum = 0;
buf[index++] = new_val;
if(index >= SAMPLE_SIZE) index = 0;
for(uint8_t i=0; i<SAMPLE_SIZE; i++) {
sum += buf[i];
}
return sum / SAMPLE_SIZE;
}
4. Proteus仿真要点
4.1 电路搭建注意事项
-
DS18B20仿真模型需设置:
- 初始温度:36.5℃
- 温度变化模式:随机波动(±0.2℃)
-
心率信号模拟:
- 使用Pulse Generator模拟脉搏波
- 参数设置:频率1.2Hz(72bpm),幅值3V,上升/下降时间50ms
-
LCD1602配置:
- 对比度调节电阻:10K可调电阻
- 确保RS/RW/E信号线连接正确
4.2 常见仿真问题解决
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 温度显示85℃ | 复位时序错误 | 检查DQ线上拉电阻,调整延时时间 |
| 心率值跳动大 | 信号干扰 | 增加软件滤波次数,调整比较器阈值 |
| LCD显示乱码 | 初始化失败 | 检查EN使能信号时序,重写初始化函数 |
| 脉搏检测不灵敏 | 红外强度不足 | 减小限流电阻值,确保LED正向压降1.2V |
5. 实物制作建议
5.1 PCB设计要点
-
布局原则:
- 模拟信号部分远离数字电路
- 红外对管单独布置在板边便于手指接触
- 电源滤波电容靠近芯片VCC引脚
-
走线注意事项:
- 单总线走线尽量短直
- 模拟信号走线避免直角转折
- 晶振电路下方不走其他信号线
5.2 校准方法
体温校准:
- 准备标准水银温度计
- 将DS18B20与温度计同时置于35-40℃温水
- 记录10组数据,计算软件补偿值
心率校准:
- 同时连接商用血氧仪
- 采集不同心率下的原始信号
- 调整比较器阈值直至读数一致
6. 项目优化方向
-
低功耗改进:
- 改用STC15L系列单片机
- 增加光感自动唤醒功能
- 采用间歇工作模式
-
无线传输扩展:
- 添加HC-05蓝牙模块
- 设计手机APP数据显示
- 实现历史数据存储
-
算法增强:
- 加入运动伪迹消除
- 实现心率变异性分析
- 增加体温异常报警
这个项目最让我惊喜的是,用如此廉价的元器件也能实现接近医疗设备的测量精度。在最近一次实测中,与欧姆龙电子体温计对比,误差仅±0.1℃;心率检测与polar心率带对比,静息状态下误差不超过3bpm。建议初学者可以先用仿真验证所有功能,再着手制作实物,这样能节省大量调试时间。