嵌入式系统 - 定时器/计数器
-
简述
timer是一种特殊类型的时钟,用于测量时间间隔。从零向上计数以测量经过的时间的计时器通常称为stopwatch. 它是从指定的时间间隔开始倒计时并用于产生时间延迟的设备,例如,沙漏就是计时器。counter是一种存储(有时显示)与时钟信号相关的特定事件或过程发生次数的设备。它用于计算微控制器外部发生的事件。在电子学中,计数器可以很容易地使用寄存器类型的电路(例如触发器)来实现。 -
定时器和计数器的区别
区分定时器和计数器的要点如下 -计时器 计算器 寄存器在每个机器周期递增。 考虑到对应于外部输入引脚(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 位用于指定位置。Gate − 设置时,定时器仅在 INT(0,1) 为高时运行。C/T − 计数器/定时器选择位。M1 − 模式位 1。M0 − 模式位 0。门
每个计时器都有启动和停止的方法。有些计时器通过软件来实现,有些通过硬件来实现,有些则同时具有软件和硬件控制。8051 定时器具有软件和硬件控制。定时器的启动和停止由软件使用指令控制SETB TR1 和 CLR TR1 对于定时器 1,和 SETB TR0 和 CLR TR0 0 小时。SETB 指令用于启动它,它由 CLR 指令停止。只要 TMOD 寄存器中的 GATE = 0,这些指令就会启动和停止定时器。通过使 TMOD 寄存器中的 GATE = 1,定时器可以由外部源启动和停止。C/T(时钟/定时器)
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 通信而没有错误。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位定时器,是常用的模式。除了使用所有 16 位之外,它的功能与 13 位模式相同。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”被称为 split-timer mode. 当定时器 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 已溢出。