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 的低字节。

timer0

Timer 1 Register

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

timer1

TMOD (Timer Mode) Register

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

tmod

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

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

M1 − 模式位 1。

M0 − 模式位 0。

GATE

每个定时器都有启动和停止的方法。一些定时器通过软件执行此操作,一些通过硬件执行,还有一些同时具有软件和硬件控制。8051 定时器具有软件和硬件控制。定时器的启动和停止由软件使用指令 SETB TR1CLR TR1 (对于定时器 1)以及 SETB TR0CLR TR0 (对于定时器 0)控制。

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

C/T (CLOCK / TIMER)

TMOD 寄存器中的此位用于决定是否使用定时器作为 delay generatorevent 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

Mode

0

0

13-bit timer mode.

0

1

16-bit timer mode.

1

0

8-bit auto reload mode.

1

1

Spilt mode.

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 将立即开始计数,每隔一个机器周期递增一次。

Reading a Timer

可以两种方式读取 16 位定时器。读取定时器的实际值作为 16 位数字,或者检测定时器什么时候溢出。

Detecting Timer Overflow

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