智能输液检测器的设计.docx
- 文档编号:10238110
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:30
- 大小:228.44KB
智能输液检测器的设计.docx
《智能输液检测器的设计.docx》由会员分享,可在线阅读,更多相关《智能输液检测器的设计.docx(30页珍藏版)》请在冰豆网上搜索。
智能输液检测器的设计
智能输液检测器的设计
组员:
廖晨歌刘利郭祯李想王莞舒
摘要:
本文设计的是一种将光电传感技术和单片机智能控制技术相结合的智能输液监测控制系统。
该系统是以C8051F020单片机为核心,利用红外对管实现监测输液瓶液面高度和点滴速度的监测,液面高度和点滴速度通过八位数码管显示,在液面低于警戒值时自动报警,在点滴速度与预设速度不符时实现流速调节。
速度调节部分利用步进电机和遥控器实现,可以实现手动控制。
关键词:
C8051F020单片机;红外对管;液面监测;自动报警;遥控调控
1.项目研究意义和研究现状:
静脉药物注射是临床医学中的主要治疗手段之一,在输液过程中,由于种种需要护士需要及时为病人停止输液或更换药品,为减少护士的巡回工作量,同时提升对每个病人尤其是加强对老人、儿童、重病患等病人的看护条件,避免因换药、拔针不及时造成的危险情况,降低医疗事故的发生率,出现了利用单片机和光电传感技术实现的智能检测装置。
我们基于实际情况对该装置进行了研究和改进,在实现了输液液面的即时监控和点滴速度的监测显示和阈值报警的同时,改进了监测程序设计思路,并设计添加了遥控器控制的电机模块,实现对输液速度更加方便有效的调控,从而更加方便了行动不便者的使用。
2.研究内容与预期目标
2.1研究内容
本项目是围绕C8051F020单片机为核心展开设计的,红外对管作为探测装置在整个系统中起到了重要的作用。
该系统包含单片机控制部分、红外监测部分、数码管显示部分、自动报警部分、电机机械调控部分以及红外遥控器和按键控制部分等。
将红外监测的硬件部分安装在输液瓶上,可以实现对输液实时情况的监测;将电机带动的机械调控部分安装在调液装置上,可以实现自动/手动并行的输液速度调整功能。
该系统工作时,红外检测模块对液面高度以及点滴速度进行探测,并将检测到的信息以电平信号的形式体现于监测电路,通过适当的编程设计,由软件实现对于检测结果的处理和判断,并且在数码管显示部分对液面高度和点滴速度予以显示。
当液面高度低于警戒高度时控制蜂鸣器和LED灯实现声光报警;当判断出点滴速度与预设速度不符时,进行反馈式的自动控制调节。
红外遥控器和按键部分可以实现点滴速度预设,也可以实现电机模块的手动控制从而对点滴速度在自动调控以外亦能实现手动调控。
2.2预期目标
基本目标:
(1)监测模块可以监测到液面的变化,以及点滴速度的快慢;
(2)显示模块可以实现液面高度、点滴速度的实时显示,报警装置可实现在液面过低时的报警;
(3)电机模块可以实现对输液速度的机械反馈调控;
(4)控制模块可以实现对信号的采集、计算以及判断,整合各个模块的功能实现自动控制;
拓展目标:
(1)在原控制模块的基础上添加按键,实现更方便精确的控制;
(2)添加门铃报警装置,利用类似无线门铃的发射和接收装置实现通知值班人员的作用;
3.总体结构设计
智能输液监测器由单片机构成主控部分进行主要的信息处理,接收外部操作时令形成的各种控制信号,并完成对于各种信息的计算判断,实现反馈控制。
总体电路设计框图如图一所示。
图一
智能输液监测器主要由单片机系统、电源、遥控器按键控制模块、液面高度检测模块、点滴速度监测模块、点滴速度机械调控模块(步进电机+ULN2003AG芯片)、数码管显示模块和自动报警模块等部分组成。
C8051F020单片机作为核心部件完成对外部检测信号的处理、判断以及对各模块的控制。
4.硬件设计
本设计使用了几个部分的硬件电路来完成各个模块功能的实现,在实现的过程中也尽力提高硬件电路的可靠性和稳定性,以确保整个电路达比较高的稳定性。
主要的电路包括红外监测电路、单片机控制电路、硬件驱动电路、数码管显示电路以及电机控制电路等。
4.1液面高度检测模块
本系统采用红外对管来完成,将接收管和发射管正对安装在输液瓶预定的警戒线位置,未到警戒液面时,由于液体对红外线有较强的吸收作用,接收管接收到的红外光信号较弱,红外接收管截止,输出低电平;到警戒液面时,接收管接收到的光强度变大,红外接收管导通,输出高电平,由此产生电平的跳变。
利用循环编程的方法对电平进行检测,监测到跳变后控制产生报警。
图二
4.2点滴速度监测模块
此部分采用红外光电开关来完成。
将接收管与发射管正对,固定在液滴下落处,无液滴落下时,接收管接收到的光线较强,输出电平为高电平,当有液滴落下时,下落的液滴对红外线有较强的漫反射、吸收和一定的散射作用,接收到的强度有较大的改变,导致输出电平为低电平。
依据产生的电平跳变可以检测到液体的滴落,利用循环编程对点滴速度进行检测。
图三
4.3数码管显示模块
点滴速度的设定与显示都是由数码管显示模块作为主要的交互界面来辅助来完成的。
本设计中直接利用了开发板上的数码管显示模块。
4.4自动报警模块
声光报警部分利用了开发板上的蜂鸣器和LED模块。
未到达警戒液面时,LED绿灯亮;到达警戒液面高度时,LED红灯亮,同时产生报警信号使得蜂鸣器报警。
实验设计后期我们添加了远程报警部分,利用了无线音乐门铃与继电器的配合,使得在产生声光报警的同时控制无线音乐门铃进行远程报警,拓展了盖自动报警模块的性能。
4.5点滴速度机械调控模块
机械调控模块利用了步进电机的转动实现对液滴速度的调控,由于单片机无法直接带动功率较大的步进电机,所以添加了uln2003驱动芯片。
其电路接线如下图所示:
图四
通过步进电机与调液滚轮的连接,当步进电机旋转时,调液滚轮的位置跟着改变,从而代替手动操作实现了液滴速度的调控。
4.6遥控器按键控制模块
利用遥控器上的按键实现对输液瓶规格以及点滴速度的设定,有按键按下时触发中断并判断键值,与显示模块相配合完成调控。
5.软件设计
5.1主程序编程设计
在整个系统的实现过程中,软件编程作为使得整个系统正常运行的重要保障起到了至关重要的作用。
为提高控制系统的可靠性、维护和编程效率,软件采用模块化结构,用模块化结构,用C语言编写,简洁明了。
在硬件的基础上,智能检测仪器的所有功能都是由软件控制实现的,通过软件编程可以实现系统的初始化、各部分实时监控以及报警、按键中断等功能。
根据系统的功能要求和硬件电路,设计出软件主流程图如下:
图五软件设计主流程框图
5.2中断程序编程设计
在软件编程中,同样考虑到电路中中断的使用。
在最初的设计思路中,对液面的检测以及点滴速度检测都是利用红外对管产生电平跳变引起外部中断触发的方式实现预期功能的,然而由于液滴持续时间较长,变化较为缓慢,使用中断方式会产生不断进入中断的现象导致程序卡死,不能完成预期的目标。
所以改用循环检测的方式进行检测,当完成循环检测后根据情况判断是否调用对应的处理程序,实现报警和反馈调节的目标功能。
外部中断被用来进行对遥控器按键的控制响应。
中断1和中断0的流程框图如下。
中断1辅助完成红外遥控器操作控制,当遥控器上进行按键操作时,单片机上产生外部中断,进入键值判断流程,并根据所判出的键值控制显示模块的显示内容。
中断0辅助完成键盘操作控制,当有按键输入时,同样先进入键值判断程序,然后根据判出键值,并根据设定值转换统一数据,调控整个系统。
图六中断1图七中断0
5.3整体调试
1.调试设备
根据调试系统功能的需要,准备输液瓶等调试设备进行实际调试。
2.硬件调试
先对各个模块部分进行分部调试,使每个部件都能正常工作。
然后对整体进行调试,但是在调试过程中出现了一些问题,系统整体工作存在一些偏差。
之后通过对各部分的微调协调各个部件之间的功能得以解决,最终系统可以进行正常工作。
5.4软件的调试
程序清单如下:
(1)主程序,程序主循环体main
#include
#include
#include
/*************************************************************************/
主循环体:
/*************************************************************************/
voidmain(void)//主函数
{
unsignedinti;
//WDTRST=0x1E;
//WDTRST=0xE1;//喂狗初始化
LEDG;
WDTCN=0XDE;//禁止看门狗定时器
WDTCN=0XAD;
Display_Int();
Check_Init();
//IRC_Init();
LEDG;
LEDY;
while
(1)
{
//WDTRST=0x1E;
//WDTRST=0xE1;//喂狗指令
Display();
Check_End();
for(i=0;i<50;i++)
{
Display();
Check_Drop();
}
Motor_Move();
Display();
}
}
/*************************************************************************/
(2)检测模块程序设计check
/*************************************************************************/
/************************红外对管检测************************/
/************************液面高度、液滴速度************************/
/************************C语言************************/
/*************************************************************************/
#include
#include
#include
voidCheck_Init(void)//系统初始化
{
//sec=0;
t_250us=0;
t_20ms=0;
TMOD&=0xF0;//防止定时器工作方式设定冲突
TMOD|=0x02;//定时器0工作在方式2
TH0=0x06;//对TH0TL0赋值
TL0=0x06;
ET0=1;//使能定时器1ET0=1;
IT0=0;//INT0低电平触发
EX0=1;//使能INT0EX0=1;
EA=1;
}
voidTime1S(void)interrupt1//定时中断服务函数
{
t_250us++;//每过250ustt_250ms加一
if(t_250us==80)//计满80次(80*250微秒=0.02毫秒)时
{
t_250us=0;
t_20ms++;
/*if(t_20ms&&!
(t_20ms%50))
{
sec++;
if(sec==TMAX)//定时TMAX秒,超过时认为计时溢出
{
t_20ms=0;
sec=0;
TR0=0;//结束定时
TR0=1;
}
}
*/
}
}
voidChangeDisSpeed(void)//将disspeed转换成可显示的数组
{
unsignedchari,numn;
for(i=0,numn=DISSPEED;i<4;i++)
{
disnum[i]=numn%10;
numn=numn/10;
}
}
voidChangeTime(void)//将time转换成可显示的数组
{
unsignedcharmin,hour;
min=TIME%60;//转换为可显示的数组
disnum[4]=min%10;
disnum[5]=min/10;
hour=TIME/60;
disnum[6]=hour%10;
disnum[7]=hour/10;
}
voidCheck_Drop(void)
{
if(DROP==0)//如果DROP为1则证明有液滴经过
{
Display();//等待50毫秒躲过不稳定的状态
if(DROP==0)//再看LOW是否改变
{
TR0=0;//终止计时
LEDG;
DISSPEED=MIN/t_20ms;//转换成液滴速度disspeed,以“滴/分钟”为单位
t_20ms=0;
//sec=0;
TR0=1;//重新开始计时
TIME=15*VOL/DISSPEED;//通常15滴液滴为1ml,以分钟为单位
ChangeDisSpeed();//当前液滴disspeed转换为显示数组
ChangeTime();//当前剩余time转换为显示数组
Display();
while(DROP==0)
Display();//等待液滴落下
LEDG;
}
}
}
voidCheck_End(void)
{
if(LOW==0)//如果LOW为0则证明液面过低
{
Display();//等待50毫秒躲过检测不稳定的状态
if(LOW==0)
{//再看LOW是否改变
BUZ=0;
LEDR;
Display();
BUZ=1;
LEDR;
}
}
}
(3)数码管显示模块程序设计Display
/*******************************************************************/
/***********************数码管显示*************************/
/***********************键盘扫描*************************/
/***********************C语言*************************/
/*******************************************************************/
#include
#include
#include
voidSYSCLK_Init(void)
{
inti;//延时计数器
OSCXCN=0x67;//开启外部振荡器11.0592MHz晶体
for(i=0;i<256;i++);//等待振荡器启振
while(!
(OSCXCN&0x80));//等待晶体振荡器稳定
OSCICN=0x88;//选择外部振荡器为系统时钟源并允许丢失时钟检测//器
}
voidPORT_Init(void)
{
XBR0=0xaf;
XBR1=0x1f;
XBR2=0xc4;//使能交叉开关和弱上拉
P74OUT=0x00;//使能P4,P5,P6,P7为漏极开路
P3MDOUT|=0x08;//使能P3.3(蜂鸣器)推挽输出
P2MDOUT|=0x00;
}
voidDisplay_Int(void)
{
//WDTRST=0x1E;
//WDTRST=0xE1;//喂狗指令
SYSCLK_Init();
PORT_Init();
IT0=1;
EA=1;
EX0=1;
INT0=1;
P5=0xff;
P6=num[0];
P7=dbit[0];
changbit=1;
Display();
Display();
}
voidDisplay(void)//显示
{
unsignedchari,j;
//WDTRST=0x1E;
//WDTRST=0xE1;//喂狗指令
for(i=0;i<10;i++)
for(j=0;j<8;j++)
{
P7=dbit[j];
if(changbit)
P6=num[setnum[j]];
else
P6=num[disnum[j]];
Delay1mS(5);
}
}
voidChangeReSetspeed(void)//将显示的数组转换为SETSPEED值
{
unsignedchari;
unsignedintnumn=0;
for(i=3,SETSPEED=setnum[3];(i-1)>0;i--)//因为是无符号数,如果i>=0判断会出现恒成//立的死循环
{
SETSPEED=numn+setnum[i];
numn=SETSPEED*10;
}
}
voidChangeReVol(void)//将显示的数组转换为VOL值
{
unsignedchari;
unsignedintnumn=0;
for(i=7,VOL=setnum[7];i>3;i--)
{
VOL=numn+setnum[i];
numn=VOL*10;
}
}
voidInt0_ISR(void)interrupt0
{
Display();
if((P5&0x01)!
=0x01)
{
Display();
if(changbit)
{
setbit++;
if(setbit==8)setbit=0;
}
P7=dbit[setbit];
}
if((P5&0x02)!
=0x02)
{
Display();
if(changbit)
{
if(setbit==0)setbit=8;
setbit--;
}
P7=dbit[setbit];
}
if((P5&0x04)!
=0x04)
{
Display();
if(changbit)
{
setnum[setbit]++;
if(setnum[setbit]==10)setnum[setbit]=0;
}
P6=num[setnum[setbit]];
}
if((P5&0x08)!
=0x08)
{
Display();
if(changbit)
{
if(setnum[setbit]==0)setnum[setbit]=10;
setnum[setbit]--;
}
P6=num[setnum[setbit]];
}
if((P5&0x10)!
=0x10)
{
BUZ=0;
Display();
BUZ=1;
LEDY;
changbit=~changbit;
if(!
changbit)//如果切换回显示状态,则将设定值转换为//setspeed和vol
{
ChangeReSetspeed();
Display();
ChangeReVol();
Display();
}
}
Display();
}
(4)红外遥控器控制模块程序设计IRC
/***********************************************************************/
/************************************************/
/************************红外遥控器C语言程序************************/
/************************************************/
/***********************************************************************/
#include
#include
#include
voidIRC_Init(void)//系统初始化
{
IT1=1;//INT1负跳变触发
EA=1;
EX1=1;//使能INT1EX1=1;
IRIN=1;
}
voidDelay_840us(void)
{
TL1=-774;
TH1=((-774)>>8);
TR1=1;
while(!
TF1);
TF1=0;
TR1=0;
}
voidDelay_2400us(void)
{
TL1=-2212;
TH1=((-2212)>>8);
TR1=1;
while(!
TF1);
TF1=0;
TR1=0;
}
unsignedcharGetCode()//读码
{
unsignedcharn;
statictemp=0;
for(n=0;n<8;n++)
{
while(!
IRIN);
Delay_840us();
if(IRIN)//0
{
temp=(0x80|(temp>>1));
while(IRIN);
}
elsetemp=(0x00|(temp>>1));//1
}
returntemp;
}
voidChangeSetspeed(void)//将设定值转换为可显示的数组
{
unsignedchari,numn;
for(i=0,numn=SETSPEED;i<4&&numn;i++)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 输液 检测器 设计