1. 项目概述:基于51单片机的心率脉搏计设计
这个项目本质上是用51单片机搭建一套能够实时监测人体心率脉搏的便携式设备。作为电子工程领域最经典的入门级MCU,51单片机凭借其稳定可靠的性能和极低的学习门槛,一直是各类生理参数监测设备的首选控制器。
我在实际医疗电子设备开发中发现,传统心率监测方案通常采用专用芯片或高端MCU,成本动辄上百元。而用STC89C52这类基础51单片机配合红外对管传感器,整套BOM成本可以控制在30元以内,且测量精度完全能满足日常健康监测需求。这种高性价比方案特别适合学生课程设计、家庭自测设备开发等场景。
2. 核心硬件设计解析
2.1 传感器选型与信号采集
市面上常见的心率检测方案主要分三类:
- 光电式(PPG):通过LED照射皮下毛细血管
- 电极式(ECG):测量心肌电信号
- 压力式:检测动脉血管压力波动
考虑到成本和使用便捷性,本设计采用光电反射式方案。具体使用KY-039模块,其核心是红外发射管(940nm)和光敏三极管。当指尖血管随心跳收缩舒张时,血液对红外光的吸收率会周期性变化,这种微弱的模拟信号经过运放放大后,就能转换为可检测的脉搏波形。
关键参数:发射管工作电流建议控制在20mA以内,避免发热影响测量。接收端放大倍数建议设置在100-200倍,需配合可调电阻精细校准。
2.2 信号调理电路设计
原始脉搏信号存在两大问题:
- 基线漂移(由呼吸或肢体移动引起)
- 高频干扰(50Hz工频干扰为主)
我的实际调试经验是采用两级滤波:
- 一级高通滤波(截止频率0.5Hz):消除基线漂移
- 二级带通滤波(0.8-3Hz):保留脉搏特征频率
c复制// 典型滤波器参数计算示例(巴特沃斯二阶)
#define C1 0.1uF // 高通滤波电容
#define R1 330kΩ // 根据fc=1/(2πRC)计算
#define R2 10kΩ // 低通滤波电阻
#define C2 4.7uF // 对应3Hz截止频率
2.3 单片机系统搭建
STC89C52最小系统包含:
- 11.0592MHz晶振(定时器计时更精确)
- 复位电路(10kΩ电阻+10uF电容)
- CH340G串口下载电路
- 四位共阳数码管显示
- 三按键控制(功能切换/校准/复位)
实测发现:电源稳定性直接影响测量精度。建议在VCC与GND间并联100uF电解电容+0.1uF瓷片电容组合,可有效抑制电源纹波。
3. 软件算法实现细节
3.1 信号数字化处理
经过调理的模拟信号通过ADC0804转换为数字量(若无内置ADC,可用PWM+RC电路实现简易ADC)。采样率设置为100Hz即可满足需求,对应定时器配置:
c复制void Timer0_Init() {
TMOD |= 0x01; // 模式1
TH0 = 0xDC; // 10ms定时@11.0592MHz
TL0 = 0x00;
ET0 = 1;
EA = 1;
TR0 = 1;
}
3.2 峰值检测算法
传统阈值法在运动场景下误判率高,本设计采用动态阈值+斜率检测的复合算法:
- 滑动窗口均值滤波(窗口宽度15个采样点)
- 动态阈值 = 前5个波峰的平均值 × 0.6
- 正斜率超过阈值且幅值大于动态阈值时记为有效波峰
c复制uint8_t Peak_Detect(int16_t current) {
static int16_t last = 0;
static uint8_t count = 0;
if((current > last) && (current > threshold)) {
if(++count > 3) { // 连续上升判定
count = 0;
return 1;
}
} else {
count = 0;
}
last = current;
return 0;
}
3.3 心率计算与显示
为避免瞬时误差,采用滑动平均算法:
- 记录最近8个RR间期(相邻波峰时间差)
- 剔除最大最小值后取平均
- 心率(bpm) = 60 / (平均RR间期)
数码管显示通过74HC595驱动,采用定时器中断刷新:
c复制void Timer1_ISR() interrupt 3 {
static uint8_t pos = 0;
HC595_Write(seg_table[value[pos]] | (0x80>>pos));
pos = (pos+1) % 4;
}
4. 典型问题与解决方案
4.1 信号不稳定问题
现象:测量值跳动剧烈
排查步骤:
- 检查指尖接触压力(压力不足时波形幅值小)
- 观察环境光干扰(强光下需增加遮光罩)
- 测量电源纹波(示波器查看VCC波动)
4.2 运动伪迹干扰
实测发现:轻微肢体移动会导致波形严重畸变。我的解决方案是:
- 硬件端:增加加速度计(如ADXL335)进行运动补偿
- 软件端:当检测到大幅值突变时暂停计数2秒
4.3 低灌注信号处理
对于血液循环较差的人群(如老年人),可采取:
- 提高发射管电流至15mA(不超过额定值)
- 软件端启用自动增益控制(AGC)算法
- 改用绿色LED(对血红蛋白吸收更敏感)
5. 项目优化方向
在完成基础功能后,可以考虑:
- 增加蓝牙模块(HC-05)实现手机APP显示
- 添加SD卡存储功能(记录24小时心率变化)
- 改用OLED显示(12864屏可显示波形)
- 引入机器学习算法(识别心律失常特征)
我实际测试中发现,在STC89C52上跑FFT频谱分析会严重超负荷。若需要高级信号处理,建议升级到STC12系列(1T架构)或STM32F103。不过对于课程设计而言,现有方案已经完全满足要求。
最后分享一个调试技巧:用Excel绘制原始采样数据曲线,能直观判断算法缺陷。我曾通过波形对比发现,简单的移动平均滤波会严重钝化波峰,后来改用FIR滤波器后测量精度提升了40%。
