#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ //共阴数码管0~9 -
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40};
sbit Trig = P2^5; //产生脉冲引脚
sbit Echo = P2^4; //回波引脚
sbit DU = P2^6;
sbit WE = P2^7;
bit flag=0;
uint time,s,timer;
uchar a,b,c,d;
void delay(uchar n) //延时1us函数
{
uchar i;
for(i=0;i<n;i++)
{
_nop_();
}
}
void delaym(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start() // 触发超声波测距模块
{
// delaym(800);
Trig=1;
delay(60);
Trig=0;
}
void conut() //计算距离
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
s=time/58;
a=s/1000;
b=s%1000/100;
c=s%100/10;
d=s%10;
}
void display(uchar a,uchar b,uchar c,uchar d) //显示距离
{
if(flag==1||s>=700)
{
flag=0;
DU=0;
P0=table[10];
DU=1;
DU=0;
WE=0;
P0=0;
WE=1;
WE=0;
delaym(4);
}
else
{
DU=0;
P0=table[a];
DU=1;
DU=0;
WE=0;
P0=0xfe;
WE=1;
WE=0;
delaym(4);
P0=table[b];
DU=1;
DU=0;
P0=0xfd;
WE=1;
WE=0;
delaym(4);
P0=table[c];
DU=1;
DU=0;
P0=0xfb;
WE=1;
WE=0;
delaym(4);
P0=table[d];
DU=1;
DU=0;
P0=0xf7;
WE=1;
WE=0;
delaym(4);
}
}
void main()
{
TMOD=0x01;//设置定时器0工作方式
TH0=0;
TL0=0;
ET0=1;//允许定时器0中断
EA=1; //开总中断
while(1)
{
start();
while(!Echo); //当RX为零时等待
TR0=1; //开启计数
while(Echo); //当RX为1计数并等待
TR0=0; //关闭计数
conut(); //计算
display(a,b,c,d);
}
}
void time0 () interrupt 1
{
flag=1;
}
距离近没问题距离过远就会出现一点问题 |