定时器/计数器的定时和计数功能本质上是石英晶体振荡器在一个周期内产生高低电平。振荡的每个周期即为定时器的基本单元,例如12MHz的石英晶体振荡器,其频率为12MHz,经过12分频后其输出频率为1MHz,即此时其周期为 1/1MHz=1μs ,每个周期中分为高低电平两部分,每个高电平会让THX和TLX组成的累加器加一,若累加N次,则说明时间过了Nμs,但不同工作方式的定时器/计数器其累加上限由THX和TLX的组成方式决定,以工作方式1的16位定时器/计数器为例:其累加范围为0~65535,当累加次数达到65536时发生溢出,此时累加器清零,即16位定时器/计数器最大计时和计数为65536μs(当累加值为65535时不发生溢出,必须要累加到65536才能发生溢出,因此可累加65536次)。为了使用方便,我们可以给THX和TLX设定初值,例如设置THX和TLX的初值为64536,则当累加器累加1000次,即时间过了1ms后发生溢出,此时可累加溢出次数来获得所需时间。
工作方式1原理图
定时器/计数器的配置
定时器/计数器的相应功能需要配置相关参数后才能使用,好比打开一个电路的一些开关,才能让其发挥相应作用。
TMOD(定时器/计数器模式寄存器)
不可位寻址,即智能整体配置,不能单独配置
高四位配置定时器1,低四位配置定时器0
GATE=0,此时与外部信号无关,仅有定时器/计数器中断
C/T:为0时是定时器,为1时是计数器
M1和M0:控制定时器/计数器4种工作方式
其中定时计数一般用方式1,方式2一般用于串口通信中设定波特率(波特率是单位时间内传输的二进制数位数,用于描述传输信息的速率)
TCON(定时器/计数器控制寄存器)
可位寻址,即可以单独配置
其高四位用于定时器/计数器,低四位用于配置外部中断
TF1和TF0:溢出中断标志位,每当发生溢出后置一,当CPU相应中断请求后硬件自动清零,也可以由软件置一和清零,其一般用于查询测试的标志。
TR0和TR1:置0时,关闭定时器/计数器。置一时,若GATE=0则形成定时器/计数器中断,若GATE=1,则形成外部中断。
#include <regx52.h>
void Timer0_Init()
{
TMOD&=0xF0; //高四位不变,低四位清零,其目的为在不改变定时器1的状态下来配置定时器零
TMOD|=0x01; //高四位不变,低四位置一,选择定时器0,工作方式1
TH0=0xFC; //给定时器赋初值,让每次发生溢出时时间为1ms
TL0=0x18;
TR0=1; //打开定时器
ET0=1; //打开定时器0中断允许
EA=1; //打开总中断
}
//void time0() interrupt 1 //定时器0中断函数,每次定时器溢出后都会跳转到中断函数中
//{
// TH0=0xFC;
// TL0=0x18;
// count++;
// if(count==1000) //定时为1s
// {
// count=0;
//
// }
//}
此代码为定时器0模块化部分
此文用于记录学习过程,本人小白一个,如有错误请大佬指出