秀文
获得 0 次赞
帮助过2人
求指点MSP430F149驱动超声波模块程序,不能正常工作 #include #define RISE 1 #define FALL 0 #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) #define uint unsigned int #define uchar unsigned char #define Trig_H P1OUT|=BIT0 #define Trig_L P1OUT&=~BIT0 uint TA_Over_Cnt;//TA溢出次数存放变量 unsigned long int Period;//脉宽存放结果变量 unsigned long int S; uint distance; uint RiseCapVal;//上升沿时刻捕获值存放变量 uchar Edge=1;//当前触发沿 uchar disbuff[4]="0.00"; void Init_clock() { uint i; BCSCTL1=0X00;//将寄存器的内容清零 //XT2振荡器开启 //LFTX1工作在低频模式 //ACLK的分频因子为一 do { IFG1&=~OFIFG; BCSCTL2|=SELM_2+SELS;//设置MCLK 和SMCLK为8M for (i=0x20;i>0;i--); } while((IFG1&OFIFG)==OFIFG);//如果OSCFault=1 BCSCTL2=0X00;//将寄存器的内容清空 BCSCTL2+=SELM1; //MCLK 的时钟源为TX2CLK,分频因子为1 BCSCTL2+SELS;//SMCLK TX2CLK的时钟源为TX2CLK,分频因子为1 } void Init_IO()//I/O口初始化函数 { P1DIR|=BIT0;//P1,0 口作为Trig输出口 P1DIR&=~BIT1;//P1,1 口作为Echor输入口 P1SEL|=BIT1;//P1,1 口为 Echor第二功能开启 Trig_H; delay_ms(1000); } void Init_TimerA() { TACTL|=TASSEL_2+MC_2+ID_3;//,连续计数SMCLK TACCTL0 |=CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式开启,CCI1 } void main () { WDTCTL=WDTPW+WDTHOLD;//关闭看门狗 Init_clock(); Init_TimerA(); Init_IO(); TACCTL0 |=CAP+CM_1+CCIS_0+SCS+CCIE;//CCI1A _EINT(); while(1) { P1OUT|=BIT0; delay_ms(10); P1OUT&=~BIT0; } } #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A(void) { switch(TAIV) { case 0: if(Edge==RISE) { RiseCapVal = TACCR0; TACCTL0 |= CAP+CM_2+CCIS_1+SCS+CCIE;//改为下降沿捕获 Edge = FALL;//下降沿捕获标志 } else { _DINT(); Period = TACCR0-RiseCapVal; S=(Period*17)/100; TACCR0 = 0; TACCTL0|= CAP+CM_1+CCIS_1+SCS+CCIE;//改为上升沿捕获 Edge = RISE;//上升沿捕获标志 _EINT(); } break; case 10: TA_Over_Cnt++;_EINT(); break; } }