求指点MSP430F149驱动超声波模块程序,不能正常工作
#include <msp430f149.h>
#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;
}
}
此帖出自
小平头技术问答
一周热门 更多>