zigbee网关 cc2530终端裸机驱动超声波测距模块HC-SR04

HC-SR04是一款集成度比较高的超声波测距模块,外形很小巧借用图片一张

zigbee网关 cc2530终端裸机驱动超声波测距模块HC-SR04_第1张图片

对外有4根线:

Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd

使用方法很简单:Trig线给一个10us以上的高电平,看Echo引脚高电平的持续时间,

距离=(高电平时间*声速(340M/S))/2


对于CC2530终端开发板来说,使用T3定时器来计算高电平的时间,

用Time3的Channel0的输入捕获功能来计算时间,由于Time3是8位定时器,而高电平的持续时间又远远大于8位定时器最大定时时间,所以还得加一个计数器指示定时器转了几圈

zigbee网关 cc2530终端裸机驱动超声波测距模块HC-SR04_第2张图片

Time3的使用的外设引脚可以是P1_3,P1_4,P1_6,P1_7

根据zigbee网关 CC2530网关开发板之终端开发板可用的IO,只有P1_3可以用,虽然P1_3已经连接上了按键,但是如果不按按键的话不影响输入捕获

控制端直接接到了led灯上面


CC2530与超声波测距模块的连接方法:

Vcc             ---------------     +5V

Trig(控制端) ---------     P0_1

Echo(接收端)--------     P1_3

Gnd      --------------------     GND


定时器的初始化函数

void tim_init(void)
{
    T3CTL |= 0x08 ;     //开溢出中断     
    T3IE = 1;           //开总中断和T3中断
    T3CTL|=0XE0;        //128分频,16M/128=125K,1/125K=8us
    T3CTL &= ~0X04;     //自动重装 00->0xff 
    T3CC0=0xff;
    
    T3CCTL0 = 0x43;       //开启channal0中断,输入捕获模式,上升沿下降沿捕捉
    P1SEL |= (1<<3);      //P1_3定时器输入捕获,第二功能 
    
    
    T3CTL |=0X10;       //启动
    EA = 1; 
}


定时器中断函数:

#pragma vector = T3_VECTOR 
__interrupt void T3_ISR(void) 
{ 
  if(T3CH0IF == 1)
  {
    //高电平开始计数
    if(P1_3 == 1)
    {
      cycle = 0;
      count = 0;
      count_start = T3CC0;
      LED2 = 0;
    }
    else
    {
      count = T3CC0 - count_start + 0xFF * cycle;
      //count* 1/125K * 340/2
      float distanceCM = count* 0.136;
      uart_send(buffer,sprintf(buffer, "%f cm\r\n",distanceCM));
      LED2 = 1;
    }
  }
  else
  {
    cycle++;
  }
  T3IF = 0x00;
}

用手做测试:

zigbee网关 cc2530终端裸机驱动超声波测距模块HC-SR04_第3张图片

成功了!数一直在增大时因为我用手里超声波的距离变大了
更多资料请关注 http://web.nenewind.com

下一步准备把超声测距程序放到zstack中,敬请关注。。。

你可能感兴趣的:(Zigbee)