话说室友买了块超声波测距模块,一直没有用。正好被我搞过来,调试之。调试过程中遇到了一个小问题,不过伴随着成功解决,结果还是令人欢喜的。

这个模块叫DYP-ME007,一块红色的电路板,引出五个引脚,显得活泼时尚。阅读其技术资料,发现真是简介明了.....

VCC引脚要求接5v,不够5v经验证不能正常工作..TRIG引脚用来主机发出10us的高电平,以驱动模块内部发出超声波,超声波经过反射接受,模块内部自动处理,在ECHO引脚输出一个脉宽和距离成正比的PWM信号.OUT引脚悬空..不知道是用来做什么的...按理说可以检测发出时间和受到波形的时间,然后用声速来计算距离..但是在试验中却发现这个时间几乎是不变的..不知道为什么..大家一起研究哈..

因为最近在做只能家居,可能各种计时器用的多,所以在这里写了一个不用计时器的.占用两个io口.


#include <msp430x14x.h>
int temp[2],check;
int main( void )
{
  int i;
  WDTCTL = WDTPW + WDTHOLD;
  P2DIR|=0xff;
  P2OUT&=~BIT1;
  P2DIR&=~BIT2;
  _DINT();
  BCSCTL1&=~XT2OFF;                 //采用xt2高频晶振
  do
  {
    IFG1&=~OFIFG;
    for(i=0xff;i>0;i--);
  }
  while(IFG1&OFIFG);
  _EINT();
  BCSCTL2|=SELM_2+SELS+DIVS_3;            //mclk 与 smclk选择高频
  TACTL|=TASSEL_2;                //ta选择smclk   8分频
  TACTL|=MC_1;
    CCR0=10;

//时钟选择高频的可以提高精度
    P2OUT|=BIT1;
    while(!TACTL&BIT0); 
    TACTL&=~(TAIFG+MC_1);            
    P2OUT&=~BIT1;                           //发送完成10us的高电平 

//10us作为一个驱动信号
    TACTL|=MC_2;   //增计数模式
    while(!(P2IN&BIT2));       //此处千万注意,!P2IN&BIT2与!(P2IN&BIT2)的区别...运算符的优先级问题.  要不你一辈子调不成功的

    TACTL&=~MC_2;        //收到了ECHO信号,先停止时钟,再读TAR
    temp[0]=TAR;
    if(TAR>10)             //经过试验如果收不到ECHO信号,会瞬间返回一个高电平,然后持续一个相对的高电平.
    {                                   //所以用if判断  使程序不进入死循环
    TACTL|=MC_2;
    while(P2IN&BIT2);
    TACTL&=~MC_2;
    temp[1]=TAR;               //记录高电平结束时的TAR
    check=temp[1]-temp[0];    //在此处设置断点以观察结果
    }
  }

这个程序还可以通过P2中断来写,以节省功耗,不过唤醒过程中,可能会有延迟...

同样可以用计时器的捕获模式来做,这里P2.1作为了TRIG,P2.2作为了ECHO