在 STC51 单片机中,定时器 / 计数器相关的寄存器主要有定时器控制寄存器(TCON)、定时器工作方式寄存器(TMOD)以及定时器初值寄存器(TH0、TL0、TH1、TL1),下面详细解释这些寄存器各位的作用。
1. 定时器控制寄存器(TCON)
- 地址:88H
- 可位寻址:该寄存器的每一位都可以进行单独的位操作。
位序号 | 位名称 | 作用 |
---|---|---|
TCON.7 | TF1 | 定时器 1 溢出标志位。当定时器 1 产生溢出时,硬件自动将 TF1 置 1。如果中断允许(ET1 = 1 且 EA = 1),则会向 CPU 发出中断请求;进入中断服务程序后,硬件自动将其清 0。若采用查询方式处理溢出,则需要软件清 0。 |
TCON.6 | TR1 | 定时器 1 运行控制位。当 TR1 = 1 时,启动定时器 1 开始计数;当 TR1 = 0 时,停止定时器 1 计数。可以通过软件来设置该位的值。 |
TCON.5 | TF0 | 定时器 0 溢出标志位。功能与 TF1 类似,用于表示定时器 0 是否溢出。 |
TCON.4 | TR0 | 定时器 0 运行控制位。功能与 TR1 类似,用于控制定时器 0 的启动和停止。 |
TCON.3 | IE1 | 外部中断 1 请求标志位。当外部中断 1 引脚上出现有效的中断请求信号(根据 IT1 的设置,可为下降沿或低电平触发)时,IE1 被硬件置 1;进入中断服务程序后,硬件自动将其清 0(对于下降沿触发方式)。 |
TCON.2 | IT1 | 外部中断 1 触发方式控制位。当 IT1 = 0 时,外部中断 1 为低电平触发方式;当 IT1 = 1 时,外部中断 1 为下降沿触发方式。 |
TCON.1 | IE0 | 外部中断 0 请求标志位。功能与 IE1 类似,用于表示外部中断 0 是否有中断请求。 |
TCON.0 | IT0 | 外部中断 0 触发方式控制位。功能与 IT1 类似,用于设置外部中断 0 的触发方式。 |
2. 定时器工作方式寄存器(TMOD)
- 地址:89H
- 不可位寻址:对该寄存器的操作需要进行字节操作。
TMOD 分为高 4 位和低 4 位,分别用于控制定时器 1 和定时器 0 的工作方式。
低 4 位(控制定时器 0)
位序号 | 位名称 | 作用 |
---|---|---|
TMOD.3 | GATE | 门控位。当 GATE = 0 时,只要 TR0 = 1,定时器 0 就开始计数;当 GATE = 1 时,只有 TR0 = 1 且外部中断 0(INT0)引脚为高电平时,定时器 0 才开始计数。 |
TMOD.2 | C/T̅ | 定时器 / 计数器选择位。当 C/T̅ = 0 时,作为定时器使用,对内部机器周期进行计数;当 C/T̅ = 1 时,作为计数器使用,对外部引脚 T0 上的脉冲信号进行计数。 |
TMOD.1 | M1 | 工作方式选择位 1。与 M0 一起决定定时器 0 的工作方式。 |
TMOD.0 | M0 | 工作方式选择位 0。与 M1 组合的工作方式如下: - M1M0 = 00:方式 0,13 位定时器 / 计数器。 - M1M0 = 01:方式 1,16 位定时器 / 计数器。 - M1M0 = 10:方式 2,8 位自动重装定时器 / 计数器。 - M1M0 = 11:方式 3,仅适用于定时器 0,将定时器 0 拆分为两个独立的 8 位定时器 / 计数器。 |
高 4 位(控制定时器 1)
高 4 位的功能与低 4 位类似,分别为 GATE(TMOD.7)、C/T̅(TMOD.6)、M1(TMOD.5)和 M0(TMOD.4),用于控制定时器 1 的工作方式。
3. 定时器初值寄存器(TH0、TL0、TH1、TL1)
-
TH0 地址:8CH
-
TL0 地址:8AH
-
TH1 地址:8DH
-
TL1 地址:8BH
-
作用:TH0 和 TL0 共同构成定时器 0 的 16 位初值寄存器,TH1 和 TL1 共同构成定时器 1 的 16 位初值寄存器。在不同的工作方式下,它们的使用方式有所不同:
- 方式 0(13 位定时器 / 计数器):TL0 的低 5 位和 TH0 的 8 位构成 13 位计数器。
- 方式 1(16 位定时器 / 计数器):TH0 和 TL0 组成完整的 16 位计数器。
- 方式 2(8 位自动重装定时器 / 计数器):TL0 作为 8 位计数器,TH0 用于存放自动重装初值。当 TL0 溢出时,TH0 的值自动装入 TL0 中。
- 方式 3(仅适用于定时器 0):TL0 作为一个独立的 8 位定时器 / 计数器,TH0 固定为一个独立的 8 位定时器,使用定时器 1 的控制位和中断标志。
通过合理设置这些寄存器的各位,可以灵活配置定时器 / 计数器的工作方式、启动停止、初值等,以满足不同的应用需求。
定时器/计数器工作在方式 0、方式 1、方式 2 和方式 3 时,寄存器的设置有何不同?
在 STC51 单片机中,定时器 / 计数器有四种工作方式(方式 0、方式 1、方式 2 和方式 3),不同工作方式下相关寄存器(主要是 TMOD、THx、TLx)的设置有所不同,下面为你详细介绍:
1. 方式 0:13 位定时器 / 计数器
寄存器设置要点
- TMOD 寄存器:对于定时器 0,设置
TMOD
低 4 位中的M1M0 = 00
;对于定时器 1,设置TMOD
高 4 位中的M1M0 = 00
。GATE
位可根据需要设置为 0 或 1 来决定定时器的启动条件,C/T̅
位设置为 0 时作为定时器使用,设置为 1 时作为计数器使用。 - THx 和 TLx 寄存器:由 THx 的 8 位和 TLx 的低 5 位构成 13 位计数器。在初始化时,需要将初值拆分为两部分分别装入 THx 和 TLx。
示例代码(以定时器 0 为例)
#include <reg51.h>
void main() {
// 设置 TMOD,定时器 0 工作在方式 0,作为定时器使用,非门控方式
TMOD = 0x00;
// 计算初值,假设定时 1ms,晶振频率为 12MHz
unsigned int time = 65536 - 1000;
TH0 = (time >> 5) & 0xFF; // 高 8 位
TL0 = time & 0x1F; // 低 5 位
// 启动定时器 0
TR0 = 1;
while (1) {
if (TF0 == 1) { // 定时器 0 溢出
TF0 = 0; // 清除溢出标志
// 重新加载初值
TH0 = (time >> 5) & 0xFF;
TL0 = time & 0x1F;
}
}
}
2. 方式 1:16 位定时器 / 计数器
寄存器设置要点
- TMOD 寄存器:对于定时器 0,设置
TMOD
低 4 位中的M1M0 = 01
;对于定时器 1,设置TMOD
高 4 位中的M1M0 = 01
。GATE
和C/T̅
位的设置与方式 0 类似。 - THx 和 TLx 寄存器:THx 和 TLx 组成完整的 16 位计数器。初始化时,将 16 位初值拆分为高 8 位和低 8 位分别装入 THx 和 TLx。
示例代码(以定时器 0 为例)
#include <reg51.h>
void main() {
// 设置 TMOD,定时器 0 工作在方式 1,作为定时器使用,非门控方式
TMOD = 0x01;
// 计算初值,假设定时 1ms,晶振频率为 12MHz
unsigned int time = 65536 - 1000;
TH0 = (time >> 8) & 0xFF; // 高 8 位
TL0 = time & 0xFF; // 低 8 位
// 启动定时器 0
TR0 = 1;
while (1) {
if (TF0 == 1) { // 定时器 0 溢出
TF0 = 0; // 清除溢出标志
// 重新加载初值
TH0 = (time >> 8) & 0xFF;
TL0 = time & 0xFF;
}
}
}
3. 方式 2:8 位自动重装定时器 / 计数器
寄存器设置要点
- TMOD 寄存器:对于定时器 0,设置
TMOD
低 4 位中的M1M0 = 10
;对于定时器 1,设置TMOD
高 4 位中的M1M0 = 10
。GATE
和C/T̅
位的设置与前面方式相同。 - THx 和 TLx 寄存器:TLx 作为 8 位计数器,THx 用于存放自动重装初值。当 TLx 溢出时,THx 的值自动装入 TLx 中。只需将初值同时赋给 THx 和 TLx 即可。
示例代码(以定时器 0 为例)
#include <reg51.h>
void main() {
// 设置 TMOD,定时器 0 工作在方式 2,作为定时器使用,非门控方式
TMOD = 0x02;
// 计算初值,假设定时 100μs,晶振频率为 12MHz
unsigned char time = 256 - 100;
TH0 = time; // 自动重装初值
TL0 = time; // 初始值
// 启动定时器 0
TR0 = 1;
while (1) {
if (TF0 == 1) { // 定时器 0 溢出
TF0 = 0; // 清除溢出标志
// 无需手动重新加载初值,硬件自动完成
}
}
}
4. 方式 3:仅适用于定时器 0
寄存器设置要点
- TMOD 寄存器:设置
TMOD
低 4 位中的M1M0 = 11
。在方式 3 下,定时器 0 被拆分为两个独立的 8 位定时器 / 计数器。 - TH0 和 TL0 寄存器:TL0 作为一个独立的 8 位定时器 / 计数器,使用定时器 0 本身的控制位(TR0、TF0);TH0 固定为一个独立的 8 位定时器,使用定时器 1 的控制位(TR1、TF1)。定时器 1 不能工作在方式 3,若定时器 1 工作在方式 3,则会停止计数。
示例代码
#include <reg51.h>
void main() {
// 设置 TMOD,定时器 0 工作在方式 3,作为定时器使用,非门控方式
TMOD = 0x03;
// 为 TL0 计算并设置初值,假设定时 100μs,晶振频率为 12MHz
unsigned char time_tl0 = 256 - 100;
TL0 = time_tl0;
// 为 TH0 计算并设置初值,假设定时 200μs,晶振频率为 12MHz
unsigned char time_th0 = 256 - 200;
TH0 = time_th0;
// 启动 TL0
TR0 = 1;
// 启动 TH0
TR1 = 1;
while (1) {
if (TF0 == 1) { // TL0 溢出
TF0 = 0; // 清除溢出标志
TL0 = time_tl0; // 重新加载初值
}
if (TF1 == 1) { // TH0 溢出
TF1 = 0; // 清除溢出标志
TH0 = time_th0; // 重新加载初值
}
}
}
综上所述,不同工作方式下,TMOD 寄存器的 M1M0
位设置不同,THx 和 TLx 寄存器的使用方式和初值加载方式也有所差异,需要根据具体需求进行合理设置。