2026/9/10 18:28:33

51单片机心率监测系统设计:ST188信号链与BPM算法实现

51单片机心率监测系统设计:ST188信号链与BPM算法实现 简介本资源是一套完整的基于51/52单片机的心率监测系统毕业设计实践方案面向电子类、自动化及物联网专业本科生与课程设计/毕设初学者解决心率实时采集、阈值报警与人机交互等典型嵌入式开发问题。压缩包共64个文件涵盖Keil源程序工程含C代码、hex、uvproj等、Proteus仿真工程含dsn、mp4操作视频、JPG/PDF仿真图、电路原理图sch、JPG、PDF、元器件清单xls及配套技术手册PDF、设计说明txt/doc、答辩资料doc/docx等类型丰富且分工明确便于从硬件搭建、软件调试到论文撰写的全流程学习。资源包大小为11.15MB结构清晰关键文档均标注“必读”提示降低入门门槛。已有131人学习下载提供从传感器选型ST188红外对管、LM358运放、信号调理、液晶显示1602、按键设置阈值到蜂鸣器报警的完整实现路径兼具教学性与工程参考价值。1. 为什么用51单片机ST188做心率监测反而比商用模块更适合作为毕业设计载体很多同学拿到心率项目第一反应是找MAX30102或AD8232模块——精度高、资料多、接上就能跑。但真到答辩现场老师一句“你讲讲ST188怎么把光信号转成有效脉搏波”立刻卡壳。这个基于ST188LM35851单片机的系统恰恰卡在工程实践最硬的关节上从原始模拟信号到数字脉搏计数的全链路闭环。它不回避噪声、不跳过放大、不绕开阈值判别而是把光电传感器输出的微弱毫伏级变化经LM358两级放大与滤波后送入51单片机的外部中断引脚再用定时器精确测量相邻脉冲间隔最终换算为BPM每分钟心跳次数。整个流程里ST188的发射管电流控制、LM358的同相/反相放大配置、51单片机INT0中断服务程序中去抖逻辑、1602液晶的4位数据总线时序——全是课程设计必考细节。它不是“能测就行”的玩具而是把《模拟电子技术》《单片机原理》《嵌入式系统设计》三门课的知识点拧成一股绳的典型载体。尤其适合需要展示硬件选型依据、电路调试过程、软件状态机设计能力的本科毕设场景。2. ST188LM358信号链设计为什么必须用两级放大而非单级参数怎么配2.1 ST188工作原理与原始信号特征ST188是红外反射式对管由红外LED发射管和硅光敏三极管接收管组成。当手指置于其上方时动脉搏动引起皮下血容量周期性变化导致反射红外光强度随之波动。接收端输出的是毫伏级交流信号峰峰值约1–5mV叠加在数百毫伏的直流偏置上且混有工频干扰、运动伪影和热噪声。直接送入单片机ADC或比较器会因信噪比过低而无法稳定触发。因此必须先进行直流偏置提取→交流耦合→带通放大→整形四步处理。提示ST188手册明确标注其接收管输出为电流源模式需外接负载电阻转换为电压。常见错误是直接将接收端接VCC或GND导致无输出或饱和。2.2 LM358双运放典型应用电路配置本系统采用LM358双运放构建两级处理链第一级为高增益同相放大高通滤波第二级为带通滤波施密特触发整形。电路结构如下对应原理图PDF第3页// 第一级同相放大 一阶高通fc ≈ 0.5Hz // R110k, R2470k → 增益 Av1 1 R2/R1 ≈ 48 // C110uF, R110k → 高通截止频率 f_c 1/(2π*R1*C1) ≈ 1.59Hz实际取值兼顾去基线漂移 // 第二级反相带通 施密特触发迟滞约±0.2V // R310k, R4100k → 反相增益 Av2 -R4/R3 -10 // C20.1uF, R510k → 低频截止 f_L 1/(2π*R5*C2) ≈ 159Hz抑制高频噪声 // R61M, R710k → 施密特正向阈值 V_th Vcc * R7/(R6R7) ≈ 0.05V负向阈值 V_th- ≈ -0.05V关键参数说明第一级增益48倍将1mV信号抬升至48mV避开51单片机内部比较器输入范围下限通常≥100mV才可靠触发高通截止1.59Hz滤除呼吸波0.1–0.5Hz和缓慢基线漂移保留0.8–3Hz心率频段第二级带通中心频率≈1.2Hz由C2/R5与后续RC网络共同决定抑制50Hz工频干扰施密特触发迟滞±50mV防止噪声在阈值附近反复翻转确保每个真实脉搏仅产生一个干净下降沿。注意LM358供电必须为单电源5V其输出无法达到轨到轨。实测中若第二级输出摆幅不足需检查R6/R7分压比是否过大——此处R61M过大会导致迟滞过小建议调整为470kΩ以获得±0.15V迟滞。2.3 Proteus仿真验证关键步骤在Proteus 8.13中加载仿真源文件.DSN后执行以下操作验证信号链有效性# 1. 在ST188接收端探针处放置虚拟示波器XSC1 # 2. 运行仿真观察原始信号应为叠加在~2.5V直流上的微弱波动峰峰值5mV # 3. 将探针移至LM358第一级输出端U1A OUT信号幅度应达~100mV基线稳定 # 4. 移至第二级输出端U1B OUT应看到规则方波频率对应设定心率如60BPM1Hz # 5. 若方波占空比异常或频率跳变检查C1容值——增大C1可降低高通截止频率但会引入相位延迟失败时排查重点ST188发射管限流电阻R_led是否为100Ω过大则红外功率不足反射信号微弱LM358第4脚V-是否接地第8脚V是否接5V接反会导致运放失效施密特触发反馈电阻R6是否虚焊万用表量测R6两端阻值应为标称值。3. 51单片机核心逻辑实现如何用定时器外部中断精准计算BPM3.1 硬件资源分配与引脚定义根据51工程文件\STARTUP.A51及main.c头文件关键引脚映射如下功能单片机引脚说明脉搏信号输入P3.2 (INT0)下降沿触发接LM358第二级输出液晶数据总线P0.0–P0.34位模式D4–D7液晶控制线P2.0(RS)寄存器选择P2.1(RW)读写控制固定接地P2.2(EN)使能脉冲报警蜂鸣器P1.0低电平驱动共阴极设置按键P1.1–P1.3KEY_UP / KEY_DOWN / KEY_SET提示KEY3为三按键结构非矩阵键盘。P1.1–P1.3默认上拉按键按下时对应引脚拉低需在key_scan()函数中加入10ms软件消抖。3.2 外部中断定时器协同计时算法心率计算本质是测量相邻两个脉搏下降沿的时间间隔再换算为每分钟次数。51单片机资源有限不能依赖长延时函数必须用定时器溢出中断配合外部中断标志。核心代码逻辑如下摘自pulse_count.c#include reg52.h #define uchar unsigned char #define uint unsigned int uchar pulse_cnt 0; // 脉冲计数器用于60秒内计数 uint time_cnt 0; // 定时器T0计数值单位ms bit pulse_flag 0; // 脉冲捕获标志 uint last_time 0; // 上次脉冲时刻ms uint interval_ms 0; // 当前间隔ms void Timer0_Init() { TMOD | 0x01; // T0为16位定时器 TH0 (65536-50000)/256; // 50ms定时11.0592MHz晶振 TL0 (65536-50000)%256; ET0 1; // 开T0中断 TR0 1; // 启动T0 } void EX0_Init() { IT0 1; // INT0下降沿触发 EX0 1; // 开外部中断0 EA 1; // 开总中断 } void main() { Timer0_Init(); EX0_Init(); while(1) { if(pulse_flag) { pulse_flag 0; if(time_cnt last_time) interval_ms time_cnt - last_time; else interval_ms 0xFFFFFFFF - last_time time_cnt; // 处理定时器溢出 last_time time_cnt; if(interval_ms 300 interval_ms 2000) { // 排除误触发300ms为抖动2s为停搏 uint bpm 60000 / interval_ms; // 换算BPM if(bpm 40 bpm 200) show_bpm(bpm); // 显示并限幅 } } } } void timer0() interrupt 1 { TH0 (65536-50000)/256; TL0 (65536-50000)%256; time_cnt 50; // 每50ms累加一次 } void ex0_int() interrupt 0 { pulse_flag 1; // 置位标志避免在中断中执行耗时操作 }参数说明interval_ms两次脉冲间毫秒数60000ms ÷ interval_ms BPM300–2000ms过滤区间对应200–30BPM覆盖正常人体心率范围静息60–100运动可达180time_cnt为全局变量需声明为uint16位并注意溢出处理——当time_cnt从65535回绕至0时last_time time_cnt成立此时真实间隔 0xFFFFFFFF - last_time time_cnt。3.3 1602液晶显示驱动关键时序本系统采用4位数据总线模式以节省IO口。lcd_write_com()函数中关键时序要求依据HD44780手册操作最小时间实现方式E脉冲宽度≥450nsE1; _nop_(); _nop_(); E0;E上升沿到数据建立≥40ns数据写入P0后延时1个机器周期指令执行时间1.64ms写入指令后需delay_ms(2)void lcd_write_com(uchar com) { RS 0; RW 0; P0 com 0xF0; // 高4位 E 1; _nop_(); _nop_(); E 0; // 使能脉冲 delay_us(200); P0 (com 4) 0xF0; // 低4位 E 1; _nop_(); _nop_(); E 0; delay_ms(2); // 等待指令执行 }注意delay_us(200)不可省略否则低4位可能未被正确锁存delay_ms(2)必须大于1.64ms否则下一条指令可能被覆盖。4. 报警阈值设置与蜂鸣器驱动KEY3三按键状态机设计要点4.1 KEY3按键状态机逻辑KEY3包含UP/DOWN/SET三个独立按键需实现阈值上下限独立设置确认保存功能。状态机设计为三级嵌套主状态子状态操作逻辑IDLE—显示当前BPM及阈值等待SET键按下SET_MODESET_LOWUP/DOWN调节下限SET确认进入上限设置SET_HIGHUP/DOWN调节上限SET返回IDLE并保存EEPROM状态切换关键代码key_process.ctypedef enum {IDLE, SET_LOW, SET_HIGH} set_state_t; set_state_t cur_state IDLE; uchar low_th 60, high_th 100; // 默认阈值 void key_scan() { static uchar key_pre[3] {1,1,1}; // 上次状态 uchar key_cur[3]; key_cur[0] KEY_UP; // P1.1 key_cur[1] KEY_DOWN; // P1.2 key_cur[2] KEY_SET; // P1.3 for(uchar i0; i3; i) { if(key_cur[i] 0 key_pre[i] 1) { // 下降沿 switch(cur_state) { case IDLE: if(i 2) cur_state SET_LOW; // SET键进入设置 break; case SET_LOW: if(i 0) low_th (low_th 120) ? low_th1 : 40; // UP加1 if(i 1) low_th (low_th 40) ? low_th-1 : 120; // DOWN减1 if(i 2) { cur_state SET_HIGH; lcd_show(HIGH:); } // SET切上限 break; case SET_HIGH: if(i 0) high_th (high_th 180) ? high_th1 : 60; if(i 1) high_th (high_th 60) ? high_th-1 : 180; if(i 2) { save_to_eeprom(); cur_state IDLE; } // SET保存退出 break; } } key_pre[i] key_cur[i]; } }提示save_to_eeprom()调用STC89C52内置EEPROM写入函数地址0x2000存储low_th0x2001存储high_th。写入前需校验地址有效性避免擦写寿命耗尽。4.2 BZ蜂鸣器驱动电路与软件控制蜂鸣器型号为TMB-12A05有源型其内部已集成振荡电路只需提供直流电压即可发声。原理图中P1.0经1kΩ限流电阻驱动低电平导通共阴极接法void beep_on() { P1_0 0; // 拉低导通 delay_ms(500); // 持续500ms } void beep_off() { P1_0 1; // 拉高关断 } // 主循环中实时检测 if(bpm high_th || bpm low_th) { beep_on(); lcd_show_alert(); // 显示ALERT! } else { beep_off(); }关键约束有源蜂鸣器不可用PWM驱动否则可能损坏内部振荡器delay_ms(500)期间CPU被阻塞若需同时处理其他任务应改用定时器中断标志轮询实际PCB布线时蜂鸣器走线需远离模拟信号路径如ST188接收端避免电磁干扰。5. 从仿真到实物焊接调试与常见故障定位实战技巧5.1 万能板焊接关键工艺控制点本系统采用洞洞板万能板手工焊接而非PCB需特别注意三点电源去耦在LM358第4脚GND和第8脚VCC就近焊接0.1μF陶瓷电容否则运放易自激振荡ST188间距控制发射管与接收管中心距严格保持3mm用游标卡尺校准过近导致直射光饱和过远则反射信号衰减液晶排线长度1602数据线P0.0–P0.3与控制线P2.0–P2.2应等长布线长度≤10cm否则4位模式下时序偏移导致乱码。提示焊接LM358时烙铁温度设为350℃单点焊接时间≤2秒避免热损伤运放内部晶体管。5.2 分阶段调试法信号链逐级验证表格调试阶段测试点正常现象异常处理方案电源层LM358第8脚对地电压4.95–5.05V检查7805输入电容是否虚焊模拟层ST188接收端万用表DC档读数≈2.4VAC档≈2mV若DC偏置偏离调整LM358第一级R1阻值放大层LM358 U1A输出示波器观测到清晰正弦波幅值≈100mV若失真检查R2是否接触不良整形层LM358 U1B输出方波频率心率值如60BPM→1Hz若无输出用万用表测U1B第7脚电压是否≈2.5V数字层P3.2引脚逻辑分析仪捕获下降沿间隔稳定若无边沿检查INT0中断使能位EX0是否为15.3 心率值跳变/归零的终极排查清单当实测BPM频繁跳变或恒为0时按此顺序检查ST188物理接触手指是否完全覆盖发射/接收窗口指甲盖反光会导致信号丢失LM358供电用万用表测第4脚GND与第8脚VCC间电压若低于4.8V更换7805稳压芯片INT0中断优先级确认PX01外部中断0优先级最高避免被其他中断抢占定时器初值计算晶振频率是否为11.0592MHz若误用12MHz晶振TH0/TL0需重算为(65536-46080)液晶背光电路检查LED与LED-间是否串接了47Ω限流电阻电阻开路会导致屏幕全黑误判为程序死机。最后一步技巧在ex0_int()中断服务程序首行插入P1_7 ~P1_7;翻转P1.7用示波器观测该引脚波形。若P1.7有规律翻转证明INT0中断正常触发若无翻转则问题在硬件信号链前端。本文还有配套的精品资源点击获取