?目錄
一、主要功能
二、使用步驟
三、硬件資源
四、軟件設計
五、實驗現象
一、主要功能
1、數碼管顯示當前水位值
2、按鍵設置水位上下限閾值
3、當水位低于下限,啟動蜂鳴器警報并抽水至水位上限停止抽水
4、電機模擬水泵,蜂鳴器,指示燈顯示
二、使用步驟
51單片機水位監測系統是一種基于8051架構的嵌入式液位檢測裝置,通過模擬量/數字量傳感器采集水位信息,結合控制算法實現水位監控與報警功能?。該系統可廣泛應用于水塔、水箱、河道等場景的水位監測與控制。
三、硬件資源
1、51單片機核心模塊
2、按鍵模塊
3、水位傳感器模塊、adc模塊
4、蜂鳴器模塊
5、繼電器模塊
6、數碼管顯示模塊
四、軟件設計
#include "reg51.h"
#include <PCF8591.h>
#define uchar unsigned char
#define uint unsigned int
sbit out=P3^3;//抽水機
sbit led1=P3^6;//指示燈
sbit led2=P3^7;
sbit smg1=P2^0;//數碼管
sbit smg2=P2^1;?? ??
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit k1=P1^0;//按鈕
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit beep=P1^7;//蜂鳴器
uchar time=0,mode=0;//系統變量?? ??
uchar water=0;//水位
uchar lim1=40,lim2=60;//閥值
uchar key=0;
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~9,無小數點
//延時
void delay(uint i)
{
?? ?while(i--);
}
?//按鍵檢測
uchar key_scan()
{
?? ?uchar i=0;
?? ?if(!k1 &&(key!=1))
?? ?{
?? ??? ?key=1;
?? ??? ?i=1;
?? ?}
?? ?if(!k2 &&(key!=2))
?? ?{
?? ??? ?key=2;
?? ??? ?i=2;
?? ?}
?? ?if(!k3 &&(key!=3))
?? ?{
?? ??? ?key=3;
?? ??? ?i=3;
?? ?}
?? ?if(!k4 &&(key!=4))
?? ?{
?? ??? ?key=4;
?? ??? ?i=4;
?? ?}
?? ?if(!k5 &&(key!=5))
?? ?{
?? ??? ?key=5;
?? ??? ?i=5;
?? ?}
?? ?if(k1 && k2 && k3 && k4 && k5 )
?? ??? ?key=0;
?? ?return i;
}
//主函數
void main()
{
?? ?uchar i=0,k=0;
?? ?TMOD|=0X01;
?? ?TH0=0X3C;
?? ?TL0=0XB0;?? ?
?? ?ET0=1;//打開定時器0中斷允許
?? ?EA=1;//打開總中斷
?? ?TR0=1;//打開定時器
?? ?while(1)
?? ?{
?? ??? ?i=key_scan();//按鍵檢測
?? ??? ?//設置按鈕
?? ??? ?if(i==2)
?? ??? ?{
?? ??? ??? ?mode=1;
?? ??? ?}
?? ??? ?if(i==1)
?? ??? ?{
?? ??? ??? ?mode=2;
?? ??? ?}
?? ??? ?if(mode==1)//設置下限
?? ??? ?{
?? ??? ?if(i==4)
?? ??? ?{
?? ??? ??? ?if(lim1<lim2)
?? ??? ??? ??? ?lim1++;
?? ??? ?}
?? ??? ?if(i==5)
?? ??? ?{
?? ??? ??? ?if(lim1>0)
?? ??? ??? ??? ?lim1--;
?? ??? ?}
?? ??? ?}
?? ??? ?if(mode==2)//設置上限
?? ??? ?{
?? ??? ?if(i==4)
?? ??? ?{
?? ??? ??? ?if(lim2<100)
?? ??? ??? ??? ?lim2++;
?? ??? ?}
?? ??? ?if(i==5)
?? ??? ?{
?? ??? ??? ?if(lim2>lim1)
?? ??? ??? ??? ?lim2--;
?? ??? ?}
?? ??? ?}
?? ??? ?if(i==3)//OK
?? ??? ?{
?? ??? ??? ?mode=0;
?? ??? ?}
?? ??? ?//點亮LED
?? ??? ?if(water<lim1)//水位低
?? ??? ?{
?? ??? ??? ?led1=0;led2=1;
?? ??? ?}
?? ??? ?else if(water>lim2)//水位高
?? ??? ?{
?? ??? ??? ?led1=1;led2=0;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?led1=1;led2=1;
?? ??? ?}
?? ??? ?//顯示水位
?? ??? ?if(mode==0)
?? ??? ?{
?? ??? ??? ?P0=smgduan[water/100];?? ??? ?smg2=0;delay(100);smg2=1;
?? ??? ??? ?P0=smgduan[water%100/10];?? ?smg3=0;delay(100);smg3=1;
?? ??? ??? ?P0=smgduan[water%10];?? ??? ?smg4=0;delay(100);smg4=1;
?? ??? ?}
?? ??? ?//顯示下限
?? ??? ?if(mode==1)
?? ??? ?{
?? ??? ??? ?P0=0x38;?? ??? ?smg1=0;delay(100);smg1=1;
?? ??? ??? ?P0=smgduan[lim1/100];?? ??? ?smg2=0;delay(100);smg2=1;
?? ??? ??? ?P0=smgduan[lim1%100/10];?? ?smg3=0;delay(100);smg3=1;
?? ??? ??? ?P0=smgduan[lim1%10];?? ??? ?smg4=0;delay(100);smg4=1;
?? ??? ?}
?? ??? ?//顯示上限
?? ??? ?if(mode==2)
?? ??? ?{
?? ??? ??? ?P0=0x76;?? ??? ?smg1=0;delay(100);smg1=1;
?? ??? ??? ?P0=smgduan[lim2/100];?? ??? ?smg2=0;delay(100);smg2=1;
?? ??? ??? ?P0=smgduan[lim2%100/10];?? ?smg3=0;delay(100);smg3=1;
?? ??? ??? ?P0=smgduan[lim2%10];?? ??? ?smg4=0;delay(100);smg4=1;
?? ??? ?}
?? ?}
}
五、實驗現象
演示視頻: