Embedded Systems 简明教程
Embedded Systems - Timer/Counter
timer 是一种用于测量时间间隔的特殊时钟类型。经常被称为用于测量经过时间从零向上计数的计时器 stopwatch 。它是一种根据指定时间间隔倒数并用于产生时间延迟的设备,例如,沙漏是一种计时器。
counter 是一种存储(有时显示)特定事件或过程相对于时钟信号发生次数的设备。它用于计算微控制器外部发生的事件。在电子领域,可以使用寄存器类型电路(例如触发器)轻松实现计数器。
Difference between a Timer and a Counter
将计时器与计数器区分开来的点如下:
Timer |
Counter |
寄存器在每个机器周期中递增。 |
寄存器在考虑其对应于外部输入引脚 (T0, T1) 的 1 到 0 的转换时递增。 |
最大计数率为振荡器频率的 1/12。 |
最大计数率为振荡器频率的 1/24。 |
计时器使用内部时钟的频率,并产生延迟。 |
计数器使用外部信号来计算脉冲。 |
Timers of 8051 and their Associated Registers
8051 有两个定时器,Timer 0 和 Timer 1。它们可用作定时器或事件计数器。Timer 0 和 Timer 1 均为 16 位宽。由于 8051 遵循 8 位架构,因此每个 16 位可作为低字节和高字节的两个独立寄存器访问。
Timer 0 Register
Timer 0 的 16 位寄存器以低字节和高字节的形式访问。低字节寄存器称为 TL0(Timer 0 低字节),高字节寄存器称为 TH0(Timer 0 高字节)。这些寄存器可像任何其他寄存器一样访问。例如,指令 MOV TL0, #4H 将值移入 Timer #0 的低字节。
Timer 1 Register
Timer 1 的 16 位寄存器以低字节和高字节的形式访问。低字节寄存器称为 TL1(Timer 1 低字节),高字节寄存器称为 TH1(Timer 1 高字节)。这些寄存器可像任何其他寄存器一样访问。例如,指令 MOV TL1, #4H 将值移入 Timer 1 的低字节。
TMOD (Timer Mode) Register
Timer 0 和 Timer 1 都使用相同的寄存器来设置各种定时器操作模式。这是一个 8 位寄存器,其中低 4 位留给 Timer 0,高 4 位留给定时器。在每种情况下,低 2 位用于预先设置定时器模式,而高 2 位用于指定位置。
Gate − 设置后,定时器仅在 INT(0,1) 为高电平时运行。
C/T − 计数器/定时器选择位。
M1 − 模式位 1。
M0 − 模式位 0。
GATE
每个定时器都有启动和停止的方法。一些定时器通过软件执行此操作,一些通过硬件执行,还有一些同时具有软件和硬件控制。8051 定时器具有软件和硬件控制。定时器的启动和停止由软件使用指令 SETB TR1 和 CLR TR1 (对于定时器 1)以及 SETB TR0 和 CLR TR0 (对于定时器 0)控制。
SETB 指令用于启动它,而 CLR 指令用于停止它。只要 TMOD 寄存器中的 GATE = 0,这些指令就会启动和停止定时器。通过使 TMOD 寄存器中的 GATE = 1,定时器可以由外部源启动和停止。
C/T (CLOCK / TIMER)
TMOD 寄存器中的此位用于决定是否使用定时器作为 delay generator 或 event manager 。如果 C/T = 0,则将其用作定时器延迟生成。用于创建时延的时钟源是 8051 的晶体频率。如果 C/T = 0,则附加到 8051 的晶体频率也决定了 8051 定时器以规则间隔发出的滴答声的速度。
定时器频率总是附加到 8051 的晶体频率的 1/12。尽管基于 8051 的各种系统具有 10 MHz 到 40 MHz 的 XTAL 频率,但我们通常使用 11.0592 MHz 的 XTAL 频率。这是因为 8051 的串行通信波特率。XTAL = 11.0592 允许 8051 系统与 PC 通信且无错误。
Different Modes of Timers
Mode 0 (13-Bit Timer Mode)
在模式 0 下的 Timer 1 和 Timer 0 均作为 8 位计数器运行(带 32 位预分频器)。定时器寄存器配置为一个 13 位寄存器,由 TH1 的所有 8 位和 TL1 的低 5 位组成。TL1 的高 3 位是不确定的,应该忽略。设置运行标志 (TR1) 不会清除寄存器。当计数从所有 1 到所有 0 时,将设置定时器中断标志 TF1。对于 Timer 0,模式 0 操作与 Timer 1 相同。
Mode 1 (16-Bit Timer Mode)
定时器模式 "1" 是一个 16 位定时器,是一种常用的模式。它的工作方式与 13 位模式相同,只是使用了所有 16 位。TLx 从 0 开始递增,最大为 255。达到值 255 后,TLx 重置为 0,然后 THx 递增 1。作为一个完整的 16 位定时器,该定时器最多可以包含 65536 个不同的值,并且在 65536 个机器周期后会溢出回 0。
Mode 2 (8 Bit Auto Reload)
两个定时器寄存器均配置为具有自动重新加载的 8 位计数器(TL1 和 TL0)。TL1(TL0)溢出将设置 TF1(TF0),并使用软件预设的 Th1(TH0)的内容重新加载 TL1(TL0)。重新加载不会改变 TH1(TH0)。
自动重新加载模式的好处在于,你可以让定时器始终包含 200 到 255 的值。如果你使用模式 0 或 1,你必须在代码中检查溢出,然后在这种情况下,将定时器重置为 200。在这种情况下,宝贵的指令会检查值和/或重新加载。在模式 2 中,微控制器会处理这一切。一旦你在模式 2 中配置了一个定时器,你不必担心检查定时器是否溢出,也不必担心重置值,因为微控制器硬件会为你完成这一切。自动重新加载模式用于建立一个通用的波特率。
Mode 3 (Split Timer Mode)
定时器模式 "3" 称为 split-timer mode 。将 Timer 0 设置为模式 3 时,它将变为两个独立的 8 位定时器。Timer 0 是 TL0,Timer 1 是 TH0。这两个定时器从 0 计数到 255,并在溢出的情况下重置回 0。Timer 1 的所有位现在都将链接到 TH0。
当 Timer 0 处于分解模式时,真正的 Timer 1(即 TH1 和 TL1)可以设置为模式 0、1 或 2,但它不能启动/停止,因为执行此操作的位现在链接到 TH0。真正的定时器 1 将在每个机器周期内递增。
Initializing a Timer
决定定时器模式。考虑运行持续且独立于任何外部管脚的 16 位定时器。
初始化 TMOD SFR。使用 TMOD 的最低 4 位,并考虑定时器 0。将两个位,GATE 0 和 C/T 0,保持为 0,因为我们想要定时器独立于外部管脚。由于 16 位模式是定时器模式 1,因此清除 T0M1,并设置 T0M0。实际上,唯一要开启的是 TMOD 的第 0 位。现在执行以下指令 −
MOV TMOD,#01h
现在,定时器 0 处于 16 位定时器模式,但定时器未运行。要以运行模式启动定时器,通过执行以下指令设置 TR0 位 −
SETB TR0
现在,定时器 0 将立即开始计数,每隔一个机器周期递增一次。