基于51单片机的便携式输液点滴控制报警器

1.简介
基于单片机输液点滴控制报警器组成。该系统主要由光电传感器检测电路、键盘、数码管显示、报警提示电路、液滴流速监测电路、电机驱动电路等组成。利用光电感器测量出液滴流速,并将将信息返回给单片机,单片机对流速信号与测速型号进行分析和处理,并让其显示数码管上,从而实现对输液器的监测与控制。

2.硬件设计
本例程的硬件主要由7部分组成,分别为单片机的最小系统,4位数码管显示电路、光电测速电路、步进驱动电路、按键电路、蜂鸣器报警电路、电源模块等,其结构框图如下所示:
基于51单片机的便携式输液点滴控制报警器_第1张图片
(1)光电测速电路
本次设计将采用光电传感器,利用传感器对液滴流速信号检测,再利用外围电路实现计数。当一个液滴流过光电传感器时,由于液滴的遮挡,导致光电传感器中的三级管截止,光电传感器输出为高,所以实现对输液速度的检测就是完成对两个高电平时间间隔的计时。电路图如图:
基于51单片机的便携式输液点滴控制报警器_第2张图片
(2)步进电机驱动电路
步进电机驱动电路采用了ULN2003达林顿管阵列芯片作为步进电机驱动电路,其主要功能是增强单片机控制引脚的电流驱动能力,以实现控制步进电机。
基于51单片机的便携式输液点滴控制报警器_第3张图片
(3)按键电路
本次设计共设置了3个独立式的按键,主要的功能设置键、增加键和减少键。电路如图:
基于51单片机的便携式输液点滴控制报警器_第4张图片
(4)硬件原理图
基于51单片机的便携式输液点滴控制报警器_第5张图片
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原理图 下载:关注公众号,首页回复“输液控制报警器”获取资料
在这里插入图片描述

你可能感兴趣的:(单片机应用)