超声波 1602单位厘米
#include
#define uchar unsigned char
#define uint unsigned int
bit succeed_flag=0;
sbit Trig = P3^1;
sbit Echo = P3^2;
sbit lcdrs=P2^5;
sbit lcdrw=P2^6;
sbit lcden=P2^7;
unsigned int time=0,distance=0;
unsigned int timeH,timeL;
uint temp,num;
uchar code table[]="0123456789";
uchar code table1[]="distance=M";
void delay_1(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_20us()
{
uchar a ;
for(a=0;a
}
//***************************************************************
//显示数据转换程序
void lcd_com(uchar command)
{
lcdrs=0;
P0=command;
delay_1(5);
lcden=1;
delay_1(5);
lcden=0;
}
void lcd_date(uchar date)
{
lcdrs=1;
P0=date;
delay_1(5);
lcden=1;
delay_1(5);
lcden=0;
}
void display(uint temp)
{
uint shi,bai,qian;
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
lcd_com(0x80+0x09);
lcd_date(table[qian]);
lcd_date(table[bai]);
lcd_date(table[shi]);
//lcd_date(table[ge]);
}
//***************************************************************
//外部中断0,用做判断回波电平
void exter() interrupt 0 // 外部中断0是0号
{
timeH =TH1; //取出定时器的值
timeL =TL1; //取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器1中断,用做超声波测距计时
void timer1() interrupt 3 //
{
TH1=0;
TL1=0;
TF1=0;
}
//***************************************************************
void main()
{
lcden=0;
lcdrw=0;
lcd_com(0x38);
lcd_com(0x0c);
lcd_com(0x06);
lcd_com(0x01);
lcd_com(0x80);
for(num=0;num
lcd_date(table1[num]);
lcd_com(0x80+0x0d);
lcd_date(table1[9]);
lcd_date(table1[9]);
Trig=0; //首先拉低脉冲输入引脚
EA=1;
IT1=0; //打开总中断
TMOD=0x10; //定时器1,16位工作方式
while(1)
{
EA=0; //关总中断
Trig=1; //超声波输入端
delay_20us(); //延时20us
Trig=0; //产生一个20us的脉冲
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志,定时器1计满时,硬件置1,并申
TR1=1; //启动定时器1
delay_1(20); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
time=timeH*256+timeL;
distance=
time*0.172; //厘米
display(distance);
}
if(succeed_flag==0)
{
distance=0; //没有回波则清零
}
}
}