测距程序哪里错了?望高手指点

2019-07-15 22:46发布

#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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。