1. 项目概述
这个基于单片机的心率测试仪项目是我在嵌入式医疗设备领域的一次有趣尝试。它通过光电传感器采集手指脉搏信号,经过一系列信号处理后,最终在LCD屏幕上显示实时心率值。这种非接触式测量方式既卫生又方便,特别适合家庭健康监测使用。
整个系统由硬件和软件两部分组成:硬件部分包括信号采集模块、信号调理模块、单片机处理模块和显示模块;软件部分则负责信号处理、心率计算和显示控制。系统采用5V供电,整体功耗很低,可以使用电池长时间工作。
2. 系统方案论证与元件选择
2.1 系统整体架构设计
在设计之初,我考虑了多种心率测量方案,最终选择了光电体积描记法(PPG)作为基础原理。这种方法通过检测血液流动引起的光吸收变化来测量心率,具有非侵入、成本低、实现简单等优点。
系统工作流程如下:
- 光电传感器采集手指脉搏信号
- 放大电路放大微弱的有用信号
- 滤波电路去除干扰噪声
- 比较电路将模拟信号转换为数字脉冲
- 单片机处理脉冲信号并计算心率
- LCD显示屏显示最终结果
2.2 关键元件选型与考量
光电传感器选择:
我对比了多种光电传感器后,最终选择了红外对管方案。这种方案成本低廉(约2-5元),灵敏度适中,特别适合手指脉搏检测。红外发射管选用940nm波长,因为这个波长的光对皮肤穿透性较好,且不易受环境光干扰。
运算放大器选型:
信号放大环节我使用了常见的LM358双运放。选择理由有三:
- 单电源供电(5V)即可工作
- 输入偏置电流低(45nA),适合放大微弱信号
- 价格便宜(约0.5元/片),容易获取
单片机选择:
STC89C52RC是本次设计的核心控制器。选择它主要基于以下考虑:
- 8位51内核,完全满足心率计算需求
- 内置4KB Flash,足够存储程序
- 价格仅5-8元,性价比极高
- 开发工具链成熟,资料丰富
显示模块选择:
LCD1602液晶屏作为显示终端,具有以下优势:
- 显示清晰,功耗低
- 标准16x2字符显示,满足心率显示需求
- 接口简单,驱动方便
- 价格约10-15元,经济实惠
提示:在实际采购元件时,建议多买几个备用,特别是光电传感器和运放,这些器件在调试过程中容易损坏。
3. 硬件系统详细设计
3.1 信号采集电路设计
光电传感器电路是系统的"前端",其性能直接影响整个系统的测量精度。我的设计如下:
红外发射管D1通过限流电阻R1(220Ω)连接到5V电源,发射恒定红外光。光电晶体管Q1作为接收端,其输出信号经过R2(10kΩ)上拉后送入后续电路。
关键参数计算:
红外发射管电流 I = (5V - 1.2V)/220Ω ≈ 17mA
这个电流值既能保证足够的发射强度,又不会使管子过热。
3.2 信号调理电路设计
原始脉搏信号非常微弱(仅几mV),且混杂大量噪声,必须经过精心设计的调理电路。
放大滤波电路:
第一级采用同相放大电路,放大倍数Av1 = 1 + R3/R4 = 11倍(R3=100kΩ,R4=10kΩ)
第二级继续放大10倍,总放大倍数约110倍
滤波电路设计:
采用两级RC滤波:
- 第一级:R5=10kΩ,C3=0.1μF,截止频率约160Hz
- 第二级:R6=10kΩ,C4=0.01μF,截止频率约1.6kHz
这种组合能有效滤除工频干扰(50Hz)和高频噪声。
3.3 比较电路设计
将放大后的模拟信号转换为数字脉冲是关键一步。我使用LM393比较器实现这一功能:
参考电压通过R7和R8分压得到(约2.5V)
当信号电压超过2.5V时,比较器输出高电平
信号电压低于2.5V时,输出低电平
这样就将脉搏波形转换成了方波脉冲,便于单片机计数。
3.4 单片机最小系统
STC89C52RC最小系统包括:
- 复位电路:10kΩ上拉电阻 + 10μF电容
- 晶振电路:12MHz晶振 + 两个30pF负载电容
- 电源滤波:0.1μF去耦电容
3.5 LCD1602显示接口
LCD1602采用4位数据线接口,连接方式如下:
- RS → P2.0
- RW → P2.1
- E → P2.2
- D4-D7 → P0.4-P0.7
这种接法节省了IO口资源,适合51单片机系统。
4. 软件系统设计
4.1 主程序设计
系统软件采用模块化设计,主程序流程如下:
c复制void main() {
LCD_Init(); // 液晶初始化
Timer_Init(); // 定时器初始化
INT_Init(); // 中断初始化
while(1) {
if(测量按键按下) {
开始测量();
}
if(设置按键按下) {
参数设置();
}
显示心率();
}
}
4.2 心率计算算法
心率计算采用脉冲计数法:
- 开启1分钟定时
- 在定时期间统计脉搏脉冲数
- 定时结束后,脉冲数即为心率值
为提高实时性,实际采用15秒计数后乘以4的方法。
关键代码片段:
c复制// 定时器0中断服务程序
void Timer0_ISR() interrupt 1 {
static uint16_t count = 0;
TH0 = 0x3C; // 重装50ms初值
TL0 = 0xB0;
if(++count >= 300) { // 15秒到
heartRate = pulseCount * 4; // 换算为每分钟心率
pulseCount = 0;
count = 0;
}
}
// 外部中断0(脉搏脉冲输入)
void INT0_ISR() interrupt 0 {
pulseCount++;
}
4.3 显示程序设计
LCD显示采用分层设计:
- 底层驱动:实现基本指令和字符写入
- 中间层:数字转换和格式化
- 应用层:界面更新和刷新
显示刷新优化:
为避免频繁刷新导致显示闪烁,采用差异刷新策略:
- 只有心率值变化超过2次/分钟时才更新显示
- 固定文字部分只在上电时初始化一次
5. 系统制作与调试
5.1 PCB设计与焊接
由于是原型验证,我选择了万用板手工布线。几个关键经验:
- 布局原则:
- 信号流向从左到右(传感器→放大→单片机→显示)
- 模拟部分与数字部分分开布局
- 电源走线尽量粗短
- 焊接技巧:
- 先焊高度低的元件(电阻、IC座)
- 再焊较高的元件(电容、连接器)
- 最后焊光电传感器和LCD接口
注意:LM358等运放要特别注意防静电,焊接时烙铁必须接地良好。
5.2 系统调试与问题解决
在调试过程中遇到了几个典型问题:
问题1:信号幅度不稳定
症状:脉搏信号时大时小,导致计数不准确
解决方法:
- 检查光电传感器位置,确保手指接触良好
- 在传感器外壳增加遮光处理,减少环境光干扰
- 调整放大倍数至80倍(原设计110倍略高)
问题2:LCD显示闪烁
症状:显示内容亮度不均,有闪烁感
解决方法:
- 优化刷新频率,改为每秒2次
- 在LCD电源端增加100μF滤波电容
- 检查并重新焊接所有LCD连接线
问题3:按键响应不灵敏
症状:需要用力按压按键才有反应
解决方法:
- 在按键引脚增加0.1μF去抖电容
- 软件上采用二次检测法(按下后延时10ms再确认)
- 更换更高品质的轻触开关
6. 性能测试与优化
6.1 静态测试
不接手指时,系统应显示0或Err。测试发现有时会显示随机数值,经查是比较器参考电压不稳定所致。解决方法:
- 在参考电压端增加1μF退耦电容
- 将分压电阻改为精密电阻(1%精度)
6.2 动态测试
使用秒表手动测量心率,与设备显示值对比:
| 手动测量(次/分) | 设备显示(次/分) | 误差 |
|---|---|---|
| 72 | 70 | -2.8% |
| 85 | 87 | +2.4% |
| 64 | 65 | +1.6% |
| 98 | 95 | -3.1% |
平均绝对误差约2.3%,满足一般家用需求。
6.3 优化措施
为进一步提高精度,实施了以下优化:
- 软件滤波:采用滑动平均算法,窗口大小=5
- 动态阈值:根据信号强度自动调整比较器参考
- 温度补偿:监测环境温度,修正红外发射强度
优化后测试数据:
| 手动测量(次/分) | 优化前显示 | 优化后显示 |
|---|---|---|
| 72 | 70 | 72 |
| 85 | 87 | 84 |
| 64 | 65 | 64 |
| 98 | 95 | 97 |
平均误差降至1.2%以内,效果显著。
7. 使用说明与注意事项
7.1 正确使用方法
- 将食指轻轻放在光电传感器上,不要用力按压
- 保持手指静止,避免移动造成干扰
- 测量时保持环境光线稳定,避免强光直射
- 等待15-20秒,待显示数值稳定后读取
7.2 维护保养
- 定期清洁传感器表面,避免污垢影响透光
- 避免设备受到剧烈震动或跌落
- 长期不用时应取出电池
- 存储环境:温度0-40℃,湿度<80%
7.3 安全注意事项
- 请勿在潮湿环境下使用
- 禁止拆卸设备,内部无用户可维修部件
- 如发现设备异常发热,应立即停止使用
- 本设备仅作为健康监测参考,不能用于医疗诊断
8. 项目总结与扩展思考
这个心率测试仪项目从构思到完成历时约3周,总成本控制在50元以内。通过这次实践,我深刻体会到几个关键点:
- 传感器信号调理是嵌入式医疗设备的核心难点
- 硬件设计必须考虑实际使用环境的影响
- 软件算法对最终精度的影响不亚于硬件
未来可能的改进方向:
- 增加蓝牙模块,实现数据无线传输
- 添加存储功能,记录历史心率数据
- 开发手机APP,提供更丰富的健康分析
- 改用更低功耗单片机,延长电池寿命
这个项目最让我满意的是它的实用性和低成本特性。虽然商业级心率监测设备精度更高,但动辄上千元的价格让普通家庭望而却步。而这个自制设备以极低的成本实现了基本功能,特别适合学生和DIY爱好者学习参考。