基于单片机的医院输液系统设计

摘 要

随着自动化控制的不断发展,为了使医院工作人员更加轻松的工作,并且保证工作人员的工作效率,医院如何引进自动化设备作为临床医疗这个话题已经成为医疗事业的重点。静脉输液作为现代医疗的一种很常规的医疗手段,通过使药液直接进入到人体的静脉血液中直接起到治疗作用。本论文所阐述的医院输液系统将会对医疗事业有很大的帮助。
本课题是研究如何使自动化设备与静脉输液完美结合在一起的方法,本论文论述了如何用AT89SC51单片机以及多种传感器协同合作来实现自动化输液系统的。通过测速模块测出药液的滴速,通过红外感应模块反馈给单片机,继续向下传导信号来控制滴速保持稳定。通过液面检测传感器来反映出瓶中剩余的药液量,当到达起始时设定的警戒位置时发出警报并亮起红灯来提醒医护人员。这个系统操作简洁、上手较快、具有报警功能并且方便集中控制,在现代医疗事业具有较大意义,推动了自动化的智能医疗事业的发展, 有利于提高医护质量。
本项目总体实现了使用红外线感应模块来感应到液体的滴速,可以自行调节滴速。并可在护士站直接显示出瓶中剩余液体量与剩余时间,使护士可以实时了解输液情况。当瓶中的剩余量到达警戒值时发出警报并亮起红灯来提醒进行更换或拔除。本项目的整体设计对医院输液系统达成自动化做出巨大贡献。

关键词:51单片机;医院输液系统;输液监控系统。

1系统方案设计与论证

1.1系统硬件设计方案
输液器控制系统大致可分为以下几部分:电机系统、液位检测、剩余时间计算、滴速测量、键盘显示。结构图如下。
在这里插入图片描述

图1.1总体结构框图

2输液系统各模块的硬件设计

本章节主要介绍了电机模块、电源模块、声音报警模块以及步进电机的工作原理,详细介绍了如何串联各部分工作单位进行工作,使该项目完整运行。主要结构框图如图2.1所示。
在这里插入图片描述

图2.1 结构框图
病床端结构框图如图2.2所示。
在这里插入图片描述

图2.2病床端框图

护士站端机构框图如图2.3所示。
在这里插入图片描述

图2.3护士站端结构框图

2.2数据采集模块
接管部分采用红外传感器技术检测输液瓶中的药液滴落速度,并如图2.5所示。比较基板LM311的阈值电压可调,可提供0.8V到5V的电压,以适应不同的环境。当没有通过时接收器管显示为短截,VI输出水平产生高于比较器阈值电压V的上升边缘,比较器向单片机发出高电平脉冲,触发单片机进行计数,达到单位时间计数的目的。如图2.5所示。
在这里插入图片描述

图2.5数据采集装置
如图2.6所示,输液瓶中无液滴时,光子晶体接收最大光照并产生最大光曲线,当液滴由于光学特性而下降时,光束会相互发散,并且敏感管上的光程会减少光程。由于不同类型的药液(透明,半透明和不透明)液滴的光学特性不同,只要检测到光电晶体管的输出电流脉冲,就可以检测液滴是否通过。
在这里插入图片描述

 图2.6 采集装置结构图

2.3电源模块
监视系统可以由电池或交流电供电。在输液器正常时,电池的功率会及时影响警报。由于单个微数据和显示器都需要5V左右的电源,所以当我们制作电路板时,我们使用备用插槽提供5V电源的方式。与监控计算机相连的电路由计算机驱动。单片机和RS-485接口需要5V电源。
2.4声报警模块
将接口连接到单芯片数据的P1.0,并根据患者输液前的情况设置输液速度。当输液速度低于10滴/分钟或高于70滴/分钟时,单个芯片发出信号使P1.0产生高电平,从而触发报警装置,门铃会发出声音。如果有人按报警按钮,I/ O端口也会产生高电平,从而 关闭输液器s组以确保病人的安全。否则,当速度设置为x液滴/分钟时,如果下降少于5/20ml,MCU还会产生一个断路器报警。
2.5复位电路
系统使用手动重置。按下两个机械周期中RST末端产生的高电位的复位键,然后复位系统,图2.8所示。
在这里插入图片描述

