基於51單片機的便攜式輸液點滴控制報警器

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原理圖 下載:關注公衆號,首頁回覆“輸液控制報警器”獲取資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章