7908|5

186

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

调试超声波测距模块的时候出现的问题 [复制链接]

这两天调试超声波测距模块出现了各种稀奇古怪的问题,这里我就展现给大家

最新的问题,希望能得到大家的解答。

 

先贴出来电路吧。

我想将采集到的数据显示到串口中,在接收到上位机的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("-----\n");
   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; 
 }
}

此帖出自51单片机论坛

最新回复

楼主不要首先怀疑干扰的问题,程序本身必须能够应对这种状况,靠看门狗只是掩盖了问题而非解决了问题。  详情 回复 发表于 2011-9-3 05:56
点赞 关注
 

回复
举报

4138

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
谢谢分享,俺来看看支持一下
此帖出自51单片机论坛
 
 
 

回复

1万

帖子

141

TA的资源

版主

板凳
 
任何测距器都不能超出使用距离范围,程序上应该做个判断即对应的时间窗口内没有收到回波信号则给出一个“无障碍”的信号,或者在程序上直接跳转并将计时器等归零,就像首次开始测试一样。
此帖出自51单片机论坛
 
 
 

回复

186

帖子

0

TA的资源

纯净的硅(中级)

4
 

回复 板凳 chunyang 的帖子

计时器清零之后也不是很好使,我估计是受外界信号的干扰,使程序进入一个陌生的领域,处于死循环了。所以后来我又在程序中加入了看门狗,一旦不能收到回波或者是判断出得距离大于最大测量距离的话立即复位从来再来,这样就解决了无法持续向串口发送数据的问题。不过这好像是偷了点懒,耍了点小聪明。
此帖出自51单片机论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

5
 
楼主有没有用过分离的超声波测距啊 就是自己做发射和接收电路 这两天我也在玩测距 前几天是接收不到信号 现在是接收信号 可是数据是错的 并且很乱 好像是外界干扰 不知道怎么解决
此帖出自51单片机论坛
 
 
 

回复

1万

帖子

141

TA的资源

版主

6
 
楼主不要首先怀疑干扰的问题,程序本身必须能够应对这种状况,靠看门狗只是掩盖了问题而非解决了问题。
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表