嵌入式系统 - 定时器/计数器

定时器是一种专门的时钟,用于测量时间间隔。从零开始计数以测量经过时间的定时器通常称为秒表。它是一种从指定时间间隔开始倒计时并用于产生时间延迟的设备,例如,沙漏就是一个定时器。

计数器是一种存储(有时显示)特定事件或过程相对于时钟信号发生的次数的设备。它用于计数微控制器外部发生的事件。在电子学中,计数器可以很容易地使用寄存器型电路(例如触发器)来实现。

定时器和计数器之间的区别

定时器和计数器的区别如下 −

定时器 计数器
寄存器在每个机器周期递增。 寄存器在对应于外部输入引脚(T0、T1)的 1 到 0 转换时递增。
最大计数率为振荡器频率的 1/12。 最大计数率为振荡器频率的 1/24。
定时器使用内部时钟的频率,并产生延迟。 计数器使用外部信号来计数脉冲。

8051 的定时器及其相关寄存器

8051 有两个定时器,定时器 0 和定时器 1。它们可用作定时器或事件计数器。定时器 0 和定时器 1 都是 16 位宽。由于 8051 采用 8 位架构,因此每个 16 位都作为低字节和高字节的两个独立寄存器进行访问。

定时器 0 寄存器

定时器 0 的 16 位寄存器作为低字节和高字节进行访问。低字节寄存器称为 TL0(定时器 0 低字节),高字节寄存器称为 TH0(定时器 0 高字节)。这些寄存器可以像任何其他寄存器一样进行访问。例如,指令 MOV TL0, #4H 将值移动到定时器 #0 的低字节中。

Timer 0

定时器 1 寄存器

定时器 1 的 16 位寄存器以低字节和高字节访问。低字节寄存器称为 TL1(定时器 1 低字节),高字节寄存器称为 TH1(定时器 1 高字节)。这些寄存器可以像任何其他寄存器一样访问。例如,指令 MOV TL1, #4H 将值移动到定时器 1 的低字节中。

定时器 1

TMOD(定时器模式)寄存器

定时器 0 和定时器 1 都使用相同的寄存器来设置各种定时器操作模式。它是一个 8 位寄存器,其中低 4 位留给定时器 0,高 4 位留给定时器。在每种情况下,低 2 位用于提前设置定时器模式,高 2 位用于指定位置。

TMOD 寄存器

−设置后,定时器仅在 INT(0,1) 为高电平时运行。

C/T − 计数器/定时器选择位。

M1 − 模式位 1。

M0 − 模式位 0。

GATE

每个定时器都有启动和停止的方法。有些定时器通过软件实现,有些通过硬件实现,有些同时具有软件和硬件控制。8051 定时器同时具有软件和硬件控制。定时器的启动和停止由软件控制,对于定时器 1 使用指令 SETB TR1CLR TR1,对于定时器 0 使用指令 SETB TR0CLR TR0

SETB 指令用于启动定时器,CLR 指令用于停止定时器。只要 TMOD 寄存器中的 GATE = 0,这些指令就会启动和停止定时器。通过在 TMOD 寄存器中设置 GATE = 1,定时器可以由外部源启动和停止。

C/T(时钟/定时器)

TMOD 寄存器中的该位用于决定定时器是用作延迟生成器还是事件管理器。如果 C/T = 0,则将其用作定时器延迟生成的定时器。产生时间延迟的时钟源是 8051 的晶振频率。如果 C/T = 0,则连接到 8051 的晶振频率还决定了 8051 定时器以固定间隔滴答的速度。

定时器频率始终是连接到 8051 的晶振频率的 1/12。尽管各种基于 8051 的系统的 XTAL 频率为 10 MHz 至 40 MHz,但我们通常使用 11.0592 MHz 的 XTAL 频率。这是因为 8051 的串行通信的波特率。XTAL = 11.0592 允许 8051 系统与 PC 进行无错误通信。

M1 / M2

M1 M2 模式
0 0 13 位定时器模式。
0 1 16 位定时器模式。
1 0 8 位自动重新加载模式。
1 1 拆分模式。

定时器的不同模式

模式 0(13 位定时器模式)

模式 0 中的定时器 1 和定时器 0 都作为 8 位计数器运行(带有 32 分频预分频器)。定时器寄存器配置为 13 位寄存器,由 TH1 的所有 8 位和 TL1 的低 5 位组成。TL1 的高 3 位是不确定的,应该忽略。设置运行标志 (TR1) 不会清除寄存器。当计数从全 1 翻转为全 0 时,定时器中断标志 TF1 被设置。定时器 0 的模式 0 操作与定时器 1 相同。

模式 1(16 位定时器模式)

定时器模式"1"是 16 位定时器,是一种常用模式。它的工作方式与 13 位模式相同,只是使用了所有 16 位。TLx 从 0 开始递增,最大为 255。一旦达到值 255,TLx 重置为 0,然后 THx 递增 1。作为一个完整的 16 位定时器,定时器可能包含最多 65536 个不同的值,并且在 65,536 个机器周期后它将溢出回 0。

模式 2(8 位自动重载)

两个定时器寄存器均配置为具有自动重载功能的 8 位计数器(TL1 和 TL0)。TL1(TL0)的溢出会设置 TF1(TF0),还会使用 Th1(TH0)的内容重新加载 TL1(TL0),该内容由软件预设。重新加载不会改变 TH1(TH0)。

自动重载模式的好处是,您可以让定时器始终包含 200 到 255 之间的值。如果使用模式 0 或 1,则必须检查代码以查看溢出,在这种情况下,将定时器重置为 200。在这种情况下,宝贵的指令会检查值和/或重新加载。在模式 2 中,微控制器会处理此问题。在模式 2 中配置定时器后,您不必担心检查定时器是否溢出,也不必担心重置值,因为微控制器硬件会为您完成所有工作。自动重载模式用于建立通用波特率。

模式 3(分割定时器模式)

定时器模式"3"称为分割定时器模式。当定时器 0 处于模式 3 时,它变为两个独立的 8 位定时器。定时器 0 为 TL0,定时器 1 为 TH0。两个定时器的计数范围均为 0 到 255,如果发生溢出,则重置回 0。定时器 1 的所有位现在都将绑定到 TH0。

当定时器 0 处于分割模式时,真正的定时器 1(即 TH1 和 TL1)可以设置为模式 0、1 或 2,但无法启动/停止,因为执行这些操作的位现在已链接到 TH0。实际定时器 1 将随每个机器周期递增。

初始化定时器

确定定时器模式。考虑一个连续运行且独立于任何外部引脚的 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 将立即开始计数,每个机器周期递增一次。

读取定时器

16 位定时器可以用两种方式读取。要么将定时器的实际值读取为 16 位数,要么检测定时器何时溢出。

检测定时器溢出

当定时器从其最高值溢出到 0 时,微控制器会自动设置 TCON 寄存器中的 TFx 位。因此,无需检查定时器的确切值,只需检查 TFx 位即可。如果设置了 TF0,则定时器 0 已溢出;如果设置了 TF1,则定时器 1 已溢出。