关于C51单片机的定时器基本认识
本文对C51单片机的定时器进行介绍,本文是本人在对C51单片机定时器的学习中的总结,适合想对51单片机定时器进行简单了解的同学。
定时器在单片机内部就像小闹钟一样,根据时钟的输出信号,每间隔”1s“,计数单元的数值就增加一。当计数单元数值增加到”设定的闹钟提醒时间“时,计数单元就会向中断系统发送中断请求,产生”响铃提示“,是程序跳转到中断服务程序中执行。
定时器的作用:1.用于计时系统,可用于软件的计时,可以使得程序每隔一段固定的时间进行一段操作。2:代替长时间的Delay,提高CPU的云运行效率和处理速度。
定时器的介绍及配置
51单片机中定时器的个数是3个,分别是定时器0、定时器1和定时器2。本文中主要介绍的是定时器0和定时器1的用法。这两种定时器也是比较常用的。
定时器的工作模式主要有四种,分别是模式0、模式1、模式2、和模式3。本文章主要介绍的是模式1(16位的定时器)。
其工作模式图为:
此模式,定时器配置为16位定时器,由TL0和TH0的8位所构成。TL0的8位溢出向TH0进位,TH0计数溢出位置TCON中的溢出标志位TR0。因此,从上图中可以知道,当GATE=0(TMOD.3)时,经过非门,此时会输出1,再经过或门,由于或门的特性,就可以知道其信号经过或门之后会一直输出是1,因此与门的输出主要由TR0控制。因此在配置定时器的时候,可以将TR0=1。
之后配置定时器的初值,初值主要由高八位TH0和低八位TL0决定。值的范围是0~65535。而在这个范围内,每隔数字加1就上升1us。因此总共是65535us,因此配置1ms的时候,因该从64535开始,但是,又因为前面可能有其他人的使用了定期器1,因此,不能直接赋值,因此在定义定时器0的时候,需要将TMOD&=0xF0,保持高位不变,TMOD|=0x01,定义定时器0。最后再将标志位置为0,即**TF0=0,**定时器配置完毕。
中断服务程序配置
由图可知,定时器T0的中断服务程序需要ET0=1和EA=1就能导通,PT0的含义是,是否将该主动设置位优先。因此,可以是0或者1,对应的就是优先级的关闭和打开。
中断函数:关键字interrupt
void Timer0_Routie() interrupt 1
{
要执行的函数
}
总结:
综上:需要完成打开定时器中断服务程序。实现步骤为:
1.配置定时器TMOD,设置要打开的定时器。
2.配置TCON,清除标志位和打开定时器使能。
3.根据自己的需要赋值初值。
4.配置定时器中断服务程序。
5.根据需要编写中断函数(尽量不要执行耗时任务)----记得将初值重新赋值,否则将重新从0开始计数。
例程程序
void Timer0Init() //1毫秒、12.000MHz
{
//配置定时器
TMOD &= 0xF0; //设置定时器模式(TMOD)
TMOD |= 0x01; //设置定时器模式
//配置TCON
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//配置初值
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
///配置中断服务程序
ET0=1;
EA=1;
PT0=0; //优先级关闭
}
void Timer0_Routie() interrupt 1
{
static unsigned int T0Count; //静态局部变量,退出函数时候不丢失值
//重新赋初值
TL0 = 0x18; //设置定时初值(高位)
TH0 = 0xFC; //设置定时初值(低位)
T0Count++;
if(T0Count>=1000)
{
T0Count=0; //重新计数
}
}
PS:纯本人学习心得总结!!!老鸟不用理会。QQ:1151800181