/**********(一)定時器A比較模式*************/
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//關看門狗
BCSCTL1=CALBC1_1MHz;//設定DCO為1MHZ
DCOCTL=CALBC1_1MHZ;
P1DIR|=BIT0;//LED使能
TACTL=TASSEL1+TACLR;//定時器A時鐘源為SMCLK,并清TAR
CCTL0|=CCIE;//CCR0中斷使能
CCR0=50000;//計數(shù)值為50000個SMCLK周期
TACTL|=MC1;//啟動定時器A為連續(xù)計數(shù)模式
_BIS_SR(GIE+CPUOFF);
return0;
}
#pragmavector=TIMERA0_VECTOR//ccr0中斷服務
__interruptvoidta0_isr(void)
{
P1OUT^=BIT0;//LED翻轉
CCR0+=50000;//定時補償
}
/**********(二)定時器A捕獲模式************/
volatileunsignedintcap_value;//存兩次捕值之差
intmain(void)
{
volatileunsignedintfirst_value,second_value,n;
WDTCTL=WDTPW+WDTHOLD;//關看門狗
BCSCTL1=CALBC1_8MHZ;//設定DCO為1MHZ
DCOCTL=CALBC1_8MHZ;
BCSCTL1|=DIVA_3;//ACLK輸入八分頻
do//等待晶振穩(wěn)定
{
IFG1&=~OFIFG;
for(n=5000;n>0;n--);
}while(OFIFG&IFG1);
TACCTL2=CM1+CCIS_1+CAP;//捕獲模式,捕獲上升沿,捕獲內部ACLK
TACTL=TASSEL_2+MC_2+TACLR;//定時器時鐘源為SMCLK,啟動連續(xù)計數(shù),清TAR
TACCTL2&=~CCIFG;//清CCR2的標志位
while(!(CCIFG&TACCTL2));//查CCR2標志位
first_value=TACCR2;//第一個捕獲值存入first_value
TACCTL2&=~CCIFG;//清CCR2的標志位
while(!(CCIFG&TACCTL2));//查CCR2標志位
second_value=TACCR2;//第二個捕獲值存入second_value
TACCTL2&=~CCIFG;//清CCR2的標志位
TACCTL2&=~MC1;//關定時器A
cap_value=(second_value-first_value);
return0;
}
/************(三)定時器PWM輸出程序*****************/
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//關看門狗
BCSCTL1=CALBC1_1MHZ;//設定DCO為1MHZ
DCOCTL=CALBC1_1MHZ;
TACTL=TASSEL1+TAR;//SMCLK為時鐘源,清TAR
CCR0=512;//設定PWM周期
CCTL1|=OUTMOD_7;//CCR1輸出為reset/set模式
CCR1=384;//CCR1的PWM占空比設定
CCTL2|=OUTMOD_7;//CCR2輸出為reset/set模式
CCR2=128;//CCR2的PWM占空比設定
P1SEL|=BIT2+BIT3;//TA1,TA2輸出功能
P1DIR|=BIT2+BIT3;
TACTL|=MC0;//啟動定時器A增計數(shù)模式
_BIS_SR(CPUOFF);
return0;
}





