超声波测距的原理大家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; } }
|