51单片机的定时/计数器中有两个寄存器:
他们的控制通过两个特殊功能寄存器实现, 其中:
两个定时器都有一根连接外部的引脚P3.4,P3.5,用于接入外部计数脉冲信号。
当软件设置T0或T1启动定时/计数器后,他们会由硬件自动运行。无需CPU干预,直到计数器溢出后才会通过中断让CPU进行后续的处理。
以下是TMOD的寄存器组成:
下面是对其中每一位的说明:
位 | 符号 | 功能 |
---|---|---|
TMOD.7 | GATE | TMOD.7控制定时器1,置1时只有在 I N T 1  ̄ \overline {INT1} INT1脚为高及TR1控制位置1时才可打开定时器/计数器1。 |
TMOD.3 | GATE | TMOD.7控制定时器1,置1时只有在 I N T 0  ̄ \overline {INT0} INT0脚为高及TR1控制位置1时才可打开定时器/计数器1。 |
TMOD.6 | C/ T  ̄ \overline {T} T | TMOD.6控制定时器1用作定时器或计数器,清零则用作定时器(从内部系统时钟输入),置1用作计数器(从T1/P3.5脚输入) |
TMOD.2 | C/ T  ̄ \overline {T} T | TMOD.2控制定时器0用作定时器或计数器,清零则用作定时器(从内部系统时钟输入),置1用作计数器(从T0/P3.4脚输入) |
TMOD.5/TMOD.4 | M1 M0 | 定时器/计数器1模式选择 |
TMOD.1/TMOD.0 | M1 M0 | 定时器/计数器0模式选择 |
定时/计数器的模式选择,其对应模式如下:
T1定时器:
M1 | M0 | 模式 |
---|---|---|
0 | 0 | 13位定时器/计数器,兼容8048定时模式,TL1只用低5位参与分频,TH1整个8位全用。 |
0 | 1 | 16位定时器/计数器,TL1、TH1全用 |
1 | 0 | 8位自动重装载定时器,当溢出时将TH1存放的值自动重装入TL1 |
1 | 1 | 定时器/计数器1此时无效(停止计数) |
T0定时器:
M1 | M0 | 模式 |
---|---|---|
0 | 0 | 13位定时器/计数器,兼容8048定时模式,TL0只用低5位参与分频,TH0整个8位全用。 |
0 | 1 | 16位定时器/计数器,TL0、TH0全用 |
1 | 0 | 8位自动重装载定时器,当溢出时将TH0存放的值自动重装入TL0 |
1 | 1 | 定时器0此时作为双8位定时器/计数器。TL0作为一个8位定时器/计数器,通过标准定时器0的控制位控制。TH0仅作为一个8位定时器,由定时器1的控制位控制 |
这里不介绍具体原理,读者知道以下几点即可:
关于定时/计数器的初值a与定时时间t的关系:
t
=
(
2
16
?
a
)
?
12
/
f
O
S
C
t = ( 2^{16} - a ) \cdot 12/ f_{OSC}
t=(216?a)?12/fOSC?
因此,当时钟频率为12MHz时,方式1的定时范围为1~65536μs
计数器初值a与计数值N的关为:
N
=
2
16
?
a
N = 2^{16} - a
N=216?a
因此,方式1的计数范围为1~65536个脉冲
当M1M0 = 10 时,定时/计数器工作于方式2
需要知道的有:
定时方式2的定时时间t和计数初值分别按下式计算:
t = ( 2 8 ? a ) ? 12 / f O S C a = 2 8 ? t ? f O S C / 12 t = (2^8 - a) \cdot 12 / f_{OSC} \\ a = 2^8 - t \cdot f_{OSC} /12 t=(28?a)?12/fOSC?a=28?t?fOSC?/12
方式2可以产生非常精确的定时时间,适合作用于串行口波特率发生器
计数初值a与计数值N的关系为:
N
=
2
8
?
a
N = 2^8 - a
N=28?a
当M1M0 = 00 时,定时/计数器工作于方式0
需要知道的有以下几点:
方式0的定时时间t与计数初值a分别按照下式计算:
t
=
(
2
13
?
a
)
?
12
/
f
O
S
C
a
=
2
13
?
t
?
f
O
S
C
/
12
t = (2^{13} - a) \cdot 12 / f_{OSC} \\ a = 2^{13} - t \cdot f_{OSC}/12
t=(213?a)?12/fOSC?a=213?t?fOSC?/12
计数初值a与计数值N的关系为:
N
=
2
13
?
a
N = 2^{13} - a
N=213?a
当M1M0 = 11时,定时/计数器工作于方式3
方式3与其他方式不同,方式3时,单片机可以组合出3种定时/计数器关系: