51单片机超声波测距并用1602液晶显示距离程序
#include
#include<2.h>
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^5;
sbit wr=P3^6;
sbit lcden=P3^4;
void delay()//100us
{
uchar i,j;
for(i=0;i<1;i++)
for(j=0;j<30;j++); }
void write_command(uchar command) {
rs=0;
wr=0;
lcden=0;
P0=command;
lcden=1;
delay();
lcden=0;
}
void lcd_initial()
{
write_command(0x38);
write_command(0x0c);
write_command(0x06);
}
void write_data(uchar lcd_data)
{
rs=1;
wr=0;
lcden=0;
P0=lcd_data;
lcden=1;
delay();
lcden=0;
}
uchar shi,ge,bai;
int jia=0;//如果计数器满,则保存满值
unsigned long int num=0;//注意数据类型
sbit trig=P2^0;//定义发送引脚
sbit echo=P3^6;//定义接受回响信号引脚
void send()//发送声波
{
trig=1;
delay();
trig=0;
}
void main()
{
while(1)
{
TMOD=0x01;//定时器方式1
ET0=1;//允许T0中断
EA=1;//开启总中断
TH0=0;//装初值
TL0=0;
send();
while(!echo);//如果回响变为高电平则执行下一步
TR0=1;//启动定时器
while(echo);//等待回响结束
TR0=0;//关闭定时器
num=TH0*256+TL0+jia;
jia=0;
num=num*0.017*12/11;
lcd_initial();//液晶初始化
bai=num/100;
shi=num/10%10;
ge=num%10%10;
write_command(0x80+0x02);//地址
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
}
void Time0(void) interrupt 1//计数器满时,进入中断,jia用来保存满值{
jia=jia+65535;
TH0=0;
TL0=0;
}