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

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条回答
chunyang
2019-03-25 04:14
任何测距器都不能超出使用距离范围,程序上应该做个判断即对应的时间窗口内没有收到回波信号则给出一个“无障碍”的信号,或者在程序上直接跳转并将计时器等归零,就像首次开始测试一样。

一周热门 更多>