前言
关于定时器的好处,我就不一一多说了,至少可以摆脱Delay()函数的不精准计时。
什么是定时器?说白了就是精准的计数,数时间而已啊。因此我们只需要怎么使用它,不需要了解他的构造。
那么我们怎么利用定时器来控制LED灯的闪烁呢?
首先配置输出模式
/*设置P.0为输出模式*/
P1DIR|=0x01;
我们需要确定使用哪个定时器。这里我们使用Timer1;
然后需要给定时器分频
定时器1控制寄存器T1CTL
该寄存器可以设置计数模式,比如自由模式、模计数模式等,还可以设置分频系数,是不分频,还是其他分频。
/*设置定时器T1,128分频,模计数模式*/
T1CTL|=0x0E;
然后我们可以设置计数到哪个值(可以不配置),之时候就需要用到存数寄存器。由于定时器是16位寄存器,所以有高位寄存器和低位寄存器。
/*通道0,装入定时器初值62500*/
T1CC0L=62500%256;
T1CC0H=62500/256;
然后,我们需要设置该定时器是干什么的,是捕获,还是比较,用哪种方式触发,是上升沿还是下降沿。这时候我们需要用到端口0捕获/比较控制寄存器T1CCTL0。
捕获/比较寄存器
/*比较模式*/
T1CCTL0|=0x04;
最后需要使能定时器中断,和总中断。
T1IE=1;//使能Timer1中断
EA=1;//开启总中断
把上面的代码,写在void Timer1_init()里
初始化完后,我们需要编写中断函数
#pragma vector=T1_VECTOR
__interrupt void T1_ISR(void)
{
LED1=!LED;
}
最后附上主函数的代码
void main()
{
CLOCKinit();//系统时钟初始化
LEDinit();//LED初始化
Timer1_init();//定时器Timer1的初始化
while(1)
{}
}
关于定时器1我们讲到这里,下次博客我们讲讲定时器3和4,它们与定时器1有什么不同。