嵌入式系统 - 定时器/计数器
定时器是一种专门的时钟,用于测量时间间隔。一个从零开始向上计数以测量经过时间的定时器通常称为秒表。它是一种从指定的时间间隔倒计时的设备,用于生成时间延迟,例如,沙漏就是一个定时器。
计数器是一种存储(有时还显示)特定事件或过程发生的次数的设备,相对于时钟信号而言。它用于计数微控制器外部发生的事件。在电子学中,可以使用寄存器类型的电路(如触发器)非常容易地实现计数器。
定时器和计数器的区别
区分定时器和计数器的要点如下:
定时器 | 计数器 |
---|---|
每个机器周期寄存器都会递增。 | 寄存器递增考虑其对应于外部输入引脚(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 的低字节中。
定时器 1 寄存器
定时器 1 的 16 位寄存器被访问为低字节和高字节。低字节寄存器称为 TL1(定时器 1 低字节),高字节寄存器称为 TH1(定时器 1 高字节)。这些寄存器可以像任何其他寄存器一样访问。例如,指令MOV TL1, #4H 将值移动到定时器 1 的低字节中。
TMOD(定时器模式)寄存器
定时器 0 和定时器 1 都使用相同的寄存器来设置各种定时器操作模式。它是一个 8 位寄存器,其中低 4 位留给定时器 0,高 4 位留给定时器。在每种情况下,低 2 位用于预先设置定时器模式,高 2 位用于指定位置。
门控- 设置后,定时器仅在 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(时钟/定时器)
TMOD 寄存器中的此位用于确定定时器是作为延迟发生器还是事件管理器使用。如果 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 通信而不会出现错误。
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),并将 TL1(TL0)重新加载为 Th1(TH0)的内容,后者由软件预设。重载使 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 已溢出。