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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++ template-3

第 7 章 按值传递还是按引用传递 从一开始&#xff0c;C就提供了按值传递&#xff08;call-by-value&#xff09;和按引用传递&#xff08;call-by-reference&#xff09;两种参数传递方式&#xff0c;但是具体该怎么选择&#xff0c;有时并不容易确定&#xff1a;通常对复杂类…

使用springAI实现图片相识度搜索

类似的功能&#xff1a;淘宝拍照识别商品。图片相识度匹配 实现方式&#xff1a;其实很简单&#xff0c;用springai 将图片转换为向量数据&#xff0c;然后搜索就是先把需要搜索的图片转位向量再用向量数据去向量数据库搜索 但是springai现在不支持多模态嵌入数据库。做了一些…

私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)

私有化部署DeepSeek并SpringBoot集成使用&#xff08;附UI界面使用教程-支持语音、图片&#xff09; windows部署ollama Ollama 是一个开源框架&#xff0c;专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计 下载ollama 下载地址&#xff08;…

半导体制造工艺讲解

目录 一、半导体制造工艺的概述 二、单晶硅片的制造 1.单晶硅的制造 2.晶棒的切割、研磨 3.晶棒的切片、倒角和打磨 4.晶圆的检测和清洗 三、晶圆制造 1.氧化与涂胶 2.光刻与显影 3.刻蚀与脱胶 4.掺杂与退火 5.薄膜沉积、金属化和晶圆减薄 6.MOSFET在晶圆表面的形…

正则表达式的简单介绍 + regex_match使用

正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;是一种用于匹配字符串的模式。它由一系列字符和特殊符号组成&#xff0c;用于描述、匹配一系列符合某个句法规则的字符串。正则表达式广泛应用于文本搜索、替换、验证等场景。 它的主…

AnythingLLM开发者接口API测试

《Win10OllamaAnythingLLMDeepSeek构建本地多人访问知识库》见上一篇文章&#xff0c;本文在上篇基础上进行。 1.生成本地API 密钥 2.打开API测试页面&#xff08;http://localhost:3001/api/docs/&#xff09; 就可以在页面测试API了 2.测试获取用户接口(/v1/admin/users) 3…

TypeScript 中的类:面向对象编程的基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

二级C语言题解:矩阵主、反对角线元素之和,二分法求方程根,处理字符串中 * 号

目录 一、程序填空&#x1f4dd; --- 矩阵主、反对角线元素之和 题目&#x1f4c3; 分析&#x1f9d0; 二、程序修改&#x1f6e0;️ --- 二分法求方程根 题目&#x1f4c3; 分析&#x1f9d0; 三、程序设计&#x1f4bb; --- 处理字符串中 * 号 题目&#x1f…

Qt 支持的动画格式对比,Lottie/APNG/GIF/WEBP

Qt版本&#xff1a;6.7.2 &#xff0c; QML 一&#xff0c;Lottie 在qml中使用LottieAnimation即可&#xff0c;但有三个问题&#xff1a; 1.动画加载中报错&#xff1a; 如果图片&#xff08;.json)本身存在不支持的effect 或shape type等&#xff0c;效果并不好&#xff1a…

SpringCloud - Nacos注册/配置中心

前言 该博客为Nacos学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 一、简介 Nacos官网&#xff1a;https://nacos.io/docs/next/quickstart/quick-start/ Nacos /nɑ:kəʊ…

老游戏回顾:TL2

TL2是一部ARPG游戏&#xff0c;是TL的续作游戏&#xff0c;由位于美国西雅图的Runic Games开发&#xff0c;游戏于2012年9月20日上市&#xff0c;简体中文版于2013年4月10日在国内上市。 2有非常独特的艺术风格&#xff0c;这些在1中就已经形成&#xff0c;经过升级将使这款游…

DeepSeek-R1 云环境搭建部署流程

DeepSeek横空出世&#xff0c;在国际AI圈备受关注&#xff0c;作为个人开发者&#xff0c;AI的应用可以有效地提高个人开发效率。除此之外&#xff0c;DeepSeek的思考过程、思考能力是开放的&#xff0c;这对我们对结果调优有很好的帮助效果。 DeepSeek是一个基于人工智能技术…

利用ETL工具进行数据挖掘

ETL的基本概念 数据抽取&#xff08;Extraction&#xff09;&#xff1a;从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作&#xff0c;从API接口拿取数据也是。 数据转换&#xff08;Transformation&#xff09;&#xff1a;清洗、整合和转…

k8s网络插件及基础命令

一、k8s的cni网络插件 1.k8s的内部网络模式 pod内的容器与容器之间的通信。一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。不同节点上的pod之间的通信&#xff1a;通过物理网卡的ip地址和其他节点上的物理网卡的设备进行通信&#xff0c;然后把流量转发到指定的…

保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …

【C语言】传值调用与传址调用详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;传值调用1. 什么是传值调用&#xff1f;2. 示例代码&#xff1a;传值调用失败的情况执行结果&#xff1a; 3. 为什么传值调用无法修改外部变量&#xff1f; &#x1f4…

HarmonyOS 5.0应用开发——ContentSlot的使用

【高心星出品】 文章目录 ContentSlot的使用使用方法案例运行结果 完整代码 ContentSlot的使用 用于渲染并管理Native层使用C-API创建的组件同时也支持ArkTS创建的NodeContent对象。 支持混合模式开发&#xff0c;当容器是ArkTS组件&#xff0c;子组件在Native侧创建时&#…

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示&#xff08;16&#xff1a;9&#xff09;确定调整标题占位符置于图片右侧&#xff1a;内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明&#xff0c;对于数据结构无非两大类结构&#xff1a;顺序结构、链式结构&#xff0c;而二叉树实质上就可以等效看作为一个二叉链表&#xff0c;而对于链表插入一个节点的操作是应…