打印

大家来讨论讨论关于超声波测距模块

[复制链接]
1933|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shaojunyun|  楼主 | 2012-2-8 12:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我的超声波测距在串口上显示的程序:
    #include   <reg51.h>
    #include   <intrins.h>
    #include   <STDIO.H>

    #define uchar unsigned  char
    #define uint  unsigned   int  
  

    unsigned int  time=0;
    unsigned int  timer=0;
    float         S=0;
    bit           flag =0;
    sbit RX=P1^1;      //Echo  回响信号输出
    sbit TX=P1^2;    //Trig     触发信号,信号输入

/********************************************************/
    void Conut(void)
    {
     time=TH0*256+TL0;
     TH0=0;
     TL0=0;
     S=(time*1.7)/100;     //算出来是CM
     if(flag==1)            //超出测量
     {
      flag=0;
      printf("-----\n");
     }
      printf("S=%f\n",S);
    }
/********************************************************/
void delayms(unsigned int ms)
{
    unsigned char i=100,j;
    for(;ms;ms--)
    {
        while(--i)
        {
            j=10;
            while(--j);
        }
    }
}
/********************************************************/
     void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                             //中断溢出标志
  }
/********************************************************/

   void  StartModule()                  //T1中断用来扫描数码管和计800MS启动模块
  {
      TX=1;                             //800MS  启动一次模块
      _nop_();                        
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();              
      TX=0;
  }
/********************************************************/
void main(void)
{  
    TMOD=0x21;    //设T1为方式2(用于串口的波特率发生)设T0为方1,GATE=1;
    SCON=0x50;    //串口
    TH1=0xFD;    //串口
    TL1=0xFD;    //串口
    TH0=0;
    TL0=0;
    TR0=1;  
    ET0=1;             //允许T0中断
    TR1=1;               //开启定时器
    TI=1;

    EA=1;               //开启总中断

    while(1)
    {
        StartModule();
        while(!RX);        //当RX为零时等待  ,为1时开启计数
        TR0=1;                //开启计数
        while(RX);            //当RX为1计数并等待,为0时关闭计数,此段时间及超声波发射到返回时间
        TR0=0;                //关闭计数
        Conut();            //计算
//        delayms(100);        //100MS
        if(S<100.0)       //此处的点灯是拿来检验之用,不必深究
            P0=0x00;
        else
            P0=0xff;
    }
}

现在针对这个程序有两个问题
1、我把延时那句话屏蔽之后,在串口上能飞快的显示距离,至少50次/s的显示速度,但是有了那句话,在串口上显示距离就很慢,大概1s中才显示一次距离的测量值,问题就在此,我只延时了100毫秒,串口显示的速度怎么就相差这么大??
2、对于省略延时语句的那个程序,当距离一定时 串口能连续显示,如果距离骤然变化(如在传感器前放一本书 或者 把原先挡住传感器的书本拿走),串口显示就会忽然停止。  当是对于有延时语句的那个程序,则不会有这种现象,能正确测量远近的距离,不管怎么变化,只是测量周期确实长了点啊!
下面附上我的两张窗口显示的截图

相关帖子

沙发
shaojunyun|  楼主 | 2012-2-8 12:07 | 只看该作者
再加一份我的传感器的使用说明
HY-SRF05 使用手册明书.pdf (434.63 KB)

使用特权

评论回复
板凳
shaojunyun|  楼主 | 2012-2-8 12:09 | 只看该作者
说明一下  :
第一幅截图是 距离改变,骤然停止的截图,
第二幅是正常连续显示的串口截图

使用特权

评论回复
地板
shaojunyun|  楼主 | 2012-2-11 09:52 | 只看该作者
没有人帮帮忙么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

29

帖子

1

粉丝