调试超声波测距模块的时候出现的问题

2019-03-24 19:46发布

这两天调试超声波测距模块出现了各种稀奇古怪的问题,这里我就展现给大家 最新的问题,希望能得到大家的解答。   先贴出来电路吧。 1.jpg 我想将采集到的数据显示到串口中,在接收到上位机的0xaa命令后,回送数据。 现在的结果是,如果距离在2m以下,数据能够实时地更新并且能够会送回上位机。 但是等到距离超过这个范围,也就意味着收不到回波,就进入了死状态,上位机 不能再接收数据了。除非复位或者重启。 代码如下: #include <stc12c5a16s2.H>
#include <stdio.h>
#include "delay.h"
#define uint unsigned int
#define uchar unsigned char sbit Trig=P1^2;
sbit Echo=P3^2;
sbit led=P1^0;
bit RxDataFlag=0;
bit TimeoutFlag=0; uchar txt[5];
uchar cnt;
unsigned long distance;
void UartInit()
{
 TMOD=0x21;
 SCON=0x50;
 TH0=0;
 TL0=0;
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
 ET0=1;
 ES=1;
 EX0=1;
 IT0=1;
 PS=1;
 EA=1;
} void SendWave()
{
 Trig=0;
 delay_us(5);
 Trig=1;
 delay_us(20);
 while(!Echo);
 TR0=1;
 while(Echo);
 TR0=0;
} void CountDistance()
{
 if((distance>=4500)||TimeoutFlag==1) //超出测量范围显示“-”
 { 
   TimeoutFlag=0;
   printf("----- ");
   return;
 }
 txt[0]=distance/1000+'0';
 txt[1]=distance%1000/100+'0';
 txt[2]=distance%100/10+'0';
 txt[3]=distance%10+'0';
 txt[4]=' ';
} void SendData(uchar *p)
{
 uchar i;
 TI=0;
 for(i=0;i<5;i++)
 {
  SBUF=*(p+i);
  while(TI==0);
  TI=0;
 } 
} void main()
{
 UartInit(); 
 while(1)
 {
send:
  SendWave();
  CountDistance();
  if(RxDataFlag==1)
  {
   if(TimeoutFlag==1)
   {
    TimeoutFlag=0;
    goto  send;
   }
   else
   {
     ES=0;
    SendData(txt);
    ES=1;
   }
   RxDataFlag=0;
  }
 }
}     void Ex0Ser() interrupt 0
{
 uint time;
 time = TH0<<8 | TL0;
 distance = (time * 1.76)/10;//mm
 TH0=0;
 TL0=0; } void Timer0Ser() interrupt 1
{
 cnt++;
 if(cnt==20)
 {
  cnt=0;
  TimeoutFlag=1;
 }
} void UartSer() interrupt 4
{
 uchar RxData;
 RI=0;
 RxData=SBUF;
 P1=RxData;
 
 if(RxData==0xaa)
 {
  RxDataFlag=1; 
 }
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。