1013850890 发表于 2013-1-10 21:49:59

求助:用cc2430控制超声波测距,为什么测得的一直是固定...

    我用的是cc2430来控制超声波模块HC-SR04(网上买的),cc2430里面是一个加强工业型的51。现在把程序下进去之后,发现LCD上显示的一直是6cm的值,不论不模块怎么放,都是6cm。
用示波器测的TRIG,ECHO口,都有脉冲
下面把程序贴出来,程序是我自己写的,大家看看有不有什么问题。
   #include "ioCC2430.h"   
#include "LCD3310.h"
//#include "LCD3310.c"
#include "hal.h"
#include <stdio.h>
#include <string.h>

#defineTRIG P1_1
#defineECHO P0_1
#defineLEDP2_0

void delay(int n);
void delayms(int n);

int flag=0;
unsigned int data,s,time;
unsigned char disbuff={0,0,0};

void main (void)
{   

    initLcd();
    delay(10);
    lcdUpdateLine(0,"ceju (cm)");

    P1DIR |= 0x02;// 设置P1.1 TRIG为输出,其他默认数输入
   P2INP |= 0x20;   //P0口下拉;

   CLKCON|=0x28;   //选择定时器时钟源1M
    T3CTL|=0xE0;   //预分频为1/128,即(1/128)Mhz
    T3CTL|=0x00;   //定时器3 free-run模式
    TRIG=0;

    while(1)
    {
      TRIG=1;    //发出一个脉冲,启动一个测量周期
      delay(200);//延时200us
      TRIG = 0;//开始测量

      T3CTL|=0x10; //启动定时器3
      while(!ECHO);//一直在此等待ECHO变为高电平
      if(ECHO)
      {
          T3CTL &=~0x10;    //停止计时
          data=T3CNT;          //测量结果
       time=data*128;   //测得的时间 单位us
          s=time*0.0172;//单位为厘米
          //lcd上显示
       disbuff=(int)s/100;
          disbuff=(int)(s-disbuff*100)/10;
          disbuff=(int)(s-disbuff*100-disbuff*10);
          lcdUpdateChar(1,0,disbuff+0x30);
          lcdUpdateChar(1,1,disbuff+0x30);
          lcdUpdateChar(1,2,disbuff+0x30);
          T3CTL|=0x04;//T3计数器清零
         }
       delayms(10);
    }
}


void delay(int n)//延时n微秒
{int i,j;
    for(i=0;i<16;i++)
    {for(j=0;j<n;j++);}
}

void delayms(int n)//延时n毫秒
{long i,j;
    for(i=0;i<16000;i++)
    {for(j=0;j<n;j++);}
}





1013850890 发表于 2013-1-11 16:18:26

哪位高手赐教啊,另问:资料上写的5V,可以用3.3V驱动吗?

1013850890 发表于 2013-1-13 19:38:57

问题解决了,有兴趣的可以看看这个http://blog.sina.com.cn/s/blog_874c0ff10101571r.html

rengf3134 发表于 2013-3-13 10:22:44

楼主有遇到过距离不稳定的问题?比如你设置的是1米报警,结果距离不止1米也能报警。

1013850890 发表于 2013-3-13 14:45:40

rengf3134 发表于 2013-3-13 10:22 static/image/common/back.gif
楼主有遇到过距离不稳定的问题?比如你设置的是1米报警,结果距离不止1米也能报警。

...

   我做的是测距,至于报警就不是很了解了

rengf3134 发表于 2013-3-13 15:31:33

其实就是测距,通过判断这个距离值来决定是否要报警。另外我想说,楼主对你程序里的
while(!ECHO);//一直在此等待ECHO变为高电平
理解如何。换句话说我现在需要每隔1秒测一次距离,怎么做到,有考虑过这个吗

1013850890 发表于 2013-3-13 15:51:07

rengf3134 发表于 2013-3-13 15:31 static/image/common/back.gif
其实就是测距,通过判断这个距离值来决定是否要报警。另外我想说,楼主对你程序里的
while(!ECHO);//一直在 ...

   你说的每一秒测一次距离,可以在每一次测距完成之后,用一个延时函数来实现,即延时1s。
另外关于echo的电平变化,你可以用示波器观察,看是不是接收到了回波信号,就来一个高电平。
关于这句while(!ECHO);,就是echo脚空闲为低电平,(!ECHO)=1停在这里,等待回波。若回波到来,echo变为高电平,(!ECHO)=0,则往下执行。这个应该没问题吧。
   另,建议你用定时器来计高电平的时间,这样会比较准确一些。

1013850890 发表于 2013-3-13 15:53:16

rengf3134 发表于 2013-3-13 15:31 static/image/common/back.gif
其实就是测距,通过判断这个距离值来决定是否要报警。另外我想说,楼主对你程序里的
while(!ECHO);//一直在 ...

我说的有点乱

rengf3134 发表于 2013-3-13 17:58:18

呵呵,你的解释是检测到之后延时1秒,而检测不到则等待,这个和1秒检测1次是不一样的,1秒检测1次表示你等待的时间最多1秒。
另外,看了你的微波,我特地去把超声波模块上电测了一下,ECHO上电是低电平,不是高电平。{:smile:}
页: [1]
查看完整版本: 求助:用cc2430控制超声波测距,为什么测得的一直是固定...