一.硬件方案
利用超聲波傳輸中距離與時(shí)間的關(guān)系,采用8051單片機(jī)進(jìn)行控制及數(shù)據(jù)處理,設(shè)計(jì)出了能精確測(cè)量?jī)牲c(diǎn)間距離的超聲波液位檢測(cè)系統(tǒng)。并通過(guò)液位的高低開(kāi),通過(guò)控制繼電器,選擇注水或者放水。
主要由51單片機(jī)+HC-SR04超聲波傳感器+LCD1602液晶+水泵+按鍵+蜂鳴器+繼電器設(shè)計(jì)而成;如圖:
二.設(shè)計(jì)功能
(1)本設(shè)計(jì)中液晶顯示有4個(gè)字母,分別為
H------容器的最高水位設(shè)定值(不能高于實(shí)際高度)
L------容器的最低水位設(shè)定值
D-----容器實(shí)際高度(可以設(shè)置)
C-----容器內(nèi)液體的高度(在實(shí)際演示中,障礙物離探頭越近,液晶C顯示越大,因?yàn)檎系K物好比液面,離探頭近了說(shuō)明水位高了)
(2)如果容器實(shí)際高度D你設(shè)置為1米,那么C液體的高度最高能測(cè)到98cm,因?yàn)樘筋^的盲區(qū)在2cm左右。如果D設(shè)為2米,那么最高能測(cè)到1.98m。
(3)按鍵功能分別為:設(shè)置鍵 增加鍵 減小鍵 復(fù)位鍵。
(4)三個(gè)指示燈的分別功能為:紅色----超過(guò)設(shè)定的最高水位H;黃色-----低于設(shè)定的最低水位L;綠色----最高H和最低L中間。
(5)當(dāng)液位高于或者低于設(shè)置值,蜂鳴器報(bào)警;
(6)當(dāng)液位高于最高水位設(shè)定值,排水繼電器打開(kāi);當(dāng)液位低于最低水位設(shè)定值,注水繼電器打開(kāi);
三.設(shè)計(jì)原理圖
(1)原理圖主要采用AD軟件進(jìn)行設(shè)計(jì),如圖:
(2)PCB,如圖:
四.軟件設(shè)計(jì)
主程序源碼
/*********************************************************/
void main(void)
{
initIO(); //初始化IO端口
delay500ms(); //啟動(dòng)延時(shí),給器件進(jìn)入正常工作狀態(tài)留夠時(shí)間
initLCD1602(); //LCD初始化
putLineCharsToLCD1602(lineOne, 8, 8, "D:000cm "); //顯示distance (總)距離(檢測(cè)探頭到水庫(kù)底部的距離)D
putThreeCharToLCD1602(lineOne, 8 + 2, uiD); //顯示三位數(shù)值
putLineCharsToLCD1602(lineOne, 0, 8, "H:000cm "); //顯示設(shè)定的最高報(bào)警水位H
putThreeCharToLCD1602(lineOne, 0 + 2, uiH); //顯示三位數(shù)值
putLineCharsToLCD1602(lineTow, 0, 8, "L:000cm "); //顯示設(shè)定的最低報(bào)警水位L
putThreeCharToLCD1602(lineTow, 0 + 2, uiL); //顯示三位數(shù)值
putLineCharsToLCD1602(lineTow, 8, 8, "C:000cm "); //顯示當(dāng)前CURRENT水位C
initTimer0(); //初始化定時(shí)器0
initTimer1();
//閥門(mén)動(dòng)作:初始先排水
io_Control_Inlet = isio_Control_Inlet_OFF;
io_Control_Outlet = isio_Control_Outlet_ON;
g_flagSwitch = isNo;
while(1)
{
io_US_TX = 1; //啟動(dòng)超聲波模塊信號(hào)
delay10us();
io_US_TX = 0;
while(io_US_RX == 0); //等待計(jì)時(shí)開(kāi)始
TR0 = 1; //開(kāi)啟定時(shí)器0,計(jì)時(shí)開(kāi)始
IT1 = 1; //設(shè)置外中斷INT1輸入信號(hào)模式(1:Falling only僅下降沿有效 0:Low level低電平有效)
EX1 = 1; //使能外中斷INT1
while(EX1 == 1 && g_flag == isNo)//等待中斷或超時(shí)退出
{
uchar ucKeyValue = GetKey(); //在等待中檢測(cè)按鍵
if(ucKeyValue) execute_key_task(ucKeyValue); //如果有鍵按下則執(zhí)行按鍵任務(wù)
}
if(CalculatedWaterLevel() == isNo) continue; //計(jì)算水位,如果超出范圍返回isNo并重新循環(huán)
TR0 = 0; //暫時(shí)關(guān)閉定時(shí)器0
//清零定時(shí)器和計(jì)數(shù)變量以及標(biāo)志
TL0 = 0;
TH0 = 0;
g_flag = isNo;
ucCount = 0;
g_flag05s = isNo;
TR0 = 1; //打開(kāi)定時(shí)器0
while(g_flag05s == isNo) //延時(shí)0.52秒,以防止此期間返回的超聲波產(chǎn)生錯(cuò)誤信息,并使顯示變化放慢,保證視覺(jué)效果
{
uchar ucKeyValue = GetKey();
if(ucKeyValue)
{
if(ucKeyValue == DATA_KEY_DEC)
{
g_flagBeepTimer = isNo;//用減小按鍵取消報(bào)警標(biāo)志
}
execute_key_task(ucKeyValue); //如果有鍵按下則執(zhí)行按鍵任務(wù)
}
}
TR0 = 0; //暫時(shí)關(guān)閉定時(shí)器0
//清零定時(shí)器和復(fù)位標(biāo)志
TL0 = 0;
TH0 = 0;
g_flag = isNo;
//-----------------------------------
//水箱清洗提示:
if(g_flagBeepTimer == isYes)
{
buzzerCall();
//用減小按鍵取消報(bào)警標(biāo)志
}
//-----------------------------------
}
}