8051定时器
在Intel 8051中,有两个16位定时器寄存器。这些寄存器称为Timer0和Timer1。定时器寄存器可以用两种模式使用。这两种模式是定时器模式和计数器模式。这两种模式之间唯一的区别是递增定时器寄存器的来源。
定时器模式
在定时器模式下,计数内部机器周期。因此,此寄存器在每个机器周期中递增。因此,当时钟频率为12MHz时,定时器寄存器在每个毫秒递增。在此模式下,它忽略外部定时器输入引脚。
计数器模式
在计数器模式下,计数外部事件。在此模式下,对于外部输入引脚的每次1到0转换,定时器寄存器都会递增。这种类型的转换被视为事件。外部输入引脚在每个机器周期中采样一次,并且为了确定1或0转换,将需要另一个机器周期。因此,在此模式下,至少需要两个机器周期。当频率为12MHz时,最大计数频率将为12MHz/24 = 500KHz。因此,对于事件计数,时间持续时间为2 µs。
定时器或计数器有四种不同的模式。模式0到模式2适用于定时器/计数器。模式3对每个定时器寄存器都有不同的含义。有一个称为TMOD的寄存器。可以对该寄存器进行编程以配置这些定时器或计数器。
串口在模式1和3中用于串行通信。Timer1用于生成波特率。因此,只有Timer0可用于定时器或计数器操作。
Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.
TMOD寄存器
TMOD(定时器模式)是SFR。此寄存器的地址为89H。它不是按位寻址的。
定时器 | Timer1模式 | Timer0模式 | ||||||
---|---|---|---|---|---|---|---|---|
位细节 | 门控 (G) | C/T | M1 | M0 | 门控 (G) | C/T | M1 | M0 |
现在,让我们看看控制定时器运行的电路。
在下表中,我们将看到位细节及其对于高值或低值的不同的操作。
位细节 | 高值(1) | 低值(0) |
---|---|---|
C/T | 配置为计数器操作 | 配置为定时器操作 |
门控 (G) | 当TCON寄存器的TRX位为高时,Timer0或Timer1处于运行模式。 | 当TCON寄存器的TRX位为高且INT0或INT1为高时,Timer0或Timer1处于运行模式。 |
位细节 | 00 | 01 | 10 | 11 |
---|---|---|---|---|
M1 M0 | 这是模式0。(8位定时器/计数器,带5位预分频器) | 这是模式1。(16位定时器/计数器) | 这是模式3(8位自动重载定时器/计数器) | 这是模式3(功能取决于Timer0或Timer1) |
当定时器或计数器处于模式0到2时,门控位将为高。
示例
要将Timer0配置为16位事件计数器并将Timer1配置为8位自动重载计数器,我们可以使用位模式0 0 1 0 0 1 0 1。它相当于25H。如果要使用此位模式编程TMOD寄存器,可以使用此指令
MOVTMOD, #25H
执行上述指令后,定时器/计数器将由软件控制。要将系统配置为硬件控制模式,则门控位将为1。因此,位模式将为1 0 1 0 1 1 0 1 = ADH
我们可以使用此指令
MOVTMOD, #0ADH
定时器/计数器的模式0
模式0操作是带5位预分频器的8位定时器或计数器。因此,它是13位定时器/计数器。它使用TL0或TL1的5位和TH0或TH1的所有8位。
在此示例中,选择了Timer1,在这种情况下,对于计数器操作的每32(25)个事件或定时器操作的每32个机器周期,TH1寄存器将递增1。当TH1从FFH溢出到00H时,TCON寄存器的TF1将变为高,并且它将停止定时器/计数器。例如,我们可以说,如果TH1保持F0H,并且它处于定时器模式,则在10H * 32 = 512个机器周期后,TF1将变为高。
MOVTMOD, #00H MOVTH1, #0F0H MOVIE, #88H SETB TR1
在上面的程序中,Timer1被配置为定时器模式0。在这种情况下,Gate = 0。然后将TH1加载为F0H,然后启用Timer1中断。最后设置TCON寄存器的TR1,并启动定时器。
定时器/计数器的模式1
模式1操作是16位定时器或计数器。在下图中,我们对Timer0使用模式1。
在这种情况下,对于计数器操作的每个事件或定时器操作的机器周期,TH0-TL0寄存器对将递增1。当寄存器对从FFFFH溢出到0000H时,TCON寄存器的TF0将变为高,并且它将停止定时器/计数器。例如,我们可以说,如果TH0-TL0寄存器对保持FFFF0H,并且它处于定时器模式,则在10H = 16个机器周期后,TF0将变为高。当时钟频率为12MHz时,以下指令在Timer0开始运行后16 µs产生中断。
MOVTMOD, #01H MOVTL0, #0F0H MOVTH0, #0FFH MOVIE, #82H SETB TR0
在上面的程序中,Timer0被配置为定时器模式1。在这种情况下,Gate = 0。然后将TL0加载为F0H,并将TH0加载为FFH,然后启用Timer0中断。最后设置TCON寄存器的TR0,并启动定时器。
定时器/计数器的模式2
模式2操作是8位自动重载定时器或计数器。在下图中,我们对Timer1使用模式2。
在这种情况下,对于计数器操作的每个事件或定时器操作的机器周期,TL1寄存器将递增1。当寄存器对从FFH溢出到00H时,TCON寄存器的TF1将变为高,并且TL1也将重新加载TH1的内容并再次开始操作。
例如,我们可以说,如果TH1和TL1寄存器都保持F0H并且它处于定时器模式,则在10H = 16个机器周期后,TF1将变为高。当时钟频率为12MHz时,这发生在16 µs之后,然后以下指令在Timer1开始运行后每16 µs产生一次中断。
MOVTMOD, #20H MOVTL1, #0F0H MOVTH1, #0F0H MOVIE, #88H SETBTR1
在上面的程序中,Timer1被配置为定时器模式2。在这种情况下,Gate = 0。然后将TL1和TH1加载为F0H。然后启用Timer1中断。最后设置TCON寄存器的TR1,并启动定时器。
当串口以模式1或3工作时,模式2下的Timer1生成所需的波特率。
定时器/计数器的模式3
模式3对于Timer0和Timer1是不同的。当Timer0以模式3工作时,TL0将用作8位定时器/计数器。它将由标准Timer0控制位T0和INT0输入控制。TH0用作8位定时器,但不作为计数器。这由Timer1控制位TR1控制。当TH0从FFH溢出到00H时,TF1设置为1。在下图中,我们可以看到模式3下的Timer0。
当Timer1以模式3工作时,它只是保持计数而不运行。当Timer0处于模式3时,Timer1配置为模式0、1或2之一。在这种情况下,Timer1不能中断微控制器。当TF1由TH0定时器使用时,Timer1用作波特率发生器。
模式3下Timer0和Timer1中门控位的含义如下
它像模式0、1或2一样控制8位定时器/计数器TL0的运行。TH0的运行仅由TR1位控制。因此,此模式下Timer0的门控位没有特定作用。
模式3用于需要额外8位定时器/计数器的应用程序。在Timer0的模式3中,8051具有三个定时器。一个由TH0提供的8位定时器,另一个由TL0提供的8位定时器/计数器,以及一个由Timer1提供的16位定时器/计数器。
如果Timer0处于模式3,并且Timer1正在运行模式0、1或2,则当门控位为低或INT1为高时,将激活Timer1的运行控制。当门控位为高且INT1为低时,将停用运行控制。