1.简介
基于单片机输液点滴控制报警器组成。该系统主要由光电传感器检测电路、键盘、数码管显示、报警提示电路、液滴流速监测电路、电机驱动电路等组成。利用光电感器测量出液滴流速,并将将信息返回给单片机,单片机对流速信号与测速型号进行分析和处理,并让其显示数码管上,从而实现对输液器的监测与控制。
2.硬件设计
本例程的硬件主要由7部分组成,分别为单片机的最小系统,4位数码管显示电路、光电测速电路、步进驱动电路、按键电路、蜂鸣器报警电路、电源模块等,其结构框图如下所示:
(1)光电测速电路
本次设计将采用光电传感器,利用传感器对液滴流速信号检测,再利用外围电路实现计数。当一个液滴流过光电传感器时,由于液滴的遮挡,导致光电传感器中的三级管截止,光电传感器输出为高,所以实现对输液速度的检测就是完成对两个高电平时间间隔的计时。电路图如图:
(2)步进电机驱动电路
步进电机驱动电路采用了ULN2003达林顿管阵列芯片作为步进电机驱动电路,其主要功能是增强单片机控制引脚的电流驱动能力,以实现控制步进电机。
(3)按键电路
本次设计共设置了3个独立式的按键,主要的功能设置键、增加键和减少键。电路如图:
(4)硬件原理图
3.软件设计
程序设计部分主要包括主程序、输液测速函数、键盘扫描函数、数码管显示函数、及电机控制函数。定时器初始化函数完成对定时器初始化,流速信号采集函数完成对输液速度的采集和计算分析,键盘扫描函数则需要完成对电机转速控制,输液速度读取函数完成数据的换算,为电机的工作提供工作的依据。
由于程序代码较多,现只介绍部分代码。
(1)输液测速程序
void Int0() interrupt 0 //点滴检测部分,能触发中断,说明有点滴滴下
{
EX0 = 0; //开外部中断0
num1 = 0; //计数器1清零
beep = 1; //关闭蜂鸣器报警
speed ++; //点滴数目加1
EX0 = 1; //开外部中断0
delayms(1);
}
/******************************外部中断1 P3^3 **********************************************/
void Int1() interrupt 2 //液面检测部分
{
EX1 = 0; //开外部中断0
beep = 0; //如果触发外部中断,即检测脚为低电平,低于检测液面,蜂鸣器报警
EX1 = 1; //开外部中断0
}
/******************************定时器中断0**********************************************/
void T0_time() interrupt 1
{
TH0 = (65536-50000)/256; //装初值
TL0 = (65536-50000)%256;
num0 ++;
if(num0 == 100) //每隔5s测一次点滴数
{
num0 = 0; //计数器0清零
time_out = 1;
}
}
/******************************定时器1**********************************************/
void T1_time() interrupt 3
{
TH1 = (65536-50000)/256; //装初值
TL1 = (65536-50000)%256;
num1 ++;
if(num1 == 100) //若5s时间到,还未检测到点滴滴下
{
beep = 0; //蜂鸣器报警
}
}
void delayms(uint xms)
{
uint i,j;
for(i = xms;i > 0;i--)
for(j = 110;j > 0;j--);
}
(2)按键扫描程序
/****按键扫描******/
void keyscan()
{
if(k1==0)
{
delay(10);
if(k1==0)
{
yyp=0;
s1num++;
while(!k1); //等待按键释放
di();
switch(s1num)
{
case 1:break;
case 2:break;
case 3:if(s1num==3)s1num=0;yyp=1;
break;
}
}
}
if(s1num!=0)
{
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!k2); ///等待按键释放
di();
switch(s1num)
{
case 1: htemp++;
if(htemp==999)htemp=0;
hdisplay(htemp);
break;
case 2: ltemp++;
if(ltemp==999)ltemp=0;
ldisplay(ltemp);
break;
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!k3); //等待按键释放
di();
switch(s1num)
{
case 1: htemp--;
if(htemp==0)htemp=999;
hdisplay(htemp);
break;
case 2: ltemp--;
if(ltemp==0)ltemp=999;
ldisplay(ltemp);
break;
}
}
}
}
}
(3)主程序
void main()
{
init();
while(1)
{
keyscan();
if(s1num==1)hdisplay(htemp);
if(s1num==2)ldisplay(ltemp);
if(yyp)
{
baojing();
keyscan();
if(time_out == 1)
{
speed_tmp = speed * 12; //每分钟的点滴数目等于每5秒的数目乘以12
speed = 0;
time_out = 0;
}
display(speed_tmp);
}
}
}
源码+AD原理图 下载:关注公众号,首页回复“输液控制报警器”获取资料