#include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define _nop_ #define K P0 sbit du=P2^6; sbit we=P2^7; sbit Trig=P2^0; sbit Echo=P2^1; uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x... #include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define _nop_
#define K P0
sbit du=P2^6;
sbit we=P2^7;
sbit Trig=P2^0;
sbit Echo=P2^1;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint dis,H=10;L=0;
uchar flag=0,high_time,low_time,m=0;
uchar qian,bai,shi,ge;
void delay(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<50;a++);
}
void xian_shi(uchar num)
{
qian=num/1000;
bai=num/1000%100;
shi=num/10;
ge=num%10;
we=1;
P0=0xfe;
we=0;
P0=0xff;
du=1;
P0=tab[qian];
du=0;
delay(5);
we=1;
P0=0xfb;
we=0;
P0=0xff;
du=1;
P0=tab[bai];
du=0;
delay(5);
we=1;
P0=0xfd;
we=0;
P0=0xff;
du=1;
P0=tab[shi];
du=0;
delay(5);
we=1;
P0=0xf7;
we=0;
P0=0xff;
du=1;
P0=tab[ge];
du=0;
delay(5);
}
/***************超声波测量函数*******************/
void ce()
{
uchar i;
float temp;
TH0=1;
TL0=0;
TR0=1;
for(i=8;i>0;i--)
{
Trig=!Trig;
_nop_;_nop_;_nop_;
_nop_;_nop_;_nop_;
_nop_;_nop_;_nop_;
}
Trig=1;
delay(5);
EX0=1; //开中断
if(flag==1) //中断标志位置,说明有回波
{
temp=high_time*256+low_time;
temp=(temp/1000)/2;
temp*=340;
temp=temp/10;
dis=(unsigned int)temp;
flag=0;
}
}
void time_init()
{
TMOD=0x01;
TH0=0;
TL0=0; //设定T0的工作模式为,装初值
EA=1;
IT0=1; //下降沿有效,左传感器,INT1为调边沿触发
}
void main()
{
time_init();
while(1)
{
ce(); //发送超声波信号测距
xian_shi(dis); //显示距离
}
}
void timer0() interrupt 1
{
uint tmp;
TR0=0; //关闭定时器
ET0=0; //关闭外部中断
flag=1; //置位标志位
tmp=TH0*256+TL0; //读取定时器的值
if((tmp>0)&&(tmp<60000)) //判断是否超出范围
{
high_time=TH0;
low_time=TL0;
}
else
{
high_time=0;
low_time=0;
}
}