|
#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++); //延時(shí)20微秒
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} //延時(shí)
void display()
{
uchar ge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
dula=1;
P0=table[ge]; //送數(shù)字8到段碼端口 dula=1;
dula=0; wela=0;
P0=0xfb; //數(shù)碼管位選
wela=1;
wela=0;
delay(5);
dula=1;
P0=table[shi]; //送數(shù)字8到段碼端口 dula=1;
dula=0; wela=0;
P0=0xfd; //數(shù)碼管位選
wela=1;
wela=0;
delay(5);
dula=1;
P0=table[bai]; //送數(shù)字8到段碼端口 dula=1;
dula=0;
wela=0;
P0=0xfe; //數(shù)碼管位選
wela=1;
wela=0;
delay(5);
}
void csb()
{
EA=0; //關(guān)總中斷
trig=1; //超聲波輸入端
delay_20us(); //延時(shí)20us
trig=0; //產(chǎn)生一個(gè)20us的脈沖
while(echo==0); //等待Echo回波引腳變高電平
flag=0; //清測(cè)量成功標(biāo)志
EA=1;
EX0=1; //打開外部中斷0
TH1=0; //定時(shí)器1清零
TL1=0; //定時(shí)器1清零
TF1=0; //計(jì)數(shù)溢出標(biāo)志
TR1=1; //啟動(dòng)定時(shí)器1
delay(20); //等待測(cè)量的結(jié)果
TR1=0; //關(guān)閉定時(shí)器1
EX0=0; //關(guān)閉外部中斷0
if(flag==1) //如果測(cè)量成功
{
time=timeH*256+timeL;
temp=time*0.0172;
}
if(flag==0) //如果測(cè)量不成功,重新測(cè)量
{
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;
}
|
|