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

📅  最后修改于: 2021-01-07 05:50:40             🧑  作者: Mango


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

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

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

区分计时器和计数器的要点如下-

Timer Counter
The register incremented for every machine cycle. The register is incremented considering 1 to 0 transition at its corresponding to an external input pin (T0, T1).
Maximum count rate is 1/12 of the oscillator frequency. Maximum count rate is 1/24 of the oscillator frequency.
A timer uses the frequency of the internal clock, and generates delay. A counter uses an external signal to count pulses.

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 Mode
0 0 13-bit timer mode.
0 1 16-bit timer mode.
1 0 8-bit auto reload mode.
1 1 Spilt mode.

计时器的不同模式

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

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

模式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”被称为分定时器模式。将定时器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这2位保持为0,因为我们希望定时器独立于外部引脚。由于16位模式是定时器模式1,因此清除T0M1并将其设置为T0M0。实际上,唯一要打开的位是TMOD的位0。现在执行以下指令-

MOV TMOD,#01h

现在,计时器0处于16位计时器模式,但计时器未运行。要在运行模式下启动计时器,请通过执行以下指令将TR0位置-

SETB TR0

现在,定时器0将立即开始计数,每个机器周期增加一次。

读一个计时器

可以通过两种方式读取16位定时器。要么以16位数字的形式读取计时器的实际值,要么检测计时器何时溢出。

检测计时器溢出

当定时器从最大值溢出到0时,微控制器自动将TCON寄存器中的TFx位置1。因此,可以检查TFx位而不是检查计时器的确切值。如果设置了TF0,则定时器0溢出;否则,定时器0溢出。如果设置了TF1,则定时器1溢出。