资讯动态

51单片机输液报警系统Proteus仿真设计:滴速与液位双路监控

发布时间:2026/9/13 21:17:57 来源:尧图企业网站定制
简介这套基于51单片机的输液报警系统资料面向电子、自动化及相关专业做毕业设计或课程设计的学生完整解决滴速监测、液位检测与报警控制的仿真与实物搭建问题。项目采用电位器模拟液位变化、信号发生器模拟滴速脉冲由51单片机采集并比对报警阈值原理清晰且易于复现。资源共包含75个文件以PDF/DOC说明文档、C语言程序源码、Proteus仿真文件、原理图与器件清单为主并附有流程图、常用芯片手册及答辩技巧参考整体约30.16MB目录按程序、仿真、原理图、流程图、器件清单等模块整理便于按需查阅。目前已有155人学习下载。通过这套资料读者可以获取完整的程序源码、硬件连接原理图、可运行仿真工程及元件选型列表还能借助调试记录和焊接技巧文档避坑适合希望快速完成高校电子类项目设计与论文撰写的学习者。1. 输液报警的仿真信号链滴速与液位双路监听的实现前提输液安全的核心不是有没有人在看而是监控电路是否在传感器异常时还能给出明确提示。医院输液场景里滴速过快会引发药物不良反应液位过低则可能导致回血这两路信号必须同时进入处理器。实际产品常用光电对管测滴速、电容传感器测液位成本高且调试依赖真实输液器。而毕设和课设场景更现实的做法是用电位器的分压变化模拟液位升降用信号发生器的脉冲频率模拟滴速快慢把这两路模拟信号送入 51 单片机经过采样和比较后驱动蜂鸣器与 LCD1602 输出。这样做的好处是信号链完整——采集、处理、判定、报警、显示全都有且整个系统可以在 Proteus 仿真里反复调参不需要等待实物器件。对准备 51 单片机毕业设计的同学来说这是投入最低、答辩可讲点最均衡的双通道监控方案。2. 信号链设计与外设分配电位器模拟液位、脉冲源模拟滴感整套系统的硬件选型有一个明确约束51 单片机没有内置 ADC也不能直接测量频率所有输入信号都必须通过外设扩展。AT89S52 和 STC89C52 这两款芯片都采用 MCS-51 内核外部引脚完全兼容资料里同时附了两份中文手册说明代码在两个型号上都可以直接编译烧录。选择 51 系列而不是 STM32 的理由有三点GPIO 为准双向口直接驱动蜂鸣器不需要电平转换内部定时器 T0/T1 配合外部中断可以完成滴速测频Keil C51 的第三方例程极多遇到问题能快速定位到是硬件时序还是软件逻辑的问题。2.1 液位通道电位器分压与 ADC0832 的 8bit 采样液位传感器在真实产品里输出的是与液位高度成正比的模拟电压。仿真中用电位器模拟这个电压原理是电阻分压电位器两端分别接 VCC 和 GND中间抽头输出的电压随滑片位置在 05V 范围内线性变化。这个电压需要量化成数字量而 51 单片机自身没有 ADC 外设所以必须外接 ADC0832。这是 8bit 逐次逼近型 ADC双通道输入SPI 兼容时序满量程 5V 时分辨率约为 19.6mV对液位监控这种阈值判断场景完全够用。ADC0832 的读取时序需要严格按片选、时钟、数据线的顺序操作。核心读取代码如下// ADC0832 单通道读取CH0 接电位器抽头 unsigned char adc0832_read(unsigned char ch) { unsigned char i, dat 0; CS 0; // 片选拉低进入转换状态 CLK 0; // 初始化时钟线为低 // 通道选择位通过 DO 写入ch0 选 CH0ch1 选 CH1 for (i 0; i 8; i) { CLK 1; dat (dat 1) | DO; // 每个时钟上升沿采集一位数据 CLK 0; } CS 1; // 片选拉高结束本次转换 return dat; }这段代码的关键点是数据读取从最高位开始8 个时钟周期后 dat 中保存的就是 0255 的数字量。CLK 必须按先拉高再拉低循环DO 在电平稳定后才能被采样否则读到的数据会有跳变。如果 Proteus 仿真里 ADC 读数不稳定优先检查 CLK 引脚连接的网络名是否和单片机 IO 定义一致这是最常见的接线错误。液位报警阈值不需要很精确只要建立电压越高代表液位越高的映射即可。实际调试时按下面的对应关系标定电位器位置抽头电压ADC0832 读数液位状态接近 GND0V0.5V025空瓶立即报警中下部1V2V51102偏低提醒报警中上部2.5V4V128204正常输液接近 VCC4.5V5V230255液位满现场演示时把电位器旋钮缓缓向 GND 方向旋转观察 LCD 上显示的 ADC 值变化跌到设定阈值以下蜂鸣器应该立刻动作。2.2 滴速通道信号发生器脉冲与定时器测频原理滴速检测的本质是测量单位时间内的脉冲个数。真实输液器中液滴下落会遮挡光电对管在接收端产生一个下降沿脉冲输液越快脉冲越密。仿真环境里用信号发生器产生同频率的方波信号接单片机的外部中断输入引脚每个下降沿触发一次中断中断服务程序里做一个计数器累加。这里有一个容易忽略的设计取舍为什么用定时器加外部中断的组合而不是直接在主循环里轮询引脚电平因为主循环还要执行 ADC 采样、LCD 刷新、蜂鸣器控制等任务轮询方式无法保证时间片均匀测出来的脉宽误差很大。用外部中断捕获边沿、用定时器做统一时基计数器在固定窗口内累加这样测频结果和主循环的执行速度无关精度只取决于定时器的晶振频率。2.3 输出通道LCD1602 显示与蜂鸣器驱动LCD1602 负责显示当前滴速和液位状态。它采用 HD44780 兼容控制器数据线可以选择 4bit 或 8bit 模式。毕设资料里 lcd1602.c 用的是 4bit 模式只占用 P0 口的高四位加上 RS、RW、E 三个控制线省下的引脚可以留给 ADC 和报警电路。4bit 传输时序要特别注意一个字节被拆成高四位和低四位两次写入每次写入前必须先拉高 E 引脚再拉低形成写使能脉冲否则 LCD 会丢掉数据。蜂鸣器驱动电路相对简单但要注意驱动方式。有源蜂鸣器内部带振荡源通电就响无源蜂鸣器需要外部提供 24kHz 的方波才能发声。资料里的原理图用的是三极管驱动单片机 IO 输出高电平使三极管导通蜂鸣器得电。如果仿真中听不到声音先确认 Proteus 里蜂鸣器元件选的是有源还是无源型号无源蜂鸣器在仿真里即使接通直流也不会有音量输出。3. Proteus 仿真调整脉冲频率与液位分压的刻度换算Proteus 仿真文件是整个毕业设计调试效率最高的部分。资料包里仿真.DSN是主文件Backup Of 仿真.DBK是自动备份如果主文件打不开直接把 DBK 后缀改成 DSN 就能恢复。启动仿真后如果出现找不到元件模型的情况通常是 Proteus 版本过低元件库缺少新器件定义需要将 Proteus 升级到 8.6 以上版本重新打开。3.1 滴速脉冲发生器的频率参数设置仿真里模拟滴速的脉冲信号由信号发生器提供。Proteus 中可以直接放置信号发生器元件也可以使用虚拟仪器面板里的 DMM 或数字脉冲源。推荐的做法是使用一个独立的 PULSE 电压源参数设置如下幅度0V 到 5V与单片机高低电平匹配周期由目标滴速反推等于60 / 滴速滴每分钟脉冲宽度设置为周期的 30%50%避免边沿抖动造成重复触发换算关系非常直接如果信号发生器输出 0.5Hz 的方波说明每 2 秒有 1 个下降沿对应滴速为 30 滴/分钟1Hz 对应 60 滴/分钟2Hz 对应 120 滴/分钟。现场演示时先设成 1Hz 验证正常输液状态再突然提升到 2.5Hz此时系统应该在三秒内触发滴速过高报警。调整信号发生器频率时注意一点脉冲频率不能超过外部中断能处理的上限。51 单片机在 12MHz 晶振下执行一条指令约需 1μs中断响应加上现场保护大约 10μs如果输入脉冲超过 20kHz中断会互相挤占计数器丢失脉冲。输液滴速的合理范围是 20150 滴/分钟对应频率 0.33Hz2.5Hz离上限差两个数量级不会触发这个边界问题。3.2 电位器的液位模拟与阈值点判断Proteus 元件库中的POT就是旋转电位器两端接电源和地中间抽头通过导线接 ADC0832 的 CH0 输入。仿真运行时键盘上按A键和D键可以微调电位器位置ShiftA和ShiftD是大幅度调节。这样做的好处是可以在不停止仿真的情况下连续改变输入电压实时观察液位报警的触发点。液位报警的推荐阈值设置为主程序里的一个预处理宏这样改参数不用重新编译整个工程#define LOW_LEVEL_TH 25 // ADC 读数低于 25 认为液位过低 #define HIGH_LEVEL_TH 240 // 高于 240 认为液位过满Proteus 仿真中把电位器调到接近 GND 的位置ADC0832 读数应低于 25此刻液位报警应立刻响应。这里有一个容易误判的细节部分 Proteus 版本中电位器的调节范围不是完全到 0V默认最小阻值带有 1% 的残余电阻导致 ADC 读数最低只能到 35 而不是 0。这属于正常现象阈值判断时留出余量即可不要强制追求读数为 0。3.3 仿真运行中信号源与单片机的时序同步Proteus 仿真是事件驱动的信号源产生的边沿并不一定和单片机指令周期对齐。如果滴速显示偶尔出现明显偏差比如频率没变但显示值跳了一倍原因是下降沿正好落在定时器窗口边界上一次脉冲被计数在两个窗口里。解决方法是引入一个防抖筛选逻辑在中断服务程序中记录上一次触发的时间戳两次触发间隔小于 20ms 的脉冲直接丢弃。输液滴速最低 20 滴/分钟间隔 3 秒20ms 的防抖窗口完全不会滤掉真实脉冲但能有效消除仿真中毛刺信号的干扰。4. Keil C51 下的双路报警逻辑ADC 采样、定时测速与 LCD 状态输出程序部分的核心文件是main.c组织结构上采用前后台模式主循环负责 ADC 采样、阈值比较和 LCD 刷新两个中断服务程序分别负责滴速脉冲计数和定时器时基。这种结构简单可靠适合 51 单片机这种资源受限的芯片也方便在答辩时逐函数讲解。4.1 定时器 0 做 1 秒窗口定时器 1 产生 LCD 时序定时器 0 被配置为模式 1即 16 位定时器使用 11.0592MHz 晶振时每次溢出中断周期设为 50ms。为得到 1 秒的滴速计数窗口中断服务程序里设置一个静态变量累计 20 次溢出。初始化代码void timer0_init(void) { TMOD 0x01; // 定时器 0 工作在模式 116 位定时器 TH0 0x4C; // 50ms 初值11.0592MHz 晶振 TL0 0x00; ET0 1; // 开启定时器 0 中断 TR0 1; // 启动定时器 EA 1; // 全局中断使能 }初值0x4C00的计算方法是定时器 1ms 计数 11.0592MHz/12921.6 次50ms 需要 46080 次65536 减去 46080 得到 19456十六进制即0x4C00。如果换了晶振频率这个初值必须重新计算否则滴速窗口会偏离 1 秒显示值成比例偏移。4.2 外部中断 0 完成滴速脉冲计数滴速脉冲接到 P3.2INT0引脚设置为下降沿触发。每次液滴下落产生一个下降沿进入中断后做累加volatile unsigned int pulse_count 0; volatile unsigned int drip_speed 0; void int0_isr(void) interrupt 0 { pulse_count; // 累加滴速脉冲数 } void timer0_isr(void) interrupt 1 { static unsigned char tick 0; TH0 0x4C; // 重装定时器初值 TL0 0x00; tick; if (tick 20) { // 累计 20 次 50ms即 1 秒 drip_speed pulse_count * 60; // 换算为滴每分钟 pulse_count 0; tick 0; } }这段代码里pulse_count声明为volatile至关重要。中断服务程序和主循环共享这个变量volatile告诉编译器每次访问都要从内存重新读取不能优化到寄存器缓存里。如果不加这个关键字主循环读取到的可能是旧值滴速显示会一直停留在初始状态。计算逻辑是典型的频率转速率1 秒内计到的脉冲数乘以 60得到每分钟滴速。比如 1 秒内计到 1.5 个脉冲在整数环境下不成立实际会表现为有时 1 有时 2显示值在 60 和 120 之间跳变这是 1 秒窗口固有的量化误差。4.3 液位 ADC 采样与报警判定主循环每 100ms 调用一次adc0832_read取得当前液位对应的数字量然后与 ADC_LOW、ADC_HIGH 阈值比较。报警条件同时检测滴速和液位两个维度输出分为两个独立标志位#define SPEED_LIMIT_HIGH 120 // 滴速超过 120 滴/分钟报警 #define SPEED_LIMIT_LOW 20 // 滴速低于 20 滴/分钟报警 unsigned char adc_val; unsigned int speed; void check_alarm(void) { adc_val adc0832_read(0); // 读取 CH0 液位电压 speed get_drip_speed(); // 获取最近 1 秒的滴速 if (adc_val LOW_LEVEL_TH) { alarm_led 0; // 点亮液位报警灯 buzzer 1; // 开启蜂鸣器 lcd_show_level(LOW); } else if (speed SPEED_LIMIT_HIGH || speed SPEED_LIMIT_LOW) { alarm_led 0; buzzer 1; lcd_show_speed_err(speed); } else { alarm_led 1; // 正常状态LED 熄灭 buzzer 0; lcd_show_normal(adc_val, speed); } }判定顺序上先检查液位再检查滴速原因是液位低于阈值时系统处于最危险状态必须优先响应。滴速超限报警分为过高和过低两种过高说明输液过快过低说明输液可能被堵塞。仿真演示时为了突出效果通常把下限定为 20 滴/分钟只要把信号发生器频率降到 0.3Hz 以下就能触发低速报警。4.4 LCD1602 显示函数与状态刷新策略LCD 刷新如果每次都写全屏单片机大部分时间会耗在等待 LCD 忙标志上主循环执行变慢。推荐做法是 LCD 只更新变化的内容滴速显示每秒钟刷新一次液位 ADC 值每 100ms 刷新一次报警状态只在标志位变化时更新。lcd1602.c中写入字符串前必须等待忙标志void lcd_write_cmd(unsigned char cmd) { lcd_busy_wait(); // 等待空闲重点确认 E 引脚时序 RS 0; // 命令模式 RW 0; P0 cmd; // 输出命令字 E 1; // 产生写使能脉冲 _nop_(); E 0; }lcd_busy_wait的原理是读取 LCD 的忙标志位BF为 1 表示 LCD 正在内部处理不能接收新指令。如果复位后 LCD 一直不显示任何字符多半是初始化的时序顺序不对。标准步骤是上电等待 15ms → 写入 0x30 → 等待 5ms → 再写 0x30 → 等待 100μs → 写 0x30 → 进入功能设置。这一串延时不能省略否则 LCD 控制器的状态机没有进入正确的指令接收模式。5. 毕业设计答辩前必须验证的报警边界与演示手法仿真能跑通和答辩能讲清楚是两回事。最后的调试应当围绕三个边界状态展开液位低报警的临界 ADC 值、滴速过高的临界频率、以及两个报警同时触发时的优先级。先用 Proteus 的虚拟探针精确测量电位器在报警瞬间的输出电压记录对应的 ADC 值比对程序中的阈值宏是否匹配。这个数据可以直接做成答辩时的测量表格。滴速报警的验证手法建议按递进顺序演示。第一步把信号发生器频率设为 1HzLCD 显示 60 滴/分钟第二步将频率调到 2.2Hz等 1 秒窗口刷新后蜂鸣器动作第三步把频率降到 0.3Hz 以下触发低速报警。三步展示简洁有力能说明系统同时具备上限和下限两种保护能力。还有一个经常会问到的细节仿真和实物的差异如何解释。由于 DSN 是 Proteus 仿真工程答辩评委可能会问如果做成实物哪些地方需要改。回答要点是电位器会替换成光电传感器接 INT0ADC0832 的输入改为液位传感器的电压输出其余控制逻辑无需改动。这个回答既说明你理解了仿真和实物的映射关系也展示了系统具备迁移到真实硬件的可行性。最后检查一个容易被忽视的硬件细节蜂鸣器驱动引脚在仿真里可以直接接 IO 口但实物电路中必须加三极管放大电流并接续流二极管否则蜂鸣器断电瞬间反电动势会打坏单片机引脚。如果看完这些验证流程还有不通过的情况比如 ADC 读数阶梯跳变优先级不够或者滴速显示不稳定优先检查 Proteus 中信号发生器与单片机是否共地以及定时器重装初值时是否被中断抢先打断——把TH0 0x4C; TL0 0x00;两条语句之间的中断关闭是效率最高的一种修复方式。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价