一切依据用户手册,会看手册你就是爸爸,不会看你就是弟弟
定时器累加
/*配置DCO频率为1MHz*/
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
/*设置P1.6为输出*/
P1DIR |= BIT6;
/*设置时钟源为SMCLK*/
TA1CTL |= TASSEL_2;
/*设置工作模式为Up Mode*/
TA1CTL |= MC_1;//Up Mode模式下,16bit Timer计数器 TAR会从0递增到TACCR0,然后回到0,重复这个过程
/*设置定时间隔*/
TA1CCR0 = 49999;//1MHz 计 50000个数,1/1MHz * 50000 20Hz 0.05s
if(TA1CTL & TAIFG)
{
cnt ++;
TA1CTL &= ~TAIFG;
if(cnt == 20)//0.05s * 20 = 1s
{
P1OUT ^= BIT6;
cnt = 0;
}
}
定时器中断
/*开启TAIFG中断*/
TA1CTL |= TAIE;
/*打开全局中断*/
__bis_SR_register(GIE);
__interrupt void Time_Tick(void)
{
static uint8_t cnt = 0;
switch(TA1IV)
{
case 0x02:
break;
case 0x04:
break;
case 0x0A:
cnt ++;
if(cnt == 20)
{
cnt = 0;//清零计数器
flag = 1;//1s 到了
currenttime ++;//时间加1
currenttime %= 86400;//一天24小时,防止超出
}
break;
default:
break;
}
}
输出pwm
/*设置时钟源为SMCLK*/
TA1CTL |= TASSEL1;
/*设置工作模式为Up&Down*/
TA1CTL |= MC0|MC1;
/*设置TA1CCR0为0x00FF*/
TA1CCR0 = 0x00FF;
/*设置TA1CCR2为0x00FF*/
TA1CCR2 = 0x00FF;//占空比(TACCR0 - TACCR2) / TACCR0,频率=SMCLK/(TACCR0+1)/2
/*设置为比较模式*/
TA1CCTL0 &= ~CAP;
TA1CCTL2 &= ~CAP;
/*设置比较输出模式*/
TA1CCTL2 |= OUTMOD_6;
/*设置IO复用*/
P2SEL |= BIT5;
P2DIR |= BIT5;
先加后减
for(cnt = 0;cnt < 0x00FF;cnt ++)
{
TA1CCR2 = cnt;
__delay_cycles(5000);
}
for(cnt = 0x00FF;cnt > 0;cnt --)
{
TA1CCR2 = cnt;
__delay_cycles(5000);
}