#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit trig=P2^0;
sbit echo=P3^2;//外部中断INT0的接口
uint num,bai,shi,ge,shu,i,time,timeH,timeL,flag;
uint temp;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay_20us()
{
uchar a ;
for(a=0;a<100;a++); //延时20微秒
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} //延时
void display()
{
uchar ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
dula=1;
P0=table[ge]; //送数字8到段码端口 dula=1;
dula=0; wela=0;
P0=0xfb; //数码管位选
wela=1;
wela=0;
delay(5);
dula=1;
P0=table[shi]; //送数字8到段码端口 dula=1;
dula=0; wela=0;
P0=0xfd; //数码管位选
wela=1;
wela=0;
delay(5);
dula=1;
P0=table[bai]; //送数字8到段码端口 dula=1;
dula=0;
wela=0;
P0=0xfe; //数码管位选
wela=1;
wela=0;
delay(5);
}
void csb()
{
EA=0; //关总中断
trig=1; //超声波输入端
delay_20us(); //延时20us
trig=0; //产生一个20us的脉冲
while(echo==0); //等待Echo回波引脚变高电平
flag=0; //清测量成功标志
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
delay(20); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(flag==1) //如果测量成功
{
time=timeH*256+timeL;
temp=time*0.0172;
}
if(flag==0) //如果测量不成功,重新测量
{
temp=0;
}
display();
}
void main()
{
TMOD=0X10;
EA=1;
trig=0;
while(1)
{
csb();
}
}
void exter() interrupt 0
{
timeH=TH1;
timeL=TL1;
flag=1;
EX0=0;
}
void timer() interrupt 3
{
TH1=0;
TL1=0;
}
|