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


定时器是一种特殊类型的时钟,用于测量时间间隔。从零向上计数以测量经过的时间的计时器通常称为秒表。它是一种从指定的时间间隔开始倒计时并用于产生时间延迟的装置,例如沙漏就是计时器。

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

定时器和计数器的区别

定时器与计数器的区别如下:

定时器 柜台
每个机器周期寄存器都会递增。 考虑到对应于外部输入引脚(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 的低字节。

定时器0

定时器1寄存器

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

定时器1

TMOD(定时器模式)寄存器

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

TMOD寄存器

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

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

M1 - 模式位 1。

M0 - 模式位 0。

每个计时器都有启动和停止的方法。有些定时器通过软件来完成此操作,有些定时器通过硬件来完成此操作,有些定时器同时具有软件和硬件控制。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 溢出。