超声波测距的原理大家Google一下就应该知道了,因此基于MSP430的超声波主要是调整时钟就行了。
代码如下:
#include "msp430f5529.h" #include "usart.h" #include "stdio.h"   double a = 1.111;        long long next;         
 
 
  int tim = 0;           void SetVcoreUp (unsigned int level) {   PMMCTL0_H = PMMPW_H;   SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;   SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;   while ((PMMIFG & SVSMLDLYIFG) == 0);   PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);   PMMCTL0_L = PMMCOREV0 * level;   if ((PMMIFG & SVMLIFG))     while ((PMMIFG & SVMLVLRIFG) == 0);   SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;   PMMCTL0_H = 0x00; }   void set(void) {   volatile unsigned int i;   WDTCTL = WDTPW+WDTHOLD;                      P1DIR |= BIT1;                               P1DIR |= BIT0;                               P1SEL |= BIT0;   P2DIR |= BIT2;                               P2SEL |= BIT2;   P7DIR |= BIT7;                               P7SEL |= BIT7;         SetVcoreUp (0x01);   SetVcoreUp (0x02);   SetVcoreUp (0x03);   UCSCTL3 = SELREF_2;                          UCSCTL4 |= SELA_2;                           __bis_SR_register(SCG0);                     UCSCTL0 = 0x0000;                            UCSCTL1 = DCORSEL_7;                         UCSCTL2 = FLLD_0 + 762;                      __bic_SR_register(SCG0);                       __delay_cycles(782000);   do   {     UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);                                                  SFRIFG1 &= ~OFIFG;                         }while (SFRIFG1&OFIFG);                      P6DIR |= BIT0;   }   void main() {     set();     WDTCTL = WDTPW+WDTHOLD;                        UART_Init();                       P3DIR |= BIT6;             P3OUT &=~ BIT6;            P3DIR &=~ BIT5;           P3IN &=~ BIT5;              P2DIR |= 0X00;        P2IFG = 0X00;       P2IE = BIT0;         P2IES = BIT0;       P2IN = BIT0;       P2OUT = BIT0;         P2REN = BIT0;          __enable_interrupt();            P1SEL |= BIT4;         P1DIR |= BIT4;         P1DS |= BIT4;        P1OUT &=~ BIT4;          while(1)     {         P3OUT = BIT6;           __delay_cycles(4);         P3OUT &=~ BIT6;         P2OUT &=~ BIT0;         __delay_cycles(40000);     } }     #pragma vector=PORT2_VECTOR     __interrupt void Port2_ISR(void) {       unsigned int temp;        if((P2IN&0X01)!=0X01)     {         temp=P2IFG;              P2IFG=0x00;          if(temp==0x01)         {             P2OUT = BIT0;                            TA0CCTL0 = CCIE;             TA0CCR0 = 20000;             TA0CTL = TASSEL_2 + MC_1 + TACLR;                   __bis_SR_register(GIE);             while((P3IN&0X20) == 0X20);                          TA0CTL = MC0;                            printf("next = %ld\n",TA0R);           }     } }   #pragma vector = TIMER0_A0_VECTOR __interrupt void TIMER0_A0_ISR(void) {     tim++;     if(a>10)     {         tim = 0;         P3OUT = BIT6;           __delay_cycles(4);          P3OUT &=~ BIT6;     }   }
 
  |