当前位置: 首页 > article >正文

STC51 单片机中,定时器 / 计数器相关的寄存器

在 STC51 单片机中,定时器 / 计数器相关的寄存器主要有定时器控制寄存器(TCON)、定时器工作方式寄存器(TMOD)以及定时器初值寄存器(TH0、TL0、TH1、TL1),下面详细解释这些寄存器各位的作用。

1. 定时器控制寄存器(TCON)

  • 地址:88H
  • 可位寻址:该寄存器的每一位都可以进行单独的位操作。

位序号位名称作用
TCON.7TF1定时器 1 溢出标志位。当定时器 1 产生溢出时,硬件自动将 TF1 置 1。如果中断允许(ET1 = 1 且 EA = 1),则会向 CPU 发出中断请求;进入中断服务程序后,硬件自动将其清 0。若采用查询方式处理溢出,则需要软件清 0。
TCON.6TR1定时器 1 运行控制位。当 TR1 = 1 时,启动定时器 1 开始计数;当 TR1 = 0 时,停止定时器 1 计数。可以通过软件来设置该位的值。
TCON.5TF0定时器 0 溢出标志位。功能与 TF1 类似,用于表示定时器 0 是否溢出。
TCON.4TR0定时器 0 运行控制位。功能与 TR1 类似,用于控制定时器 0 的启动和停止。
TCON.3IE1外部中断 1 请求标志位。当外部中断 1 引脚上出现有效的中断请求信号(根据 IT1 的设置,可为下降沿或低电平触发)时,IE1 被硬件置 1;进入中断服务程序后,硬件自动将其清 0(对于下降沿触发方式)。
TCON.2IT1外部中断 1 触发方式控制位。当 IT1 = 0 时,外部中断 1 为低电平触发方式;当 IT1 = 1 时,外部中断 1 为下降沿触发方式。
TCON.1IE0外部中断 0 请求标志位。功能与 IE1 类似,用于表示外部中断 0 是否有中断请求。
TCON.0IT0外部中断 0 触发方式控制位。功能与 IT1 类似,用于设置外部中断 0 的触发方式。

2. 定时器工作方式寄存器(TMOD)

  • 地址:89H
  • 不可位寻址:对该寄存器的操作需要进行字节操作。

TMOD 分为高 4 位和低 4 位,分别用于控制定时器 1 和定时器 0 的工作方式。

低 4 位(控制定时器 0)

位序号位名称作用
TMOD.3GATE门控位。当 GATE = 0 时,只要 TR0 = 1,定时器 0 就开始计数;当 GATE = 1 时,只有 TR0 = 1 且外部中断 0(INT0)引脚为高电平时,定时器 0 才开始计数。
TMOD.2C/T̅定时器 / 计数器选择位。当 C/T̅ = 0 时,作为定时器使用,对内部机器周期进行计数;当 C/T̅ = 1 时,作为计数器使用,对外部引脚 T0 上的脉冲信号进行计数。
TMOD.1M1工作方式选择位 1。与 M0 一起决定定时器 0 的工作方式。
TMOD.0M0工作方式选择位 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 寄存器的使用方式和初值加载方式也有所差异,需要根据具体需求进行合理设置。


http://www.kler.cn/a/537940.html

相关文章:

  • [RabbitMQ] RabbitMQ常见面试题
  • Render上后端部署Springboot + 前端Vue 问题及解决方案汇总
  • C++20导出模块及使用
  • 大数据学习之SparkSql
  • 青少年编程与数学 02-008 Pyhon语言编程基础 22课题、类的定义和使用
  • 互联网分布式ID解决方案
  • CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战
  • R包:ggalign调整和组合多个图形的R包
  • 判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0
  • java基础4(黑马)
  • 语言月赛 202308【小粉兔做麻辣兔头】题解(AC)
  • TypeScript 中的元组:固定长度的数组
  • 论软件架构风格论文
  • 【C#】任务调度的实现原理与组件应用Quartz.Net
  • windows蓝牙驱动开发-蓝牙 LE 邻近感应配置文件
  • 小程序:如何暂时停用小程序?
  • 模板方法模式(Template)
  • 利用UNIAPP实现短视频上下滑动播放功能
  • #光子学小白#光子学与人工智能的跨界融合:从基础研究到产业应用 怎么学啊?
  • 悬链线的方程及其推导过程
  • 代理软件更改IP地址会影响网速吗
  • 5.5信息安全
  • Flutter完整开发实战详解(六、 深入Widget原理)
  • 图解BWT FM-Index算法
  • 如何在Excel内,完成excel到json的转换,excel另存为json,excel-to-json插件
  • mysql自连接 处理层次结构数据