|
本設(shè)計(jì)中液晶顯示有4個(gè)字母,分別為
H------容器的最高水位設(shè)定值(不能高于實(shí)際高度)
L------容器的最低水位設(shè)定值
D-----容器實(shí)際高度(可以設(shè)置)
C-----容器內(nèi)液體的高度(在實(shí)際演示中,障礙物離探頭越近,液晶C顯示越大,因?yàn)檎系K物好比液面,離探頭近了說明水位高了)
特別提醒:如果容器實(shí)際高度D你設(shè)置為1米,那么C液體的高度最高能測到98cm,因?yàn)樘筋^的盲區(qū)在2cm左右。如果D設(shè)為2米,那么最高能測到1.98m.
按鍵功能分別為:設(shè)置鍵 增加鍵 減小鍵 復(fù)位鍵
三個(gè)指示燈的分別功能為:紅色----超過設(shè)定的最高水位H 黃色-----低于設(shè)定的最低水位L
綠色----最高H和最低L中間
本文采用AT89C52單片機(jī)系統(tǒng)實(shí)現(xiàn)了水塔水位的自動(dòng)控制,設(shè)計(jì)出一種低成本、高實(shí)用價(jià)值的水塔水位控制器。該系統(tǒng)具有水位檢測、水位高度LCD顯示、低水位高水位報(bào)警以及自動(dòng)加水等功能。
本設(shè)計(jì)過程中主要采用了傳感技術(shù)、單片機(jī)技術(shù)、光報(bào)警技術(shù)以及弱電控制強(qiáng)電的技術(shù)。本設(shè)計(jì)傳感器使用了超聲波模塊,并且詳細(xì)闡述了超聲波測距測的原理,給出了系統(tǒng)構(gòu)成框圖。此系統(tǒng)具有易控制、工作可靠、測量精度高的優(yōu)點(diǎn),可實(shí)時(shí)監(jiān)控液位。并采用52單片機(jī)系統(tǒng)控制整個(gè)電路的信號(hào)處理以及采用光電耦合和繼電器來實(shí)現(xiàn)弱電控制強(qiáng)電來實(shí)現(xiàn)加水系統(tǒng)的自動(dòng)控制。它能自動(dòng)完成水位檢測、光報(bào)警、上水停水的全部工作循環(huán),保證液面高度始終處于較理想的范圍內(nèi),它結(jié)構(gòu)簡單,制造成本低,靈敏度高,節(jié)約能源顯著,是用于各種高層液體儲(chǔ)存的理想設(shè)備。
示意圖:
QQ截圖20150614105931.png (14.46 KB, 下載次數(shù): 95)
下載附件
2018-9-19 19:43 上傳
制作出來的實(shí)物圖如下:
IMG_1538.JPG (1.36 MB, 下載次數(shù): 120)
下載附件
實(shí)物
2018-9-19 18:59 上傳
0.jpg (64.94 KB, 下載次數(shù): 106)
下載附件
2018-9-19 19:44 上傳
0.jpg (54.28 KB, 下載次數(shù): 108)
下載附件
2018-9-19 19:44 上傳
0.jpg (52.41 KB, 下載次數(shù): 93)
下載附件
2018-9-19 19:44 上傳
0.jpg (82.4 KB, 下載次數(shù): 104)
下載附件
2018-9-19 19:44 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件):
QQ圖片20180919185638.png (157.45 KB, 下載次數(shù): 96)
下載附件
原理圖
2018-9-19 18:59 上傳
0.png (25.16 KB, 下載次數(shù): 119)
下載附件
2018-9-19 19:40 上傳
0.png (8.25 KB, 下載次數(shù): 88)
下載附件
2018-9-19 19:40 上傳
超聲波水位控制器元件清單
1) 9*15萬用板 1
2) AT89C51單片機(jī) 1
3) 超聲波探頭 0
4) 40腳IC座 1
5) 4腳排針 0
6) 杜邦線4根 0
7) 繼電器*2 0
8) LCD1602液晶 1
9) 103電位器 0
10) 16腳IC座 0
11) 16腳排針 1
12) 蜂鳴器 0
13) 8550三極管*3 0
14) 1k電阻*8 0
15) 10k電阻 0
16) 10uf電容 0
17) 30pf電容*2 0
18) 12M晶振 1
19) 3mmLED(紅、綠各2個(gè),黃1個(gè)) 0
20) 輕觸按鍵*4 1
21) 自鎖開關(guān) 1
22) DC電源插口 1
23) USB電源線(電池盒)
24) 直流水泵*2(根據(jù)客戶自選)
單片機(jī)程序源碼如下:
- /***************************************************************
- 名稱:基于51單片機(jī)的超聲波水位監(jiān)測報(bào)警系統(tǒng)
- 單片機(jī)型號(hào):AT89C51
- 單片機(jī)設(shè)置:時(shí)鐘12T,晶體12MHZ
- 作者:學(xué)長電子工作室
- 注:修改增加水泵控制和排水控制,即雙繼電器
- ***************************************************************/
- #include <reg51.h>
- #include <intrins.h> // 包含循環(huán)移位:_cror_
- #include "main.h"
- //----------------------------------------------------------------------
- uchar code TabNumASCII[10] = {'0','1','2','3','4','5','6','7','8','9'};
- bool g_flag = isNo; //用于標(biāo)記超時(shí)(65.536ms)
- bool g_flag05s = isNo; //用于標(biāo)記0.52秒
- uchar ucCount = 0; //用于計(jì)數(shù)0.52秒
-
- uint uiH = 80; //設(shè)定的最高報(bào)警水位 H
- uint uiL = 30; //設(shè)定的最低報(bào)警水位 L
- uint uiD = 100; //檢測探頭到水庫底部的距離 D
- bool g_flagSwitch = isNo; //控制閥門連續(xù)開啟間隔延時(shí)(保護(hù))標(biāo)志
- bool g_flagBeepTimer = isNo; //定時(shí)提醒標(biāo)志
-
- //-----------------------------------------------------------------------
- // 延時(shí)10us
- void delay10us(void) //@12MHz
- {
- unsigned char i;
- _nop_();
- i = 2;
- while (--i);
- }
- // 延時(shí)100us
- void delay100us(void) //@12MHz
- {
- uchar i;
- _nop_();
- i = 47;
- while (--i);
- }
- // 延時(shí)125us
- void delay125us(void) //@12MHz
- {
- unsigned char i;
- i = 60;
- while (--i);
- }
- // 延時(shí)5ms
- void delay5ms(void) //@12.000MHz
- {
- unsigned char i, j;
- i = 10;
- j = 183;
- do
- {
- while (--j);
- } while (--i);
- }
- // 延時(shí)500ms
- void delay500ms(void) //@12MHz
- {
- unsigned char i, j, k;
- _nop_();
- i = 4;
- j = 205;
- k = 187;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- //-----------------------------------------------------------------------
- //初始化IO端口
- void initIO(void)
- {
- P0 = 0xff;
- P1 = 0xff;
- P2 = 0xff;
- P3 = 0xff;
- }
- // 初始化定時(shí)器0,定時(shí)器時(shí)鐘12T模式 模式1,16位 @12.000MHz
- void initTimer0(void)
- {
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0; //定時(shí)器初值清零
- TH0 = 0; //定時(shí)器初值清零
- //TR0 = 1; //開定時(shí)器0
- ET0 = 1; //開定時(shí)器0中斷
- EA = 1; //開總中斷
-
- }
- // 初始化定時(shí)器1,定時(shí)器時(shí)鐘12T模式 模式1,16位 @12.000MHz
- void initTimer1(void) //50毫秒@12.000MHz
- {
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TMOD |= 0x10; //設(shè)置定時(shí)器模式
- TL1 = 0xB0; //設(shè)置定時(shí)初值
- TH1 = 0x3C; //設(shè)置定時(shí)初值
- TR1 = 1; //定時(shí)器1開始計(jì)時(shí)
- ET1 = 1; //開定時(shí)器0中斷
- }
- //-----------------------------------------------------------------------
- //定時(shí)器0中斷
- void zd0(void) interrupt 1
- {
-
- g_flag = isYes; //中斷溢出標(biāo)志,g_flag = isYes超過測距范圍
- if(++ucCount >= 8)
- {
- ucCount = 0;
- g_flag05s = isYes; //g_flag05s = isYes定時(shí)0.52秒到,用于測量周期延時(shí)
- }
- TL0 = 0; //設(shè)置定時(shí)初值
- TH0 = 0; //設(shè)置定時(shí)初值
-
- }
- //定時(shí)器1中斷 定時(shí)50ms
- void tm1_isr() interrupt 3 using 1
- {
- static uchar count = DATA_switchTime; //50ms的200倍 = 10S
- static uchar uiCount = 1200; // = 1分鐘
- static uint uiCount_BeepTimer = DATA_BeepTimer;
- TL1 = 0xB0; //設(shè)置定時(shí)初值
- TH1 = 0x3C; //設(shè)置定時(shí)初值
- if (g_flagSwitch == isNo)
- {
- if (count-- == 0) //50ms * 200 -> 10s
- {
- count = DATA_switchTime;
- g_flagSwitch = isYes;
- // TR1 = 0;
- }
- }
-
- if(g_flagBeepTimer == isNo)
- {
- if (uiCount-- == 0) //= 1分鐘
- {
- uiCount = 1200;
- if(uiCount_BeepTimer-- == 0)
- {
- uiCount_BeepTimer = DATA_BeepTimer;
- g_flagBeepTimer = isYes;
- // TR1 = 0;
- }
-
- }
- }
- }
- //-----------------------------------------------
- //外部中斷1
- void exint1() interrupt 2
- {
- EX1 = 0; //關(guān)閉當(dāng)前中斷
- TR0 = 0; //關(guān)閉時(shí)器0
-
- }
- //-----------------------------------------------------------------------
-
- //讀LCD忙狀態(tài)并等待忙狀態(tài)結(jié)束
- void LCD_waitNotBusy(void)
- {
- IO_LCD_Data = 0xFF;
- io_LCD_RS = 0;
- io_LCD_RW = 1;
- io_LCD_E = 0;
- _nop_();
- _nop_();
- io_LCD_E = 1;
- while(IO_LCD_Data & 0x80); //檢測如果是忙信號(hào),一直等到不忙
- }
- //給LCD寫指令
- void LCDWriteCommand(uchar command,bool ifReadBusy) //ifReadBusy = 1 時(shí)先進(jìn)行忙檢測
- {
- if (ifReadBusy == isReadBusy) LCD_waitNotBusy(); //根據(jù)需要檢測忙
- IO_LCD_Data = command;
- io_LCD_RS = 0;
- io_LCD_RW = 0;
- io_LCD_E = 0;
- _nop_();
- _nop_();
- io_LCD_E = 1;
- }
- //給LCD寫數(shù)據(jù)
- void LCDWriteData(uchar dat)
- {
- LCD_waitNotBusy(); //等到不忙
- IO_LCD_Data = dat;
- io_LCD_RS = 1;
- io_LCD_RW = 0;
- io_LCD_E = 0;
- _nop_();
- _nop_();
- io_LCD_E = 1;
- }
- // 初始化LCD1602液晶顯示屏
- void initLCD1602(void)
- {
- uchar i;
- IO_LCD_Data = 0; // 數(shù)據(jù)端口清零
- for(i = 0; i < 3; i++) // 設(shè)置三次顯示模式
- {
- LCDWriteCommand(0x38,isNotReadBusy); // 不檢測忙信號(hào)
- delay5ms();
- }
-
- LCDWriteCommand(0x38,isReadBusy); // 設(shè)置顯示模式,檢測忙信號(hào)
- LCDWriteCommand(0x08,isReadBusy); // 關(guān)閉顯示
- LCDWriteCommand(0x01,isReadBusy); // 顯示清屏
- LCDWriteCommand(0x06,isReadBusy); // 顯示光標(biāo)移動(dòng)設(shè)置
- LCDWriteCommand(0x0F,isReadBusy); // 顯示開及光標(biāo)設(shè)置
- }
- //按指定位置顯示一個(gè)字符
- void putOneCharToLCD1602(uchar line, uchar position, uchar ucData)
- {
- line &= DATA_LineMax;
- position &= DATA_PositionMax;
- if (line == DATA_LineTow) position |= 0x40; //當(dāng)要顯示第二行時(shí)地址碼+0x40;
- position |= 0x80; //設(shè)置兩行顯示格式 D7 = 1;
- LCDWriteCommand(position, isReadBusy); //發(fā)送命令 設(shè)置字符地址
- LCDWriteData(ucData); //寫入字符的數(shù)據(jù)
- }
- //按指定位置顯示一串字符
- void putLineCharsToLCD1602(uchar line, uchar position, uchar count, uchar code *ucData)
- {
- uchar i;
- for(i = 0; i < count; i++) //連續(xù)顯示單個(gè)字符
- {
- putOneCharToLCD1602(line, position + i, ucData[i]);
- }
- }
- //按指定位置連續(xù)顯示三個(gè)字符(三位數(shù)字)
- void putThreeCharToLCD1602(uchar line, uchar position, uint uiNumber)
- {
- uiNumber %= 1000;
- putOneCharToLCD1602(line, position, TabNumASCII[uiNumber / 100]);
- putOneCharToLCD1602(line, ++position, TabNumASCII[uiNumber % 100 / 10]);
- putOneCharToLCD1602(line, ++position, TabNumASCII[uiNumber % 100 % 10]);
-
- }
-
- // 按鍵檢測子程序,有鍵按下返回鍵端口數(shù)據(jù),無鍵返回0
- uchar GetKey(void)
- {
- uchar KeyTemp = (IO_KEY | DATA_KEY_ORL); //獲取按鍵端口數(shù)據(jù)
-
- if( KeyTemp != DATA_KEY_Null ) // 如果不為空
- {
- uchar CountTemp = 0;
- do
- {
- delay125us();
- if(KeyTemp != (IO_KEY | DATA_KEY_ORL)) return 0; //在延時(shí)期間檢測鍵,如果不穩(wěn)定保持則退出
-
- } while(++CountTemp > Data_Key20msCountMax); // 延時(shí)20ms去抖動(dòng)
-
- while((IO_KEY | DATA_KEY_ORL) != DATA_KEY_Null); //等鍵釋放
-
- return KeyTemp; // 有鍵按下返回鍵端口數(shù)據(jù)
- }
-
- return 0; // 無有效鍵返回0
- }
- //加一
- uchar INC_Number(uchar Number, uchar Min, uchar Max)
- {
- if(Number >= Max) return Min; else return (++ Number);
-
- }
- //減一
- uchar DEC_Number(uchar Number, uchar Min, uchar Max)
- {
- if(Number <= Min) return Max; else return (-- Number);
-
- }
- // 檢測到有按鍵后 這里執(zhí)行按鍵任務(wù)
- void execute_key_task(uchar ucKeyValue)
- {
- uchar state = 0; //定義調(diào)整數(shù)據(jù)的狀態(tài)變量
- uchar keyValue = 0; //定義鍵值的臨時(shí)變量
-
- if(ucKeyValue != DATA_KEY_Set) return; //不是設(shè)置鍵退出
-
- //是設(shè)置鍵繼續(xù)-----------------------------------------------------
-
- putLineCharsToLCD1602(lineTow, 8, 8, "C:000cm "); //清零顯示當(dāng)前距離CURRENT
- putThreeCharToLCD1602(lineOne, 8 + 2, uiD); //光標(biāo)調(diào)整到調(diào)整總距離(檢測探頭到水庫底部的距離“D:000cm”)
-
- while(1)
- {
- keyValue = GetKey();
- if(keyValue == 0) continue;
-
- switch(keyValue)
- {
- case DATA_KEY_Set:
- {
- // 如果按的是設(shè)置鍵,順序設(shè)置總距離D——高水位H——低水位L——退出
- switch(state)
- {
- case 0: // 如果是設(shè)置總距離狀態(tài),改變?yōu)樵O(shè)置高水位狀態(tài),并顯示高水位,實(shí)現(xiàn)移動(dòng)光標(biāo)到高水位后面
- {
- state = 1;
- putThreeCharToLCD1602(lineOne, 0 + 2, uiH);
- }
- break;
- case 1:
- {
- uchar tempMax = uiD - DATA_uiD_Min;
- if(tempMax < 2 + 2) tempMax = 2 + 2;
- if(uiH > tempMax)
- {
- uiH = tempMax;
- putThreeCharToLCD1602(lineOne, 0 + 2, uiH);
- }
- else if(uiH < 2 + 2)
- {
- uiH = 2 + 2;
- putThreeCharToLCD1602(lineOne, 0 + 2, uiH);
- }
- state = 2;
- putThreeCharToLCD1602(lineTow, 0 + 2, uiL);
- }
- break;
- case 2:
- {
- if(uiL > uiH - 2)
- {
- uiL = uiH - 2;
- putThreeCharToLCD1602(lineTow, 0 + 2, uiL);
- }
- return;
-
- }
- break;
- }
-
- }
- break;
- // 如果按的是增加鍵,改變相應(yīng)數(shù)據(jù)并顯示
- case DATA_KEY_INC:
- {
- switch(state)
- {
- case 0:
- {
- uiD = INC_Number(uiD, DATA_uiD_Min, DATA_uiD_Max);
- putThreeCharToLCD1602(lineOne, 8 + 2, uiD);
- }
- break;
- case 1:
- {
- uchar tempMax = uiD - DATA_uiD_Min;
- if(tempMax < 2 + 2) tempMax = 2 + 2;
- uiH = INC_Number(uiH, 2, tempMax);
- putThreeCharToLCD1602(lineOne, 0 + 2, uiH);
- }
- break;
- case 2:
- {
- uiL = INC_Number(uiL, 0, uiH - 2);
- putThreeCharToLCD1602(lineTow, 0 + 2, uiL);
- }
- break;
- }
-
- }
- break;
- // 如果按的是減少鍵,改變相應(yīng)數(shù)據(jù)并顯示
- case DATA_KEY_DEC:
- {
- switch(state)
- {
- case 0:
- {
- uiD = DEC_Number(uiD, DATA_uiD_Min, DATA_uiD_Max);
- putThreeCharToLCD1602(lineOne, 8 + 2, uiD);
- }
- break;
- case 1:
- {
- uchar tempMax = uiD - DATA_uiD_Min;
- if(tempMax < 2 + 2) tempMax = 2 + 2;
- uiH = DEC_Number(uiH, 2, tempMax);
- putThreeCharToLCD1602(lineOne, 0 + 2, uiH);
- }
- break;
- case 2:
- {
- uiL = DEC_Number(uiL, 0, uiH - 2);
- putThreeCharToLCD1602(lineTow, 0 + 2, uiL);
- }
- break;
- }
-
- }
- break;
-
- }
-
- }
-
- }
- // 蜂鳴器
- void buzzerCall(void)
- {
- uchar i;
-
- for(i = 0; i < 90; i++)
- {
- io_Buzzer = 0;
- delay100us();
- io_Buzzer = 1;
- delay100us();
- delay100us();
- }
- delay100us();
- delay100us();
- }
- //計(jì)算水位
- bool CalculatedWaterLevel(void)
- {
- uchar i = 8 + 2; //當(dāng)前水位的數(shù)字在LCD屏顯示的起點(diǎn)位置
- uint uiTime; //聲波傳播時(shí)間
- ulong ulDis; //實(shí)時(shí)測量到距離
-
- uiTime = TH0 << 8 | TL0;
- ulDis = (uiTime * 3.40) / 200; //計(jì)算當(dāng)前測量的距離,單位cm
-
- TH0 = 0;
- TL0 = 0;
-
- if((ulDis > uiD) || (g_flag == isYes )) // ulDis > uiD 超出測量范圍;g_flag == isYes超時(shí);
- {
- g_flag = isNo;
- TR0 = 0;
- putLineCharsToLCD1602(lineTow, i, 3, "Err"); // 顯示Err
-
- //閥門動(dòng)作:
- // if(g_flagSwitch == isYes)
- // {
- // io_Control_Inlet = isio_Control_Inlet_OFF;
- // io_Control_Outlet = isio_Control_Outlet_ON;
- // g_flagSwitch = isNo;
- // }
-
- //指示燈:
- ioLed_Red = ! ioLed_Red; // 三個(gè)燈同時(shí)快速閃亮
- ioLed_Green = ! ioLed_Green;
- ioLed_Yellow = ! ioLed_Yellow;
-
- // 蜂鳴器叫:
- if(buzzerCallFlag == isCall)
- {
- buzzerCall(); // 蜂鳴器叫
- }
-
- return isNo; // 返回錯(cuò)誤信息
- }
- else
- {
- ulDis = uiD - ulDis; // 當(dāng)前水位C = 總距離 - 當(dāng)前檢測到的距離
-
- if(ulDis > uiH) // 如果水位超高
- {
-
- //閥門動(dòng)作:
- io_Control_Inlet = isio_Control_Inlet_OFF;
- io_Control_Outlet = isio_Control_Outlet_ON;
- g_flagSwitch = isNo;
-
- //指示燈:
- ioLed_Red = ! ioLed_Red; // 紅燈閃
- ioLed_Green = isLedOFF;
- ioLed_Yellow = isLedOFF;
- // 蜂鳴器叫:
- if(ulDis - uiH > (uiD - uiH) / DATA_alarmCoefficient) //當(dāng)“當(dāng)前水位”超出最高水位“ ((“總高度減高水位)除以2的值”)時(shí)報(bào)警
- {
- buzzerCall(); // 蜂鳴器叫
- }
-
- }
- else if(ulDis < uiL) // 如果水位超低
- {
- //閥門動(dòng)作:
- if(g_flagSwitch == isYes)
- {
- io_Control_Outlet = isio_Control_Outlet_OFF;
- io_Control_Inlet = isio_Control_Inlet_ON;
- g_flagSwitch = isNo;
- }
-
- //指示燈:
- ioLed_Red = isLedOFF;
- ioLed_Green = isLedOFF;
- ioLed_Yellow = ! ioLed_Yellow; //黃燈閃
- // 蜂鳴器叫:
- if( uiL - ulDis > uiL / DATA_alarmCoefficient)//uiL / 2 當(dāng)“當(dāng)前水位”低于“低水位” “低水位除以2的值”時(shí)報(bào)警
- {
- buzzerCall(); // 蜂鳴器叫
- }
-
-
- }
- else // 水位在正常范圍
- {
- ioLed_Red = isLedOFF;
- ioLed_Green = ! ioLed_Green;
- ioLed_Yellow = isLedOFF;
-
- }
- putThreeCharToLCD1602(lineTow, i, ulDis);
- return isYes;
-
- }
- return isYes;
- }
- void main(void)
- {
- initIO(); //初始化IO端口
- delay500ms(); //啟動(dòng)延時(shí),給器件進(jìn)入正常工作狀態(tài)留夠時(shí)間
- initLCD1602(); //LCD初始化
- putLineCharsToLCD1602(lineOne, 8, 8, "D:000cm "); //顯示distance (總)距離(檢測探頭到水庫底部的距離)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();
-
- //閥門動(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í)開始
- TR0 = 1; //開啟定時(shí)器0,計(jì)時(shí)開始
- 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(); //在等待中檢測按鍵
- 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; //打開定時(shí)器0
- while(g_flag05s == isNo) //延時(shí)0.52秒,以防止此期間返回的超聲波產(chǎn)生錯(cuò)誤信息,并使顯示變化放慢,保證視覺效果
- {
- 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;
-
- //-----------------------------------
- //水箱清洗提示:
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
51hei.png (6.63 KB, 下載次數(shù): 72)
下載附件
2021-12-4 19:11 上傳
全部資料51hei下載地址:
基于單片機(jī)超聲波液位控制器設(shè)計(jì).7z
(4.14 MB, 下載次數(shù): 658)
2021-12-4 19:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|