电赛MSP430F5529自写库(基于寄存器)之超声波测距

接线

  • P1.4:echo
  • P1.5:Trig

头文件

#ifndef HC_SR_H_
#define HC_SR_H_


#include<msp430.h>
#include"type.h"


#define Trig1(a)  if(a==1) P1OUT |= BIT5; else P1OUT &= ~BIT5



void US_015_Init(void);
void Hc_sr_Open(void);           //生成一个持续10us的高电平


#endif

C文件

#include "hc_sr.h"

///****************************************************
// * P1.4:echo
// * P1.5:Trig
//****************************************************/

void US_015_Init(void)
{

    P1OUT &= ~( BIT4 + BIT5 );
    P1DIR |=  BIT5;
    P1SEL |=  BIT4;

    TA0CTL   = TASSEL__SMCLK + ID__8 + MC_2 + TACLR + TAIE;
    TA0CCTL3 = CM_1 + SCS +CAP + CCIE + CCIS_0;
}


void Hc_sr_Open(void)           //生成一个持续10us的高电平
{
    Trig1(1);//这里就是把P1.2置1,即P1OUT |= BIT2
    __delay_cycles(250);//这里我把系统时钟升为25MHZ,因此250/25000000=10us
    Trig1(0);           //置0
}


unsigned int cap_new = 0;           // 首次捕捉的ta0r值
unsigned int cap_old = 0;           // 第二次捕捉的ta0r值

char cap_N = 0;                     // 溢出次数
char state = 0x00;                  // 状态
float cap_data ;                  // 距离值,u16

#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{

    switch(__even_in_range(TA0IV,14))//采用这个range函数就是为了使switch函数效率高
    {
      case  0:break;                                 // No interrupt
      case  2:break;                           // CCR1 not used
      case  4: break;                          // CCR2 not used
      case  6:
          state =  TA0CCTL3 >> 14;
          TA0CCTL3 &= ~CCIFG;//标志位清零
          if( TA0CCTL3 & CM_1){//开始捕获高电平时间
              cap_new = TA0CCR3;
              TA0CCTL3 &= ~CM_1;
              TA0CCTL3 |=  CM_2;
          }else if ( TA0CCTL3 & CM_2)
          {
              cap_old = TA0CCR3;
              cap_data =(float)( ( cap_old - cap_new ) * 0.34/10/6.25);//这里外面解释!
              TA0CCTL3 &= ~CM_2;
              TA0CCTL3 |=  CM_1;
          }else
          break;                          // reserved
      case  8: break;                          // reserved
      case 10: break;                          // reserved
      case 12: break;                          // reserved
      case 14:
          TA0CTL &= ~TAIFG;
          if(cap_old   < cap_new ){
              cap_N += 1;
          }
          break;                          // overflow
      default: break;
   }
}

工程文件下载

工程文件

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值