图2.8复位电路

2.6.3显示模块电路设计
如图, P0端口1至AT89SC51用作数据线,P1.2、P1.1和P1.0分别用作LCD的a、R / W和RS。如果芯片标记信号是由下降边缘触发的,则R / W为读写信号,RS为寄存器标记信号,如图2.11所示。

在这里插入图片描述

图2.11显示模块电路图
2.7键控模块
根据功能要求,输液器的中央控制模块主要用于参数切换,在使用前可设置液滴,输液过程中可随时暂停,输液套件可随时启动。为了提高安全,当电源过快或因异常情况而中断时,也有报警装置。所有这一切都需要四个按键。重置一个按键,病人的紧急呼叫占有一个按键。可以通过增加和减少来设定速度。首先,在内部设定一个初始值,然后通过增加和减少来改变它按下相应按键时,键盘电路会将相应的I/ O端口从高电平到低低电平。目前,SCM系统监视P1端口的相应级别更改并执行相应的子程序。此应用程序的子例程是从P2端口发送的。四个二进制代码将驱动NIX管道作为CC4511解码器的输入信号。
在这里插入图片描述

图2.12键盘电路
2.8通信模块设计
通信接口标准有两种形式:RS-232C和RS-4885。根据RS-232C标准,在没有调制解调器的情况下,符号失真小于4%,接口驱动程序负载容量小于2500pf,本地数据终端与数据通信设备之间的最大距离为50米(15.24m)实际应用中的最大距离大于此值,这是因为实际应用中允许的符号失真远远超过4%,但为了改善RS-232C的缺点,例如低传输速率、短距离以及信号在接口上的易交叉性,美国电子工业由于只有一个驾驶员可以在RS-485标准下同时处理同一对信号线,因此只有一个驾驶员可以在同一对信号线上工作。根据标准,总线系统中的所有驾驶员都由激活端进行检查,并且系统中一次只能有一个发射器允许使用。电平转换电路如图2.13所示。

在这里插入图片描述

图2.13电平转换电路

3系统软件及框图设计

主从站设计是指护理室(从站)与病房(主站)之间通过通信进行控制和信息反馈,因此,这是输注监控系统设计的关键,其主从站方案应包括对各部门巡逻人员是否完全接收到主从站的信息以及是否进行交流的评估。程序设计框图如图3.1所示。
在这里插入图片描述

图3.1 主站程序框图

应当在从站的程序设计中计算滴速,以防止患者因滴速太快或太慢而引起输血不适,并且应通过控制电动机来控制液瓶的液位。为了达到加快或减慢滴速的目的;同时,病房中的从机还应具有剩余时间检测,液位警告,时间测量和报警功能。因此,也有相应的程序框图设计,如图3.2所示。

在这里插入图片描述

