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