功能介绍:采用51单片机作为主控CPU,LCD1602显示水位,SRF04超声波采集水位高度,可以通过按键设置水位高度,超过水位上限值蜂鸣器进行报警,并且通过串口可以将数据上发到电脑串口助手,文末有资料分享:
13-基于51单片机超声波水位测量报警系统(程序+原理图+元件清单全套资料)
程序部分展示,有中文注释,新手容易看懂
unsigned int time=0;//计时变量
unsigned int timer=0;//计时变量
unsigned int S=0;//当前值
unsigned int SET_H=200;//最高值和最低值
bit flag =0; //测量标志位
unsigned char Table[5],Table1[5];//显示数组
unsigned char KEY_flag=0; //按键选择标志
//延时函数
void Delay_ms(int jj) //延时函数
{
int ii; //延时变量
while(jj--)//延时n毫秒
for(ii=0;ii<116;ii++);//延时1毫秒
}
void Conut(void) //测量函数
{
time=TH0*256+TL0; //距离计数
TH0=0; //定时器清零
TL0=0; //定时器清零
S=(time*1.87)/10; //算出来是CM、转换
if((S>=7000)||flag==1) //超出测量范围显示“-”
{
flag=0; //数据无效标志
}
else
{
Table1[0]= S/1000+0X30; //显示当前值
Table1[1]= S/100%10+0X30; //显示当前值
Table1[2]= S/10%10+0X30; //显示当前值
Table1[3]= '.'; //显示当前值
Table1[4]= S%10+0X30; //显示当前值
}
}
void delayms(unsigned int x)
{
unsigned int i;
while(x--)
for(i=125;i>0;i--);
}
/*
* UART 发送一字节
*/
void UART_send_byte(char dat)
{
SBUF = dat; //发送
while (TI == 0); //等待发送完毕
TI = 0; //清发送完毕中断请求标志位
}
/*
* UART 发送字符串
*/
void Send_Str(unsigned char *buf)
{
while (*buf != '\0')
{
UART_send_byte(*buf++);
}
}
void Send_DATA(char *buffer)
{
Send_Str(buffer);//发送数据
Send_Str("\r\n");
delayms(50);
}
void StartModule() //超声波模块Trig控制端给大于10us的高电平触发模块测距
{
TX=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
//_nop_();
TX=0;
}
下面是原理图文件展示: