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

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; 
 }
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
libin200899
2019-03-25 08:57
计时器清零之后也不是很好使,我估计是受外界信号的干扰,使程序进入一个陌生的领域,处于死循环了。所以后来我又在程序中加入了看门狗,一旦不能收到回波或者是判断出得距离大于最大测量距离的话立即复位从来再来,这样就解决了无法持续向串口发送数据的问题。不过这好像是偷了点懒,耍了点小聪明。

一周热门 更多>