图3.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_flag1)
{
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; //定时器T0高8位重新赋初值
TL1=(65536-10000)%256; //定时器T0低8位重新赋初值 //10MS
ET1=1; //打开定时器0
TR1=0; //启动定时器0
EA=1; //开总中断
}
void Time1(void) interrupt 3
{
TH1=(65536-10000)/256; //定时器T0高8位重新赋初值
TL1=(65536-10000)%256; //定时器T0低8位重新赋初值
time10ms++;
time1s++;
if(time10ms>800){v=time10ms=0;TR1=0;}
}
void main(void)
{
bit abfsds=0;
uchar bingchuanghao=1;
bit wtwt=0;
uint bs=0,ds=0;
uchar yw2=0;

bit wq=0,we=0,wq1=0,we1=0;
uint time=0,gs;
uint as=0,vl=500,lh=3000;
uchar TxBuf[12];//无线模块发射数组
uint L=0;
uchar ws1=1,ws2=1;
uchar disp1[16]={"v:00.00ml/min 01"};
uchar disp2[16]={"L:000.00ml 500ml"};

uchar Mode_project=1,Mode_flag=1,Mode_count=0;//设置变量

uint buzzer_flag=0,buzzer_count=0,buzzer_time=45;//蜂鸣器报警变量

//buzzer=0;

int0_init();//外部中断初始化
Timer1_init();//定时器初始化

LCD_Init();//LCD初始化
//检测无线模块是否存在
MOSI=0;
while(NRF24L01_Check())
{
	WriteChar(1,0,16,"  NO  NRF24L01  ");				 
	delayms(500);
	WriteChar(1,0,16,"                ");				 
	delayms(500); 
}
init_NRF24L01();//无线模块初始化

dishu=0;

/***开机把数据从单片机内部eepom中读出来***/
if(byte_read(0x2050)!=1)
{		
	SectorErase(0x2000);
	byte_write(0x2000,vl/255);
	byte_write(0x2001,vl%255);

	byte_write(0x2002,lh/255);
	byte_write(0x2003,lh%255);

	byte_write(0x2004,bingchuanghao);

	byte_write(0x2050,1);		
}
if(byte_read(0x2050)==1)
{
	vl=byte_read(0x2000)*255+byte_read(0x2001);
	lh=byte_read(0x2002)*255+byte_read(0x2003);
	bingchuanghao=byte_read(0x2004);
}

while(1)
{	 
	//切换总量
	if(!key1 && !wq1)
	{
		wq1=1;
		we1=~we1;
		if(!we1)//500
		{			
			ws2=1;
			dishu=0;
			disp2[11]='5';
			disp2[12]='0';	
		}
		else//250
		{
			ws2=2;
			dishu=0;
			disp2[11]='2';
			disp2[12]='5';	
		}
	}
	if(key1 && wq1)
	{
		wq1=0;
	}


	/****10秒没有液滴报警****/
	if(v>100 && !bs)
	{
		bs=1;	
	}
	if(bs && v==0)
	{
		if(++ds>300)yw2=1;
	}
	if(bs && v!=0){ds=0;yw2=0;}

	//夹死管子
	if(yw2 && !wtwt)
	{
		wtwt=1;
		
		buzzer=1;
		
		turn = 0;//反转
		stop_flag=0;
		gs=2000;
		while(gs--)
		{
			gorun();			
			delay11us(100);
		}
		stop_flag=1;
		gorun();
	}
	//松开管子
	if(!yw2 && wtwt)
	{
		wtwt=0;
		
		buzzer=1;
		
		turn = 1;//正转
		stop_flag=0;
		gs=2000;
		while(gs--)
		{
			gorun();			
			delay11us(100);
		}
		stop_flag=1;
		gorun();
	}
	//手动报警
	if(!key2 && !wq)
	{
		wq=1;
		we=~we;
	}
	
	if(key2 && wq)
	{
		wq=0;
	}
		
	

	//步进电机自动调节
	if(v>=0 && v<100)
	{
		stop_flag=1;
		gorun();
	}
	else 
	{
		if(++time>200)
		{
			time=0;
			if((v>vl-200)&&(v<vl+200))
			{
				stop_flag=1;
				gorun();	
				
				abfsds=1;//速度正常范围标志位置1
			}
			else if(v>vl+200)
			{
				turn = 0;//反转
				stop_flag=0;
				gs=100;
				while(gs--)
				{
					gorun();			
					delay11us(100);
				}
				stop_flag=1;
				gorun();
			}
			else if(v<vl-200)
			{
				turn = 1;//正转
				stop_flag=0;
				gs=100;
				while(gs--)
				{
					gorun();			
					delay11us(100);
				}
				stop_flag=1;
				gorun();	
			}
		}
	}

	disp1[14]=bingchuanghao/10%10+0x30;
	disp1[15]=bingchuanghao%10+0x30;


	disp1[2]=v/1000%10+0x30;
	disp1[3]=v/100%10+0x30;
	disp1[5]=v/10%10+0x30;
	disp1[6]=v%10+0x30;

	if(ws1==1)L=dishu*10/1.0;

// else if(ws12)L=dishu*10/1.5;
// else if(ws1
3)L=dishu*10/2.0;

	if(ws2==1)L=50000-L;
	else if(ws2==2)L=25000-L;

// else if(ws2==3)L=10000-L;

	disp2[2]=L/10000%10+0x30;
	disp2[3]=L/1000%10+0x30;
	disp2[4]=L/100%10+0x30;
	disp2[6]=L/10%10+0x30;		
	disp2[7]=L%10+0x30;

	/****无线发送****/
	TxBuf[2]=v/255;
	TxBuf[3]=v%255;
	TxBuf[4]=L/255;
	TxBuf[5]=L%255;
	TxBuf[6]=ws2;
	TxBuf[7]=1;//从机地址
	TxBuf[8]=buzzer_flag;
	TxBuf[9]=bingchuanghao;
	//无线发射		
	nRF24L01_TxPacket(TxBuf);
	delayms(10);
	/****剩余量少于设定值或10秒没有检测到液滴或手动报警或速度不在上下限范围内报警****/
	if((L<lh || we || yw2)||(abfsds && (v<vl-300)||(v>vl+300)))
	{
		buzzer_flag=1;
	}
	else
	{
		buzzer_flag=0;
		buzzer=1;
	}		
	/*******蜂鸣器报警********/
	buzzer_count++;if(buzzer_count>buzzer_time*10)buzzer_count=buzzer_time+1;
	if(buzzer_count%buzzer_time==0 && buzzer_flag)
	{
		buzzer=~buzzer;//蜂鸣器取反发出声音报警
		if(!buzzer)LCD_Init();
	}

	//按下设置键,进入设置页面
	if(Mode==0 && Mode_flag)
	{	 
		buzzer=1;
		as=0;
		WriteCOMDATA(0x0F,0);
		delayms(100);			
		if(Mode==0)
		{	
			while(Mode==0);			
			Mode_flag=0;
			Mode_project=1;
			//设置页面显示内容
			WriteChar(1,0,16,"Lh:000.0 ml    01");				 
			WriteChar(2,0,16,"  v:00.00ml/min ");


			WriteCOMDATA(0x83,0);
			WriteCOMDATA(lh/10000%10+0x30,1);
			WriteCOMDATA(lh/1000%10+0x30,1);
			WriteCOMDATA(lh/10%10+0x30,1);
			WriteCOMDATA('.',1);
			WriteCOMDATA(lh/10%10+0x30,1);				
			//WriteCOMDATA(lh%10+0x30,1);


			WriteCOMDATA(0x8E,0);
			WriteCOMDATA(bingchuanghao/10%10+0x30,1);
			WriteCOMDATA(bingchuanghao%10+0x30,1);

			WriteCOMDATA(0xC4,0);
			WriteCOMDATA(vl/1000%10+0x30,1);
			WriteCOMDATA(vl/100%10+0x30,1);
			WriteCOMDATA('.',1);
			WriteCOMDATA(vl/10%10+0x30,1);				
			WriteCOMDATA(vl%10+0x30,1);
			while(Mode==0);
			while(1)		  
			{	
				switch(Mode_project)
				{	
					case 1:
						WriteCOMDATA(0x83,0);
						WriteCOMDATA(lh/10000%10+0x30,1);
						WriteCOMDATA(lh/1000%10+0x30,1);
						WriteCOMDATA(lh/100%10+0x30,1);
						WriteCOMDATA('.',1);
						WriteCOMDATA(lh/10%10+0x30,1);				
						//WriteCOMDATA(lh%10+0x30,1);
						WriteCOMDATA(0x87,0);
					break;
					case 2:
						WriteCOMDATA(0x8E,0);
						WriteCOMDATA(bingchuanghao/10%10+0x30,1);				
						WriteCOMDATA(bingchuanghao%10+0x30,1);
						WriteCOMDATA(0x8F,0);
					break;			                                						
					case 3:
						WriteCOMDATA(0xC4,0);
						WriteCOMDATA(vl/1000%10+0x30,1);
						WriteCOMDATA(vl/100%10+0x30,1);
						WriteCOMDATA('.',1);
						WriteCOMDATA(vl/10%10+0x30,1);							
						WriteCOMDATA(vl%10+0x30,1);
						WriteCOMDATA(0xC8,0);
					break;						
				}
				delayms(400);
				//按下加键,对设定目标加
				if(Add==0)
				{
					delayms(400);
					switch(Mode_project)
					{
						case 1:lh+=50;break;
						case 2:bingchuanghao+=1;if(bingchuanghao>=99)bingchuanghao=99;break;
						case 3:vl+=1;break;							
					}		
				}
				//按下减键,对设定目标减
				if(Reduc==0)
				{
					delayms(400);
					switch(Mode_project)
					{
						case 1:lh-=50;break;
						case 2:bingchuanghao-=1;if(bingchuanghao<=1)bingchuanghao=1;break;
						case 3:vl-=1;break;															
					}		
				}
				//短按设置键,切换设定目标,长按设置键2S,则退出设置页面
				if(Mode==0)
				{
					delayms(600);
					while(Mode==0)
					{
						delayms(600);
						Mode_count++;
						if(Mode_count>6)
						{
							WriteCOMDATA(0x0C,0);
							delayms(100);
							WriteChar(1,0,16,disp1);  //第一行显示内容
							WriteChar(2,0,16,disp2); //第二行显示内容
						}
					}
					if(Mode_count>6)
					{
						Mode_count=0;

						SectorErase(0x2000);
						byte_write(0x2000,vl/255);
						byte_write(0x2001,vl%255);
						byte_write(0x2002,lh/255);
						byte_write(0x2003,lh%255);
						byte_write(0x2004,bingchuanghao);
						byte_write(0x2050,1);
						break;
					}
					else Mode_count=0; 
					Mode_project++;
					if(Mode_project>3)Mode_project=1;
				}
			}	
		}
	}					
	/********液晶显示********/		   			 
	WriteChar(1,0,16,disp1);
	WriteChar(2,0,16,disp2);
	if(Mode_flag==0){Mode_count++;if(Mode_count>20){Mode_count=0;Mode_flag=1;}}
}

}


