超声波测距,并用1602显示!
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit send=P1^0;
sbit RS=P3^6;
sbit EN=P2^0;
uchar i,test=0,flag1=0;
unsigned long int time,s;
uchar table[]={0x00,'.',0x00,0x00,0x00,'m'};
uchar table1[]={"failed!"};
void delay(uint ii)
{
uint i,j;
for(i=0;i<ii;i++)
for(j=0;j<11;j++);
}
void write_command(uchar com)//写命令
{
RS=0;
P0=com;
delay(1);
EN=1;
delay(1);
EN=0;
}
void write_data(uint data1)//写数据
{
RS=1;
P0=data1;
delay(1);
EN=1;
delay(1);
EN=0;
}
void yejing_init()//初始化
{
EN=0;
write_command(0x38);
write_command(0x0c);
write_command(0x06);
write_command(0x01);
}
void yejingxianshi()
{
if(test==1)
{
table[4]=s%10+0x30;
table[3]=(s/10)%10+0x30;
table[2]=(s/100)%10+0x30;
table[0]=(s/1000)%10+0x30;
write_command(0x80);
for(i=0;i<=5;i++)
{write_data(table[i]);}
}
if(test==0)
{
write_command(0x80+0x40);
for(i=0;i<7;i++)
{write_data(table1[i]);}
}
}
void timer0_init()
{
TL0=0xfd;
TH0=0xff;
}
void timer0() interrupt 1 using 1
{
TL0=0xfd;
TH0=0xff;
send=~send;
flag1++;
if(flag1==5)
{
TR0=0;
TL0=0xfd;
TH0=0xff;
flag1=0;
}
}
void timer1_init()
{
TH1=0;
TL1=0;
}
void timer1()interrupt 3 using 3
{
TR1=0;
TH1=0;
TL1=0;
test=0;
yejingxianshi();
}
void extern0() interrupt 0 using 0
{
TR0=0;
TR1=0;
test=1;
time=(TH1<<8)|TL1;
s=(170*time)/1000; //单位为厘米
yejingxianshi();
TH1=0;
TL1=0;
}
void init()
{
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
EX0=1;
IT0=0;//INT0低电平检测
TR0=0;
TR1=0;
yejing_init();
timer0_init();
timer1_init();
}
void main()
{
init();
while(1)
{
yejing_init();
TR0=1;
TR1=1;
EA=0;
// delay(1);
EA=1;
delay(9000);
}
}