搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2013-1-10 21:49:59 | 显示全部楼层 |阅读模式
    我用的是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>

#define  TRIG P1_1
#define  ECHO P0_1
#define  LED  P2_0

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

int flag=0;
unsigned int data,s,time;
unsigned char disbuff[3]={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[0]=(int)s/100;
          disbuff[1]=(int)(s-disbuff[0]*100)/10;
          disbuff[2]=(int)(s-disbuff[0]*100-disbuff[1]*10);
          lcdUpdateChar(1,0,disbuff[0]+0x30);
          lcdUpdateChar(1,1,disbuff[1]+0x30);
          lcdUpdateChar(1,2,disbuff[2]+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++);}
}





阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-1-11 16:18:26 | 显示全部楼层
哪位高手赐教啊,另问:资料上写的5V,可以用3.3V驱动吗?

出0入0汤圆

 楼主| 发表于 2013-1-13 19:38:57 | 显示全部楼层
问题解决了,有兴趣的可以看看这个http://blog.sina.com.cn/s/blog_874c0ff10101571r.html

出0入0汤圆

发表于 2013-3-13 10:22:44 | 显示全部楼层
楼主有遇到过距离不稳定的问题?比如你设置的是1米报警,结果距离不止1米也能报警。

出0入0汤圆

 楼主| 发表于 2013-3-13 14:45:40 | 显示全部楼层
rengf3134 发表于 2013-3-13 10:22
楼主有遇到过距离不稳定的问题?比如你设置的是1米报警,结果距离不止1米也能报警。

...


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

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

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


我说的有点乱

出0入0汤圆

发表于 2013-3-13 17:58:18 | 显示全部楼层
呵呵,你的解释是检测到之后延时1秒,而检测不到则等待,这个和1秒检测1次是不一样的,1秒检测1次表示你等待的时间最多1秒。
另外,看了你的微波,我特地去把超声波模块上电测了一下,ECHO上电是低电平,不是高电平。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表