ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

51单片机脉搏呼吸监测报警系统:Proteus仿真到AD原理图设计

51单片机脉搏呼吸监测报警系统:Proteus仿真到AD原理图设计 简介这是一份基于51单片机与Protues仿真的脉搏呼吸监测报警系统设计资料面向单片机学习者和电子设计竞赛备赛者用于掌握传感器采集、LCD1602显示、按键交互与上下限报警逻辑的完整开发流程。包体共46个文件约2.43MB包含Protues仿真图DSN、C语言源代码main.c、lcd1602.c、AD原理图及PDF预览另有流程图和元件清单等辅助材料便于从电路搭建到程序设计对照学习。系统通过传感器检测脉搏与呼吸频率支持独立按键设置报警阈值超限时触发报警并在LCD1602上实时显示测量值与设定值功能衔接清晰适合作为课程设计或入门综合项目的参考模板。资源含详细流程图与部分文档说明可帮助理解主程序、LCD驱动和按键扫描等模块的编写思路。目前已有78人学习下载对希望快速上手51单片机仿真实战、完成类似监测报警作品的学习者具有较好的参考价值。1. 为什么这个脉搏呼吸监测报警项目适合先仿真再画原理图脉搏和呼吸这两个生理参数监测方式完全不同。脉搏信号变化快、频率约 12 Hz呼吸信号变化慢、周期约 35 秒把两者同时接入 51 单片机需要设计两路信号调理电路再在固件里用定时器分时处理。单纯说“做一个监测报警系统”很容易难点在于信号链的每一级都有坑光敏管输出幅度只有毫伏级比较器阈值设得不对会把噪声当成心跳呼吸传感器在 Proteus 里根本没有现成模型必须用信号源和电位器搭出等效波形。先跑通仿真、再画 AD 原理图的多但很多人卡在“仿真波形和实际传感器差异大”以及“AD 原理图网络标号没对齐导致编译报错”这两步。这套方案适合做 51 单片机课程设计、毕业设计以及刚接触嵌入式硬件想完整走一遍“传感器到报警输出”的开发者。2. 脉搏与呼吸信号调理电路从传感器输出到单片机可读的电平做这个项目之前先把两路传感器的电气特征弄清楚。脉搏检测常见做法是光电容积法红外发光管照射手指光敏管接收透射或反射光血液脉动会改变透射光强度光敏管集电极电压随之波动呼吸检测在实物中常用热敏电阻或压电薄膜感知气流温度变化前者在 Proteus 里没有标准模型需要拆成“慢变直流分量 波动”来处理。2.1 脉搏信号怎么从红外对管变成 LM393 输出的干净方波光敏管产生的交流分量经过滤波后幅度大约几十到几百毫伏不能直接进 51 单片机的 IO。常见做法是接到 LM393 比较器的一路输入端把同相输入端接一个电位器分压作为阈值反相输入端接光敏管信号。当脉搏冲击让信号幅度越过阈值时比较器输出翻转IO 就能读到稳定的方波沿。VCC - R1 1k - 红外LED正极 红外LED负极 - 手指透射式放置- 光敏管74系列或光敏二极管 光敏管发射极 - GND 光敏管集电极 - R2 47k - VCC 光敏管集电极输出 - C1 10uF - LM393 pin2反相输入 LM393 pin3同相输入- RP1 10k 电位器分压 LM393 pin1 输出 - R3 10k 上拉到 VCC - P3.2 (INT0)代码块里这套参数对应 Proteus 里常见的“红外对管 LM393”模板。R1 限制红外 LED 电流在 1020 mA太大容易烧管太小信号幅度不足R2 取值决定光敏管集电极电压工作点47k 让静态电压接近 VCC/2脉动时有最大摆幅C1 是隔直电容把直流工作点隔掉只保留交流脉搏波RP1 的阈值建议从 VCC/2 附近往下调直到输出端出现稳定方波。需要注意LM393 是开漏输出必须接上拉电阻 R3 才能输出高电平。Proteus 里不加上拉的话输出端只有低电平和悬浮两种状态仿真时经常出现波形看得到但单片机读不到高电平的问题。比较器两级之间如果对着仿真的波形检查不到翻转优先看阈值电压是否落在信号摆幅区间内。2.2 呼吸通道的直流分量与比较器阈值设置呼吸信号在实物中的频率比脉搏低一个数量级但在 Proteus 仿真里这路信号往往被简化成“吸气时电压变化、呼气时恢复”的慢变电平。我的做法是用一个电位器和三极管搭出分压变化或者直接在仿真图上放一个低频正弦信号发生器经过二极管整形后接另一路 LM393。更稳定的方案是让呼吸信号经过电压跟随器后进入 ADC用软件判断波形上升沿。呼吸比较器电路可以复用 LM393 的第二路呼吸信号源 - C2 47uF 隔直 - R4 10k - LM393 pin6反相输入 LM393 pin5同相输入- RP2 10k 电位器 LM393 pin7 输出 - R5 10k 上拉到 VCC - P1.1C2 的容值比 C1 大原因是呼吸波形更慢时间常数必须匹配。如果 C2 太小低频分量被滤掉大半比较器输出就一直停在某一状态不翻转。RP2 的设置参考呼吸波形的平均电压值先把电位器调到 VCC/2 附近再让信号源输出幅度缓慢变化正常情况下输出端在波形上升和下降沿各翻转一次。实物中如果用热敏电阻方案NTC 两端的电压变化同样可以用 LM393 整形输出仿真里只要把 NTC 拆成“固定分压 可变电压源”的等效模型即可。这样在 Proteus 里不用找特定传感器模型逻辑链路和实物是一致的。2.3 定时器扫描代替 ADC 连续采样51 单片机资源怎么分配51 单片机管脚有限如果两路信号都用 ADC 采集需要外接 ADC0809 或 ADC0834仿真连线复杂且占用 P0/P2 口。更经济的做法是脉搏通道用外部中断 INT0 采集脉冲沿呼吸通道用 LM393 输出电平变化再配合定时器 0 做周期扫描和计时。这样整个系统只需要 3 个 IOP3.2 接脉搏方波、P1.1 接呼吸电平、P1.0 驱动报警输出其余 IO 留给显示和按键。定时器 0 配置为 20 ms 周期中断一方面刷新脉率统计另一方面累计呼吸通道无翻转的时间。呼吸信号慢用 100 ms 或 200 ms 扫描一次电网不漏20 ms 基时足够做 5 倍过采样误判概率低。如果题目要求必须用 ADC 看呼吸波形可以在 Proteus 里放一个 ADC0834把呼吸信号接 IN0再写读取时序但我一般不会默认加这个东西除非仿真题目明确要求显示呼吸波形幅值。3. Proteus 仿真接线最小系统、虚拟信号源与端口排错仿真图是这套项目的第一个交付物也是后面调固件的载体。Proteus 里搭建 51 单片机最小系统本身不难但很多人栽在晶振频率、端口上拉、信号源参数这几个细节上。3.1 在 Proteus 里搭建 51 单片机最小系统的器件清单新建工程后放置 AT89C51晶振选 12 MHz两个 30 pF 负载电容分别接晶振两端到地复位电路用 10 uF 电解电容和 10k 电阻。Proteus 里的 AT89C51 需要手动接 VCC 和 GND这里说的“时序”不对很多初学者看到芯片没标电源引脚就以为不用接但这是仿真连线里默认不画电源引脚导致的误解。仿真运行时芯片不工作第一件事先查芯片是否被正确供电。复位电路参数RST 引脚通过 10k 电阻下拉到地同时接 10uF 电容正极到 VCC。上电瞬间电容充电RST 保持高电平约 100 ms单片机复位完成。12 MHz 晶振配合定时器初值计算方便定时器 0 工作在方式 120 ms 中断一次初值为65536 - 20000这个数值后面会在代码里直接体现。3.2 用 DTM 信号发生器模拟脉搏和呼吸波形Proteus 元件库没有“手指传感器”波形得靠信号源构造。正常成年人休息状态脉率 72 次/分钟也就是 1.2 Hz在 DTM 信号发生器里设置频率为 1.2 Hz幅度调到 100 mV偏置设为 2.5 V把它接到 2.1 节电路的 LM393 反相输入端。这样设计偏置的目的是让信号牢靠地处于比较器阈值附近调节 RP1 能看到输出端波形占空比变化。呼吸用另一路信号发生器频率 0.25 Hz相当于每分钟 15 次呼吸幅度约 1 V偏置 2 V。呼吸信号直接进比较器的话波形边缘可能不够陡建议在仿真图上加一个施密特整形或者用信号发生器的方波输出代替正弦波这样单片机读到的翻转沿更可靠。如果这里想看原始波形可以在信号源输出端挂一个虚拟示波器 A 通道LM393 输出挂 B 通道两个对比着调 RP2 会直观很多。3.3 蜂鸣器报警输出必须加三极管驱动不能直接接 IO51 单片机 IO 高电平驱动电流只有几毫安有源蜂鸣器正常工作需要 2030 mA。直接接 IO 会导致电压被拉低仿真里表现为蜂鸣器不响实物里可能烧毁 IO 口。驱动电路用 NPN 三极管 8550 或 8050 接到 P1.0 即可见下面示意P1.0 - R6 1k - Q1 Base Q1 Emitter - GND Q1 Collector - Buzzer 负极 Buzzer 正极 - VCCP1.0 输出高电平时三极管导通蜂鸣器得电。这个接法里 R6 是限流电阻避免基极电流过大Buzzer 用 Proteus 库里的 ACTIVE BUZZER仿真时能直接听到声音。如果想让报警更直观并接一个 LED 到 P1.0代码改成ALARM 1点亮 LED 加蜂鸣器同时触发。报警输出还可以扩展一旦脉率超限用定时器控制蜂鸣器鸣叫节奏比如鸣叫 200 ms 停止 200 ms这样比长鸣更容易被注意到。3.4 Proteus 仿真发散和端口浮空的 4 个排错点Proteus 仿真发散最常见的 4 个原因按出现频率排比较器输入端悬空导致输出抖动晶振电路参数错误导致时序异常信号源偏置设置不当导致波形截顶或削底IO 口未用上拉电阻导致电平不确定。仿真是电气逻辑仿真任何输入引脚悬空都会被当成噪声源处理进而让比较器输出在高频抖动看波形是毛刺一片。遇到仿真发散时先把未用的 51 IO 口接上拉电阻Proteus 里用排阻方便再把信号源频率降到 1 Hz 以下观察输出是否稳定。如果还是发散检查电源网络Proteus 默认 VCC/GND 是全局网标但比较器芯片的供电脚必须显式连接 VCC 和 GND不能依赖默认。芯片供电缺一个脚仿真器就可能在迭代时输出无穷大值表现为“发散”。4. 51 单片机源代码脉率计数、呼吸暂停判定与报警阈值表这一章是交付物的核心部分。源码可以在 Keil5 里编译烧录到仿真图的 AT89C51 里跑。我给出一套能直接落地的代码框架涵盖了定时器 0、外部中断 0、呼吸超时和按键调阈值四部分。4.1 定时器 0 产生 20ms 基时累计脉率统计窗口#include reg51.h #define TH0_VALUE 0xB1 #define TL0_VALUE 0xE0 // 12MHz, 方式1, 20ms sbit PULSE P3^2; sbit BREATH P1^1; sbit BUZZER P1^0; sbit KEY_UP P2^0; sbit KEY_DOWN P2^1; unsigned int pulse_count 0; unsigned int breath_count 0; unsigned char second_count 0; unsigned int pulse_rate 0; unsigned int breath_rate 0; unsigned int breath_last_flip 0; unsigned int breath_pause_limit 400; // 8秒 bit breath_pause_flag 0;TH0_VALUE 和 TL0_VALUE 的来历12 MHz 晶振下机器周期 1 us定时器方式 1 是 16 位计数溢出值 65536 减 20000 得 45536转十六进制是 0xB1E0所以拆成高 8 位 0xB1、低 8 位 0xE0。如果晶振换 11.0592 MHz初值要重新算这个细节在实物调试时直接决定计时准不准。主函数里做定时器初始化和按键扫描中断服务程序负责累加标志void timer0_isr() interrupt 1 { TH0 TH0_VALUE; TL0 TL0_VALUE; second_count; if (second_count 50) { // 1秒 second_count 0; pulse_rate pulse_count * 60; pulse_count 0; breath_rate breath_count * 20; // 呼吸按3秒窗口折算 breath_count 0; } breath_last_flip; if (breath_last_flip breath_pause_limit) { breath_pause_flag 1; } }每进入 50 次中断就是 1 秒。pulse_count 由外部中断累计乘 60 后得到每分钟脉率。呼吸窗口 3 秒是因为呼吸频率低1 秒统计次数容易出现“0 次/分钟”的误判取 3 秒内计数再乘 20等效成一分钟频次。breath_last_flip 每 20 ms 加一超过 400 即 8 秒无呼吸翻转置呼吸暂停标志。4.2 外部中断 INT0 对脉搏方波计数与单边沿触发void ext0_isr() interrupt 0 { if (PULSE 0) { pulse_count; } breath_last_flip 0; if (BREATH 1) { breath_count; } }外部中断 0 配置为下降沿触发每次脉搏方波从高到低跳变时进入。设 IT0 1 就是边沿触发比电平触发稳定避免在方波持续期间反复进入中断。PULSE 0 是在中断标志已经置位后再次确认引脚电平防止噪声导致的误触发。breath_last_flip 在这里清零意味着每次呼吸通道输出翻转都会重置超时计数相当于软件看门狗重置条件是被监测量本身的事件。如果某个时刻呼吸停止翻转发不会再发生超时标志就会在 8 秒后置位。4.3 报警条件组合脉率越限、呼吸暂停、参数锁存void check_alarm() { if (pulse_rate 120 || pulse_rate 50) { BUZZER 1; } else if (breath_pause_flag 1) { BUZZER 1; } else { BUZZER 0; } }报警逻辑采用 OU 关系任何一个异常都触发越限恢复后自动解除。这个逻辑还缺一个报警锁存临床设备上临时报警不应在参数回正常后立刻消失要让医护人员确认。加一个alarm_latch全局变量首次置位后只有按键确认时才清除。做课设或毕设时加这一条能明显提升完成度毕竟“报警”本身就应该有可持续性和可确认性。呼吸暂停标志一旦置位即使呼吸恢复也不会自动清除这是刻意设计。否则在暂停边缘反复进出时蜂鸣器会间隔几秒就响一次让人分不清是暂时性信号丢失还是真异常。按下确认键清标志再执行一次呼吸翻转判断是常见的人机交互做法。4.4 报警阈值参数表与按键调节逻辑参数默认值调节范围调节步长对应变量脉率上限120 次/分100-1805pulse_upper脉率下限50 次/分30-705pulse_lower呼吸暂停时间8 秒5-151breath_pause_limit蜂鸣器占空比50%//alarm_pwm这个表格放在源码头文件里作为宏定义或 EEPROM 初始值都可以。仿真里按键调整阈值用的是 P2.0加和 P2.1减每按一下改一个步长超过上下限则回绕。考虑到仿真是无界面环境改为字符串发送到虚拟终端或 LCD1602 显示是更完整的产品化路径。void key_scan() { if (KEY_UP 0) { delay_ms(20); while(KEY_UP 0); pulse_upper 5; if (pulse_upper 180) pulse_upper 100; } if (KEY_DOWN 0) { delay_ms(20); while(KEY_DOWN 0); pulse_lower - 5; if (pulse_lower 30) pulse_lower 70; } }按键扫描必须消抖这里用延时 20 ms 加松手检测。如果不消抖一次按压会触发多次阈值调整仿真不明显实物板子非常明显。调完之后把 pulse_upper 和 pulse_lower 送到串口打印用 Proteus 虚拟终端看结果比 LCD1602 少接十几根线排错时间短很多。5. AD 原理图绘制的三个提速点多图纸、网络标号与电气规则检查前四章的仿真和源码搞定后AD 原理图是另一个交付物。这里有个容易混淆的点标题里的“AD”是 Altium Designer 原理图设计工具不是模数转换器。这块追求的不是画得多漂亮而是让读图的人一眼看清信号流向不给制板环节埋雷。5.1 AD 里把系统拆成 3 张子图用端口符号代替跨页长线单页原理图画这个系统可以容纳全部元件但图面乱网络标号多检查耗时。我的做法是拆 3 张子图第一张放 51 最小系统和按键、蜂鸣器、LED第二张放两路 LM393 比较器及信号输入端子第三张放电源插座、电源指示灯和接插件。用端口符号跨页面连接同名网络别直接拉跨页导线。在设计图纸上放置 Port快捷键 PR设置相同名字的端口在编译后自动建立电气连接。这样做的直接好处是 AD 在工程编译时能同时检查跨图连接是否匹配比人眼一根线一根线核对强得多。5.2 ERC 检查与网络标号高亮是怎么排除虚连的画完原理图后先编译工程Messages 面板会列出未连接引脚和单端网络。常见的“原理图连上了但编译报错”情况是引脚端点没有接触到导线端头。放大到 400% 看引脚端是否有方块节点显示没有就是虚连。用快捷键 ShiftS 单层显示再点网络标号会高亮所有同名校验网络这种方法查整张图的电源/地最快。AD 里改元件参数 Comment 时使用批量编辑选中同类元件后在 Properties 面板修改即可逐个点改非常浪费时间。5.3 网络标号命名规范与 ERC 规则设置清单检查项设置建议误报处理单端网络报错未用引脚加 No ERC 标记未连接的电源引脚报错检查隐藏引脚是否启用重复的网络标号报错重命名其中一个输出引脚短路警告确认是故意连接再忽略电源网络统一用 VCC 和 GND 的电源符号放置LM393、AT89C51 这类芯片隐藏的电源引脚会自动接到同名校验网络。另一点是排版的顺序问题信号流从左到右放置输入接插件放左侧单片机放中间负载和输出放右侧这个习惯和仿真图方向一致别人评审原理图时不需要来回找信号源在哪边。本文还有配套的精品资源点击获取
返回列表