求助:用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++);}
}
哪位高手赐教啊,另问:资料上写的5V,可以用3.3V驱动吗? 问题解决了,有兴趣的可以看看这个http://blog.sina.com.cn/s/blog_874c0ff10101571r.html 楼主有遇到过距离不稳定的问题?比如你设置的是1米报警,结果距离不止1米也能报警。
rengf3134 发表于 2013-3-13 10:22 static/image/common/back.gif
楼主有遇到过距离不稳定的问题?比如你设置的是1米报警,结果距离不止1米也能报警。
...
我做的是测距,至于报警就不是很了解了 其实就是测距,通过判断这个距离值来决定是否要报警。另外我想说,楼主对你程序里的
while(!ECHO);//一直在此等待ECHO变为高电平
理解如何。换句话说我现在需要每隔1秒测一次距离,怎么做到,有考虑过这个吗 rengf3134 发表于 2013-3-13 15:31 static/image/common/back.gif
其实就是测距,通过判断这个距离值来决定是否要报警。另外我想说,楼主对你程序里的
while(!ECHO);//一直在 ...
你说的每一秒测一次距离,可以在每一次测距完成之后,用一个延时函数来实现,即延时1s。
另外关于echo的电平变化,你可以用示波器观察,看是不是接收到了回波信号,就来一个高电平。
关于这句while(!ECHO);,就是echo脚空闲为低电平,(!ECHO)=1停在这里,等待回波。若回波到来,echo变为高电平,(!ECHO)=0,则往下执行。这个应该没问题吧。
另,建议你用定时器来计高电平的时间,这样会比较准确一些。 rengf3134 发表于 2013-3-13 15:31 static/image/common/back.gif
其实就是测距,通过判断这个距离值来决定是否要报警。另外我想说,楼主对你程序里的
while(!ECHO);//一直在 ...
我说的有点乱 呵呵,你的解释是检测到之后延时1秒,而检测不到则等待,这个和1秒检测1次是不一样的,1秒检测1次表示你等待的时间最多1秒。
另外,看了你的微波,我特地去把超声波模块上电测了一下,ECHO上电是低电平,不是高电平。{:smile:}
页:
[1]