/**********(一)定時(shí)器A 比較模式*************/
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //關(guān)看門(mén)狗
BCSCTL1 =CALBC1_1MHz; //設定DCO 為1MHZ
DCOCTL =CALBC1_1MHZ;
P1DIR |=BIT0; //LED 使能
TACTL=TASSEL1+TACLR; //定時(shí)器A 時(shí)鐘源為SMCLK,并清TAR
CCTL0 |=CCIE; //CCR0 中斷使能
CCR0 =50000; //計數值為50000 個(gè)SMCLK 周期
TACTL |=MC1; //啟動(dòng)定時(shí)器A 為連續計數模式
_BIS_SR(GIE+CPUOFF);
return 0;
}
#pragma vector = TIMERA0_VECTOR //ccr0 中斷服務(wù)
__interrupt void ta0_isr(void)
{
P1OUT ^=BIT0; //LED 翻轉
CCR0 +=50000; //定時(shí)補償
}
/**********(二)定時(shí)器A 捕獲模式************/
volatile unsigned int cap_value; //存兩次捕值之差
int main( void )
{
volatile unsigned int first_value,second_value,n;
WDTCTL=WDTPW+WDTHOLD; //關(guān)看門(mén)狗
BCSCTL1 =CALBC1_8MHZ; //設定DCO 為1MHZ
DCOCTL =CALBC1_8MHZ;
BCSCTL1 |=DIVA_3; //ACLK 輸入八分頻
do //等待晶振穩定
{
IFG1 &=~OFIFG;
for(n=5000;n>0;n--);
} while(OFIFG&IFG1);
TACCTL2=CM1+CCIS_1+CAP; //捕獲模式,捕獲上升沿,捕獲內部ACLK
TACTL=TASSEL_2+MC_2+TACLR; //定時(shí)器時(shí)鐘源為SMCLK,啟動(dòng)連續計數,清TAR
TACCTL2 &=~CCIFG; //清CCR2 的標志位
while(!(CCIFG&TACCTL2)); //查CCR2 標志位
first_value=TACCR2; //第一個(gè)捕獲值存入first_value
TACCTL2 &=~CCIFG; //清CCR2 的標志位
while(!(CCIFG&TACCTL2)); //查CCR2 標志位
second_value=TACCR2; //第二個(gè)捕獲值存入second_value
TACCTL2 &=~CCIFG; //清CCR2 的標志位
TACCTL2 &=~MC1; //關(guān)定時(shí)器A
cap_value=(second_value-first_value);
return 0;
} /************(三)定時(shí)器PWM 輸出程序*****************/
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //關(guān)看門(mén)狗
BCSCTL1 =CALBC1_1MHZ; //設定DCO 為1MHZ
DCOCTL =CALBC1_1MHZ; TACTL=TASSEL1+TAR; //SMCLK 為時(shí)鐘源,清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; //啟動(dòng)定時(shí)器A 增計數模式
_BIS_SR(CPUOFF);
return 0;
}