基于超声波测距的蓄水桶液位控制器 1、使用超声波传感器模块测量蓄水桶液位。 2、使用最低两位数码管显示液位的百分比位置。最高位显示系统工作状态,显示代表F满水位正常状态,b表示进水管加水状态,A表示报警状态。 3、设置报警下线为20%,液位低于20%使用蜂鸣器报警。 4、液位低于100%开启进水阀加水(继电器吸合模拟),大于等于100%停止进水。基于c51单片机编写代码
时间: 2024-03-20 13:40:35 浏览: 113
基于51单片机+超声波模块实现液位控制设计资料 包含原理图源程序论文等
5星 · 资源好评率100%
以下是基于c51单片机编写的代码,实现基于超声波测距的蓄水桶液位控制器:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P2^3; //定义蜂鸣器引脚
sbit relay = P2^4; //定义继电器引脚
uchar dis_data[4]; //定义数码管显示数组
void delay(uint t) //延时函数
{
uint i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void init() //初始化函数
{
TMOD = 0x01; //设置计数器0为工作模式1
TH0 = 0x00; //设置定时器初值为0
TL0 = 0x00;
TR0 = 1; //启动定时器0
ET0 = 1; //允许定时器0中断
EA = 1; //开启总中断
}
void display() //数码管显示函数
{
uchar i;
for(i = 0; i < 4; i++) //循环扫描4位数码管
{
switch(i) //根据位数选择不同的数码管段
{
case 0: P0 = 0xfe; break; //选择第一位数码管
case 1: P0 = 0xfd; break; //选择第二位数码管
case 2: P0 = 0xfb; break; //选择第三位数码管
case 3: P0 = 0xf7; break; //选择第四位数码管
}
P1 = dis_data[i]; //将数码管对应的数码值输出
delay(5); //延时
P1 = 0x00; //关闭当前数码管
}
}
void main()
{
init(); //初始化
while(1)
{
if(dis_data[0] == 0xf) //如果液位超过100%
relay = 0; //关闭进水阀
else
relay = 1; //打开进水阀
if(dis_data[1] < 2) //如果液位低于20%
beep = 1; //蜂鸣器报警
else
beep = 0; //关闭蜂鸣器
display(); //数码管显示
}
}
void timer0() interrupt 1 //定时器0中断函数
{
uchar i;
static uchar cnt = 0;
static uchar dis_cnt = 0;
static uint dis_data_tmp = 0;
static uint dis_data_last = 0;
static uint dis_data_now = 0;
TH0 = 0xfc; //设置定时器初值为0.5ms
TL0 = 0x18;
cnt++;
if(cnt >= 10) //10次定时器0中断为一组
{
cnt = 0;
dis_cnt++;
dis_data_tmp = dis_data_now; //保存当前液位数据
if(dis_cnt >= 5) //5组定时器0中断为一次液位测量
{
dis_cnt = 0;
dis_data_now = dis_data_tmp / 5; //计算平均液位数据
if(dis_data_now != dis_data_last) //如果液位数据有变化
{
dis_data_last = dis_data_now;
dis_data[0] = dis_data_now / 1000; //计算千位数码值
dis_data[1] = dis_data_now % 1000 / 10; //计算百位和十位数码值
dis_data[2] = 0x0c; //显示%
dis_data[3] = 0x00; //清空最高位
}
}
if(dis_data[0] == 0xf) //如果液位超过100%
dis_data[3] = 0xf; //设置最高位为F
else if(dis_data[1] < 2) //如果液位低于20%
dis_data[3] = 0xA; //设置最高位为A
else if(relay) //如果进水阀开启
dis_data[3] = 0xb; //设置最高位为b
else //如果进水阀关闭
dis_data[3] = 0xf; //设置最高位为F
}
}
```
注意,上述代码中的液位测量部分需要根据具体的硬件和超声波传感器模块进行调整,这里只提供一个大体的框架。
阅读全文