#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
//sbit beep=P2^3;
sbit cf=P3^3;
uint num,num1,
timel,timeh,t,TX,RX;//TX发出信号标志位 RX接收信号标志位
int s,n1,n2,n3,c_mq=15,c_zd=500;//盲区,最大值
//double s;
void csb();//测距子程序
void delay10us()
{
uchar a;
for(a=2;a>0;a--);
}
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(int bai,int shi,int ge)
{
dula=0;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=0;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
dula=0;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(5);
}
void init()
{
cf=0;
TMOD=0X11;
TH0=0xFC;
TL0=0x66;
TH1=0;
TL1=0;
EA=1;
ET0=1;
ET1=1;
EX0=1;//
IT0=1;//负跳变外部中断触发
RX=0;
TX=0;
}
void main()
{
init();
TR0=1;
while(1)
{
csb();
// if(s>c_zd)//大于最大值
// {
// n1=0x39;
// n2=0x39;
// n3=0x39;
// }
// else if(s<c_mq)//小于盲区
// {
// n1=0x40;
// n2=0x40;
// n3=0x40;
// }
// else
// {
display(n1,n2,n3);
// }
}
}
void csb()
{ int i;
if(TX==1)//发出信号标志
{
cf=1;
delay10us();
cf=0;
TR1=1;
i=40;//避免回波直接接收
while(i--);
i=0;
while(!RX)//达到一定时间判定已接收
{ i++;
if(i>24500)
RX=1;
}
TR1=0;
timel=TL1;
timeh=TH1;
t=timeh*256+timel;
s=0.000109*t*172;//
n1=s/100;
n2=s%100/10;
n3=s%10;
TR0=1;
RX=0;
}
}
void int0() interrupt 0
{
TR1=0;
RX=1;//»Ø²¨½ÓÊÕ±ê־λ
}
void t0() interrupt 1 //1秒更新一次
{
TH0=0xFC; //1毫秒
TL0=0x66;
num1++;
if(num1>1000)
{
num1=0;
TX=1;//·¢³ö³¬Éù²¨±ê־λ
TR0=0;
}
}
void t1() interrupt 3//高脉冲计时。
{
TH1=0;
TL1=0;
}
一周热门 更多>