前言
前面讲了利用定时器3的查询方式来实现LED1的闪烁,那么我们怎么用中断方式控制呢?今天,我们主要来讨论这个话题。
那么我们想想,应该怎么让定时器3产生中断呢?
无非也就这几步骤:分频、打开溢出中断、装数、使能定时器3中断,使能总中断、启动计数。
那么分频需要用到哪个寄存器呢?
前章博客也讲过了,需要用到
定时器3的控制寄存器T3CTL
T3CTL|=0XE0; //128分频
接着就是打开溢出中断了
定时器3的控制寄存器T3CTL
T3CTL |= 0x08 ; //开溢出中断
然后就是向定时器3放一个数进去
定时器3的控制寄存器T3CTL
T3CTL &= ~0X03; //自动重装0x00---0xFF
然后再开启定时器3的中断和总中断
T3IE = 1; //开Timer3中断
EA = 1; //开总中断
最后启动定时器3
T3CTL |=0X10; //启动
因此我们可以将上面的代买封装成一个函数,方便以后代码的使用
void Timer3_interrupt_init()
{
T3CTL|=0XE0; //128分频,
T3CTL |= 0x08 ; //开溢出中断
T3CTL &= ~0X03; //自动重装0x00---0xFF
T3IE = 1; //开Timer3中断
EA = 1; //开总中断
T3CTL |=0X10; //启动
}
做完上面的还不够,我们需要写中断函数
#pragma vector = T3_VECTOR //Timer3中断向量
__interrupt void T3_ISR(void)
{
IRCON = 0x00; //清中断标志, 也可由硬件自动完成
if((++count)>254) //254次中断后LED取反,闪烁一轮(0.5 秒时间)
{
count = 0; //计数清零
LED1=~LED1;
}
}
最后我附上主函数的代码
void main(void)
{
LEDinit(); //调用初始化函数
Timer3_interrupt_init();
while(1)
{
}
}
通过上面的例子,我们很快就能掌握定时器的基本使用,有不懂得童鞋可以在下面留言。下期我们讲讲DMA。