## 4系统设计结果分析


4.2电路焊接
本项目采用手工焊接的方法进行焊接,在焊接前首先对各元器件进行检查,在确认其完好后才能够进行焊接,否则会导致系统无法运行。然后开始在电路板按照原理图上放置各元器件。焊接时连续时间不得超过10秒。焊接结果如下图4.2。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/52e1e49739cf43969cf01097183c5419.png)


图4.2电路板焊接
4.3实物调节
当模拟开始时,表示病人已经开始输液,这时病床端以及护士站端开始显示瓶内剩余的液量,以及此时液体流速,并且显示瓶中剩余药量还需要多久可以滴完。确保护士站端可以保证实时监控病人的输液状况。显示情况如图4.2所示。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/42c7f79d7f7e44efb7c026f5d06b37cc.png)

图4.2起始状态显示图
在输液过程中病人可以自行观察瓶中剩余的液量来进行监控,但为了防止病人有时注意力没有放在观察瓶内剩余量上或者病人入睡导致输液事故,在瓶内剩余量不足时,将会响起警报亮起红灯来提示护士站端前来给病人进行更换或者拔出输液器。显示方式如图4.3所示。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/afb318c3b0c9457a988654e032a8518b.png)

图4.3 报警显示图

 

## 结 论

该系统已完成了液滴桶上液滴速度的检测,并设计了可动态显示液滴速度的液晶显示装置。液滴速度可以通过改变高度来控制。可通过键盘设置和显示喝酒速度。设定范围为50-90,误差在规定范围内。当高度达到报警值时,可发出报警信号,并可手动触发报警模式。
通过模拟结果可得出能够满足的要求有以下几点:
(1)相显示液滴滴速、剩余输液时间;
(2)对输液速度可以自动控制;
(3)将病床端与护士站端相连接,使输液情况可以及时传输到护士站端,便于护士观察。
(4)当剩余的输液时间达到一定时间(5分钟)时,可以通过相应的设备触发自动警报或输液情况。
    此设计还完全分析并确定了输液系统设计的关键和难点,通过理论分析、论证判定这些辩证思想达到最佳设计方案。
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值