STC51单片机定时器/计数器寄存器详解

在 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 = 00GATE 位可根据需要设置为 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 = 01GATE 和 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 = 10GATE 和 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 寄存器的使用方式和初值加载方式也有所差异,需要根据具体需求进行合理设置。

    作者:weixin_58038206

    物联沃分享整理
    物联沃-IOTWORD物联网 » STC51单片机定时器/计数器寄存器详解

    发表回复