收藏和点赞,您的关注是我创作的动力
概要
本课题是研究如何使自动化设备与静脉输液完美结合在一起的方法,本论文论述了如何用AT89SC51单片机以及多种传感器协同合作来实现自动化输液系统的。通过测速模块测出药液的滴速,通过红外感应模块反馈给单片机,继续向下传导信号来控制滴速保持稳定。通过液面检测传感器来反映出瓶中剩余的药液量,当到达起始时设定的警戒位置时发出警报并亮起红灯来提醒医护人员。这个系统操作简洁、上手较快、具有报警功能并且方便集中控制,在现代医疗事业具有较大意义,推动了自动化的智能医疗事业的发展, 有利于提高医护质量。
本项目总体实现了使用红外线感应模块来感应到液体的滴速,可以自行调节滴速。并可在护士站直接显示出瓶中剩余液体量与剩余时间,使护士可以实时了解输液情况。当瓶中的剩余量到达警戒值时发出警报并亮起红灯来提醒进行更换或拔除。本项目的整体设计对医院输液系统达成自动化做出巨大贡献。
关键词:51单片机;医院输液系统;输液监控系统。
一、系统方案设计与论证
1.1系统硬件设计方案
输液器控制系统大致可分为以下几部分:电机系统、液位检测、剩余时间计算、滴速测量、键盘显示。结构图如下。
图1.1总体结构框图
1.2点滴速度测量电路方案的选择及论证
下行速度的测量在整个设计中起着重要的作用,它不仅是系统的基础,也是系统的最终回归点,根据当前市场使用的设计方法和电子控制原理,具有以下方案:
方案一:使用反射式红外光电传感器。反射式红外传感器放在输液袋的一端。当它掉落时,接收器会利用它的反射式红外线追踪功能。但因为水滴大小以及外表形状的差异,有时会导致反射信号不稳定,上下振动会发生,从而产生强烈的干扰。
方案二:在红外线软管处测量输注速度的基本原理是防止接收管在发射和产生高电平脉冲时接收红外光束。为了提高抗干扰能力,可以使用两对红外传感器进行接收和传输。而不是像场景1中那样只使用其中一个传感器在反射模式下工作。红外传感器体积小,重量轻,易于安装在跌落箱上;同时,它不需要复杂的辅助电路,电路非常简单,性能也相对稳定。现代红外传感器生产实践中发挥了巨大作用。
因为难以通过使用反射型红外传感器和对面的红外传感器来判断水的流速,尽管水流相对于红外而言相对较弱,但它比反射性要强。与其他红外线传感器相比,它可以更敏感地感知流速。因此,这个方案很容易实现,使用第二种方法来测量液滴下落速度更简单方便。
1.4通过电机控制滴速电路的方案论证
1.4.1电机控制滴速的方案设计
方案一:通过调整滴瓶高度h。根据滴瓶高度h与滴瓶速度的关系,发动机驱动滴瓶升高或降低以改变滴瓶高度h,从而调整速度。这种方法的原理简单易行,大多数设计者都采用这种方法。因此,我们需要通过实验来粗略地测量与相应高度相对应的水滴速度,并记下它存在于单片机中,然后直接对其进行调整。在滴斗处用红外系统来测量水滴的速度。模拟示意图如图1.2。
方案二:与人工输液相同,下降速度是通过控制木材的结来控制的,这是普遍接受的,但下降速度夹的特性决定了它只适合于液体下落速度的大幅度不均匀调整,当涉及微调时很难控制,不易实现。综上所述选择方案一。
图1.2 输液模拟示意图
1.4.2控制用电动机及驱动的选择与比较
方案一:采用直流电机
当直流电动机起动时,失电后的惯性非常大。在停止之前它将旋转一定角度。转矩小,没有锁定功能。如果必须在一个特定位置停止,其算法很复杂。
方案二:采用步进电机
当步进电机发出脉冲信号时,速度与脉冲频率成正比。步进电机由单片机控制。控制信号是数字的,不需要数字/模拟转换。它具有快速启动/停止功能,可以快速启动或停止。延迟时间短,位置准确,精度高,运行性能强。综合考虑,选用步进电机。
二、输液系统各模块的硬件设计
主要介绍了电机模块、电源模块、声音报警模块以及步进电机的工作原理,详细介绍了如何串联各部分工作单位进行工作,使该项目完整运行。主要结构框图如图2.1所示。
图2.1 结构框图
病床端结构框图如图2.2所示。
图2.2病床端框图
护士站端机构框图如图2.3所示。
图2.3护士站端结构框图
三、软件设计
实物
附录1 原理图
附录2 源程序清单
#include "lcd1602.h"
#include "eepom52.h"
#include "nrf24l01.h"
sbit buzzer = P1^7;//蜂鸣器
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit key3 = P2^2;
sbit Reduc = P2^1; //减
sbit Add = P2^0; //加
sbit Mode = P2^2; //设置
static int step_index; //步进索引数,值为0-7
static bit turn; //步进电机转动方向
static bit stop_flag; //步进电机停止标志
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
void gorun(void)
{
if (stop_flag==1)
{
S1 = 0;
S2 = 0;
S3 = 0;
S4 = 0;
return;
}
switch(step_index)
{
case 0: //0
S1 = 1;
S2 = 0;
S3 = 0;
S4 = 0;
break;
case 1: //0、1
S1 = 1;
S2 = 1;
S3 = 0;
S4 = 0;
break;
case 2: //1
S1 = 0;
S2 = 1;
S3 = 0;
S4 = 0;
break;
case 3: //1、2
S1 = 0;
S2 = 1;
S3 = 1;
S4 = 0;
break;
case 4: //2
S1 = 0;
S2 = 0;
S3 = 1;
S4 = 0;
break;
case 5: //2、3
S1 = 0;
S2 = 0;
S3 = 1;
S4 = 1;
break;
case 6: //3
S1 = 0;
S2 = 0;
S3 = 0;
S4 = 1;
break;
case 7: //3、0
S1 = 1;
S2 = 0;
S3 = 0;
S4 = 1;
break;
}
if (turn==0)
{
step_index++;
if(step_index>7)
step_index=0;
}
else
{
step_index--;
if(step_index<0)
step_index=7;
}
}
uint time10ms=0,time1s=0;
uint v=0;
uint dishu=0;
/**********************
** 速度检测处理部分
***********************/
void int0_init(void)
{
IT0=1; //下降沿触发
EX0=1; //中断标志位置1
EA=1; //打开总中断
}
void int0() interrupt 0
{
EX0=0;
TR1=1;
if(time10ms>50)
{
dishu++;
v=60000/time10ms;
if(v>2000)v=0;
time10ms=0;
}
EX0=1;
}
void Timer1_init(void)
{
TMOD&=0X0F;
TMOD|=0X10; //定时器0工作于方式1
TH1=(65536-10000)/256