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

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条回答
鑫海宝贝
1楼-- · 2019-03-24 22:45
谢谢分享,俺来看看支持一下
chunyang
2楼-- · 2019-03-25 04:14
任何测距器都不能超出使用距离范围,程序上应该做个判断即对应的时间窗口内没有收到回波信号则给出一个“无障碍”的信号,或者在程序上直接跳转并将计时器等归零,就像首次开始测试一样。
libin200899
3楼-- · 2019-03-25 08:57
计时器清零之后也不是很好使,我估计是受外界信号的干扰,使程序进入一个陌生的领域,处于死循环了。所以后来我又在程序中加入了看门狗,一旦不能收到回波或者是判断出得距离大于最大测量距离的话立即复位从来再来,这样就解决了无法持续向串口发送数据的问题。不过这好像是偷了点懒,耍了点小聪明。
烟雨任平生
4楼-- · 2019-03-25 11:24
 精彩回答 2  元偷偷看……
chunyang
5楼-- · 2019-03-25 13:26
楼主不要首先怀疑干扰的问题,程序本身必须能够应对这种状况,靠看门狗只是掩盖了问题而非解决了问题。

一周热门 更多>