用Keil编写基于AT89C51的超声波液位检测报警装置的程序,更改报警距离、增加LCD显示(带注释)
时间: 2023-11-28 11:47:44 浏览: 86
以下是基于AT89C51的超声波液位检测报警装置的程序,已经加入了更改报警距离和增加LCD显示的功能。
```
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit TRIG = P2^0; //定义TRIG引脚
sbit E = P1^7; //定义E引脚
sbit RW = P1^6; //定义RW引脚
sbit RS = P1^5; //定义RS引脚
uchar dis_data[4] = {0, 0, 0, 0}; //存储距离数据的数组
uchar alarm_dis = 20; //报警距离
void delayms(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com) //写命令函数
{
RS = 0;
RW = 0;
P0 = com;
E = 1;
delayms(1);
E = 0;
}
void write_data(uchar dat) //写数据函数
{
RS = 1;
RW = 0;
P0 = dat;
E = 1;
delayms(1);
E = 0;
}
void init() //初始化函数
{
write_com(0x38); //设置16*2显示,5*8点阵,8位数据接口
write_com(0x0c); //开显示,光标不显示
write_com(0x06); //写入一个字符后光标右移,字符不动
write_com(0x01); //清屏
delayms(10);
}
void ultrasonic() //超声波函数
{
uint dis;
TRIG = 1;
delayms(10);
TRIG = 0;
while(!P3_2);
TH0 = 0;
TL0 = 0;
while(P3_2);
TR0 = 1;
while(!P3_2);
TR0 = 0;
dis = TH0*256 + TL0; //计算距离
dis = dis/58; //US-015的距离公式
if(dis > 400) //超出测量范围
dis = 400;
dis_data[0] = dis/100; //百位
dis_data[1] = dis/10%10; //十位
dis_data[2] = dis%10; //个位
}
void display() //显示函数
{
write_com(0x80); //设置显示起始地址为第一行第一列
write_data('D');
write_data('i');
write_data('s');
write_data(':');
write_data(dis_data[0]+0x30); //将数字转换为ASCII码
write_data(dis_data[1]+0x30);
write_data(dis_data[2]+0x30);
write_data('c');
write_data('m');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
write_com(0xc0); //设置显示起始地址为第二行第一列
write_data('A');
write_data('l');
write_data('a');
write_data('r');
write_data('m');
write_data(':');
write_data(alarm_dis/10+0x30);
write_data(alarm_dis%10+0x30);
write_data('c');
write_data('m');
write_data(' ');
write_data(' ');
write_data(' ');
write_data(' ');
}
void main()
{
TMOD = 0x01; //定时器0工作在模式1
TH1 = 0xfd; //波特率设置为9600
TL1 = 0xfd;
SCON = 0x50; //串口工作在模式1
TR1 = 1; //启动定时器1
init(); //初始化LCD
while(1)
{
ultrasonic(); //获取距离
display(); //显示距离和报警距离
if(dis_data[0]*100+dis_data[1]*10+dis_data[2] < alarm_dis) //如果距离小于报警距离
{
write_com(0x01); //清屏
write_com(0x80); //设置显示起始地址为第一行第一列
write_data('A');
write_data('l');
write_data('a');
write_data('r');
write_data('m');
write_data('!');
delayms(500); //报警500毫秒
}
}
}
```
在程序中,我们使用了LCD1602来显示距离和报警距离。距离数据以三位数字的形式存储在`dis_data`数组中,报警距离以数字的形式存储在`alarm_dis`变量中。在`display()`函数中,我们将距离和报警距离显示在LCD上。
要更改报警距离,只需要修改`alarm_dis`变量的值即可。例如,如果要将报警距离更改为30厘米,可以将`alarm_dis`的值修改为30。
注意:在使用定时器0计算距离时,需要将定时器0工作在模式1,并且需要设置定时器0的初值为0。
阅读全文