#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
sbit trig=P2^0; //触发输入 至少为10us以上
sbit echo=P2^1; //输出回响信号
sbit rs=P2^6; // 数据命令选择
sbit rw=P2^5; //读写选择
sbit e=P2^7; //使能
u8 a[16]="Measure Distance"; //要显示的字符
u8 b[34]="Distance too long Please come here";
u16 j,dt;
u8 bat[5]; //保存超声波测量的数据,单位为m
void delay(u16 i)
{
while(i--);
}
void wrc(u8 c) //写命令
{
delay(1000);
rs=0;
rw=0;
e=0;
P0=c;
e=1;
delay(10);
e=0;
}
void wrd(u8 dat) //写数据
{
delay(1000);
rs=1;
rw=0;
e=0;
P0=dat;
e=1;
delay(10);
e=0;
rs=0;
}
void init()
{
delay(1000);
wrc(0x38);
wrc(0x38);
wrc(0x38);
wrc(0x06);
wrc(0x0c);
wrc(0x01);
}
void tim0_init()
{
TMOD=0x01;
TH0=0X00;
TL0=0X00;
}
void super_start() //触发超声波开始工作
{
trig=1;
delay(10); //至少10us
trig=0;
}
void super_count() //计算超声波回响的高电平持续时间
{
u8 i,k;
j=TH0*256+TL0;
TH0=0X00;
TL0=0X00;
dt=(j*1.7)/10; //精确到mm,如果除以100的话,那么在下边的数组运算时就要最大除以100,精确到cm
if(dt>=4000) //如果超过最大测量距离,清屏并显示"Distance too long Please come here"
{
wrc(0x01);
wrc(0x00+0x80);
for(i=0;i<34;i++)
{
wrd(b[i]);
if(i>=16)
{
k++;
wrc(0x40+k+0x80);
wrd(b[i]);
}
}
delay(10000);
}
k=0;
bat[0]=dt/1000+0x30;
bat[1]=0x2e;
bat[2]=dt%1000/100+0x30;
bat[3]=dt%1000%100/10+0x30;
bat[4]=dt%1000%100%10+0x30;
}
void display()
{
u8 i;
wrc(0x00+0x80);
for(i=0;i<16;i++)
{
wrd(a[i]);
}
wrc(0x40+0x80);
for(i=0;i<5;i++)
{
wrd(bat[i]);
}
wrd('m');
for(i=1;i<11;i++)
{
wrc(0x45+i+0x80);
wrd(' ');
}
}
void main()
{
init();
tim0_init();
while(1)
{
super_start();
while(echo==0); //等待高电平
TR0=1; //打开定时器开始计时
while(echo==1); //等待高电平下去变成低电平(高电平持续)
TR0=0; //关闭定时器
super_count();
display();
delay(10000);//检测一次间隔最少要保持60ms
}
}