单片机原理及技术(七)—— 定时器/计数器的工作原理

devtools/2024/9/18 13:49:30/ 标签: 学习方法, 51单片机, 笔记

目录

一、定时器/计数器的结构

1.1 定时器/计数器工作方式寄存器TMOD

1.2 定时器/计数器控制寄存器TCON

二、定时器/计数器的4种工作方式

2.1 方式0

2.2 方式1

2.3 方式2

2.4 方式3

三、定时器/计数器T0、T1的编程应用

3.1 P1口控制8只LED

 3.2 计数器的应用


一、定时器/计数器的结构

AT89S51单片机的定时器/计数器结构如下图所示,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,定时器/计数器T1由特殊功能寄存器TH1、TL1构成。

AT89S51单片机的定时器/计数器结构框图

AT89S51的Timer 0(T0)和Timer 1(T1)都具有定时器和计数器两种工作模式。

在定时器模式下,T0和T1可以被用作定时器来测量时间间隔。它们可以根据预设的初值进行计数,当计数值达到设定的目标值时,会触发定时器中断。这个机制可以用来生成精确的定时延迟。

在计数器模式下,T0和T1可以被用作计数器来计算外部脉冲的数量。它们可以根据外部脉冲的输入进行计数。一般来说,这种模式用于测量外部事件的频率或时间间隔。

为了切换工作模式,对应的控制寄存器需要进行相应的设置。在AT89S51中,T0的工作模式由T0CON寄存器来设置,T1的工作模式由T1CON寄存器来设置。

1.1 定时器/计数器工作方式寄存器TMOD

在AT89S51中,定时器/计数器的工作方式由寄存器TMOD(Timer Mode)来控制。TMOD是一个8位寄存器,用于设置T0和T1的工作模式和工作方式。

TMOD寄存器的位布局如下:

位7位6位5位4位3位2位1位0
GATEC/T1M1M0GATEC/T0M1M0

8位分为两组,高4位控制T1,低4位控制T0。

  • GATE:门控位

GATE=0,定时器/计数器是否计数,仅由控制位TRx(x=0,1)来控制。(通常)

GATE=1,定时器/计数器是否计数,要由外中断引脚 INT0(或INT1)上的电平与运动控制位TRx两个条件共同控制。

  • M1和M0:工作方式选择位

M1和M0位用于选择T0和T1的工作方式。M1和M0位的取值情况如下:

M1M0工作方式
0013位定时器/计数器(Mode 0)
0116位定时器/计数器(Mode 1)
108位自动重装载的定时器/计数器(Mode 2)
11仅适用于T0,此时T0分成2个8位计数器,T1停止计数(Mode 3)

1.2 定时器/计数器控制寄存器TCON

在AT89S51中,定时器/计数器的控制由寄存器TCON(Timer/Counter Control)来进行。TCON是一个8位寄存器,用于启动、停止和设置定时器/计数器的工作方式。

TCON寄存器的位布局如下:

位7位6位5位4位3位2位1位0
TF1TR1TF0TR0IE1IT1IE0IT0

 

  • TR1和TR0位

TR1和TR0位用于启动和停止T1和T0的定时器/计数器。

TR1和TR0位的取值情况如下:

TR1TR0功能
00停止T1和T0的计数器
01启动T0的计数器
10启动T1的计数器
11同时启动T1和T0的计数器
  • TF1和TF0位

TF1和TF0位用于检测T1和T0的溢出标志。当定时器/计数器溢出时,这些位将被设置为1。可以通过软件将它们清零。

  • IE1和IE0位

IE1和IE0位用于使能T1和T0的中断。当相应的位设置为1时,若定时器/计数器溢出时,将触发相应的中断。

  • IT1和IT0位

IT1和IT0位用于设置T1和T0的中断类型。当IT1位设置为1时,T1的中断为高电平触发,当IT1位设置为0时,T1的中断为下降沿触发。当IT0位设置为1时,T0的中断为高电平触发,当IT0位设置为0时,T0的中断为下降沿触发。

二、定时器/计数器的4种工作方式

2.1 方式0

定时器/计数器的4种工作方式中,方式0是最简单的工作方式,也被称为13位定时器计数器模式(13-bit Timer/Counter Mode)。

在方式0中,定时器/计数器的输入时钟源为时钟频率的12分频。它可以被用作13位定时器或13位计数器,由T0引脚的控制位决定。当T0引脚连接到外部时钟源时,可以选择将定时器/计数器配置为计数器,否则配置为定时器。

在方式0中,定时器/计数器的计数范围为0到8191。这意味着定时器/计数器将在计数到8191时溢出,并自动从0开始重新计数。当计数器溢出时,会发生中断(如果中断使能位IE0被设置为1)。

定时器/计数器方式0的工作方式可以通过设置TCON寄存器中位1和位0的值来控制。当位1和位0都设置为0时,定时器/计数器处于停止状态,不进行计数。当位1设置为1而位0设置为0时,定时器/计数器将开始倒计时。当位1设置为0而位0设置为1时,定时器/计数器将开始正计时。当位1和位0都设置为1时,定时器/计数器将同时进行正计时和倒计时。

2.2 方式1

方式1是定时器/计数器的第二种工作方式,也被称为16位自动重装定时器模式(16-bit Auto-reload Timer Mode)。

在方式1中,定时器/计数器的输入时钟源为时钟频率的12分频。它被配置为一个16位定时器/计数器,每次计数范围从0到65535。当计数器达到最大值65535时,会自动从初始值(预设的重载值)重新开始计数。

定时器/计数器方式1适用于需要长时间计时的应用,因为它的计数范围更大。它可以更精确地测量较长的时间间隔。

方式1的工作方式可以通过设置TMOD寄存器中的位[1:0]来配置。具体的设置如下:

  • BIT1 = 1,BIT0 = 0:定时器/计数器开始倒计时,并根据设置的重载值进行自动重装。当计数器溢出时,会发生中断(如果中断使能位IE1被设置为1)。
  • BIT1 = 0,BIT0 = 1:定时器/计数器开始正计时,计数范围从0到65535,当计数器达到最大值时,会自动从初始值重新开始计数。

2.3 方式2

方式2是定时器/计数器的第三种工作方式,也被称为8位自动重装定时器模式(8-bit Auto-reload Timer Mode)。

在方式2中,定时器/计数器的输入时钟源为时钟频率的12分频。它被配置为一个8位定时器/计数器,每次计数范围从0到255。当计数器达到最大值255时,会自动从初始值(预设的重载值)重新开始计数。

定时器/计数器方式2适用于需要短时间计时的应用,因为它的计数范围较小。它可以更快地测量较短的时间间隔。

方式2的工作方式可以通过设置TMOD寄存器中的位[3:2]来配置。具体的设置如下:

  • BIT3 = 1,BIT2 = 0:定时器/计数器开始倒计时,并根据设置的重载值进行自动重装。当计数器溢出时,会发生中断(如果中断使能位IE2被设置为1)。
  • BIT3 = 0,BIT2 = 1:定时器/计数器开始正计时,计数范围从0到255,当计数器达到最大值时,会自动从初始值重新开始计数。

2.4 方式3

方式3是定时器/计数器的第四种工作方式,也被称为两个8位定时器/计数器模式(Two 8-bit Timer/Counter Mode)。

在方式3中,定时器/计数器被分为两个独立的8位定时器/计数器,分别被称为定时器/计数器0(T0)和定时器/计数器1(T1)。每个定时器/计数器都有自己的寄存器和控制位。

定时器/计数器0(T0)和定时器/计数器1(T1)拥有独立的工作方式和计时引脚。它们可以同时进行不同的计时操作,具有更高的灵活性和多任务处理能力。

方式3的工作方式可以通过设置TMOD寄存器中的位[1:0]来配置。具体的设置如下:

  • BIT1 = 1,BIT0 = 0:定时器/计数器0工作在方式1中的8位自动重装定时器模式。
  • BIT1 = 0,BIT0 = 1:定时器/计数器1工作在方式1中的8位自动重装定时器模式。
  • BIT1 = 1,BIT0 = 1:定时器/计数器0和定时器/计数器1同时工作,各自独立配置工作方式。

三、定时器/计数器T0、T1的编程应用

3.1 P1口控制8只LED

在AT89S51单片机的P1口上接有8只LED,采用定时器T0的方式1的定时中断方式,使P1口外接的8只LED每0.5秒闪亮一次。

方式1定时中断LED闪亮电路示意图

程序代码:

#include <reg51.h> // 包含51单片机寄存器定义#define LED P1 // 将P1口定义为LED// 初始化定时器T0为模式1
void Timer0_Init() {TMOD |= 0x01; // 设置定时器0为模式1(16位定时器模式)TH0 = 0xB8;   // 装载初值,定时器高8位TL0 = 0x00;   // 装载初值,定时器低8位ET0 = 1;      // 开启定时器T0中断EA = 1;       // 开启全局中断TR0 = 1;      // 启动定时器T0
}// 定时器T0中断服务程序
void Timer0_ISR() interrupt 1 {static unsigned int count = 0;TH0 = 0xB8;   // 重新装载初值,定时器高8位TL0 = 0x00;   // 重新装载初值,定时器低8位count++;if (count >= 10) { // 累计中断次数,0.5秒闪烁一次count = 0;LED = ~LED; // 取反LED的状态,实现闪烁}
}void main() {LED = 0xFF;   // 初始化LED状态,全部熄灭(假设LED为共阳极接法)Timer0_Init(); // 初始化定时器T0while(1) {// 主循环中不需要做任何事,LED闪烁由定时器中断控制}
}

#include <reg51.h> // 包含51单片机寄存器定义#define LED P1 // 将P1口定义为LED// 初始化定时器T0为模式1
void Timer0_Init() {TMOD |= 0x01; // 设置定时器0为模式1(16位定时器模式)TH0 = 0xB8;   // 装载初值,定时器高8位TL0 = 0x00;   // 装载初值,定时器低8位ET0 = 1;      // 开启定时器T0中断EA = 1;       // 开启全局中断TR0 = 1;      // 启动定时器T0
}// 定时器T0中断服务程序
void Timer0_ISR() interrupt 1 {static unsigned int count = 0;TH0 = 0xB8;   // 重新装载初值,定时器高8位TL0 = 0x00;   // 重新装载初值,定时器低8位count++;if (count >= 10) { // 累计中断次数,0.5秒闪烁一次count = 0;LED = ~LED; // 取反LED的状态,实现闪烁}
}void main() {LED = 0xFF;   // 初始化LED状态,全部熄灭(假设LED为共阳极接法)Timer0_Init(); // 初始化定时器T0while(1) {// 主循环中不需要做任何事,LED闪烁由定时器中断控制}
}

 

 3.2 计数器的应用

定时器T1采用计数模式,方式1中断,计数输入引脚T1上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。

程序代码:

#include <reg51.h>#define LED P1
#define BUTTON P3_6void Delay (unsigned int i){              //延时函数Delay(),i为形式参数,不能赋初值unsigned int j;for(;i > 0;i--)for (j=0;j<333;j++)                   //晶体振荡器为12MHz,j的选择与晶体振荡器频率有关{;}                 //空函数// 假设已经有一个函数用于初始化定时器T1
void Timer1_Init() {// 定时器初始化代码
}// 假设已经有一个函数用于初始化外部中断
void ExternalInterrupt_Init() {// 外部中断初始化代码IT0 = 1; // 配置INT0为下降沿触发EX0 = 1; // 启用外部中断0
}// 定义一个全局变量来计数按钮按下的次数
unsigned char button_press_count = 0;// 外部中断0的中断服务程序
void External0_ISR() interrupt 0 {button_press_count++; // 按钮被按下,计数加1if (button_press_count >= 4) {// 如果按了4次按钮,使LED闪烁不停while (1) {LED = 0xFF; // LED全亮Delay(100);    // 延时函数LED = 0x00; // LED全灭Delay(100);    // 延时函数}}
}void main() {Timer1_Init(); // 初始化定时器T1ExternalInterrupt_Init(); // 初始化外部中断EA = 1; // 全局中断使能while (1) {// 主循环代码,如果需要可以执行其他任务}
}

http://www.ppmy.cn/devtools/96962.html

相关文章

PyTorch分布式训练全攻略:DistributedDataParallel精解与实战

标题&#xff1a;PyTorch分布式训练全攻略&#xff1a;DistributedDataParallel精解与实战 在深度学习飞速发展的今天&#xff0c;模型的规模和数据集的体量不断增长&#xff0c;单机单卡的训练方式已难以满足需求。分布式训练以其卓越的扩展性和效率&#xff0c;成为解决这一…

S-Clustr-Simple(影子集群) 伪编译器构造Clustr包多重自动化攻击链路控制

https://github.com/MartinxMax/S-Clustr/releases 伪编译器&伪代码 该伪编译器采用伪C语言代码来构造(影子集群)客户端的有效控制载荷。 $ python scc.py 1.顶部可调整字体大小 2.勾选复选框则随机生成密钥&#xff0c;默认随机12位密钥。反之手动输入加密密钥&#xf…

Git使用方法(三)---简洁版上传git代码

1 默认已经装了sshWindows下安装SSH详细介绍-CSDN博客 2 配置链接github的SSH秘钥 1 我的.ssh路径 2 进入路径cd .ssh 文件 3 生成密钥对 ssh-keygen -t rsa -b 4096 (-t 秘钥类型 -b 生成大小) 输入完会出现 Enter file in which to save the key (/c/Users/Administrator/…

[linux#39][线程] 详解线程的概念

线程&#xff1a;是进程内的一个执行分支。线程的执行粒度比进程要细 什么是线程&#xff1f; • 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程 是“一个进程内部的控制序列” • 一切进程至少都有一个执行线程 • …

Docker无法拉取镜像解决方案

vi /etc/docker/daemon.json添加如下配置 {\ "registry-mirrors": \["<https://hub.uuuadc.top>", "<https://docker.anyhub.us.kg>", "<https://dockerhub.jobcher.com>", "<https://dockerhub.icu>&q…

使用 Apache POI 的 DataFormatter 处理 Excel 数据

在处理 Excel 文件时&#xff0c;确保正确格式化和读取数据是一个常见的需求。Apache POI 是一个强大的 Java 库&#xff0c;可以用来读写 Microsoft Office 格式的文件&#xff0c;包括 Excel。本文将介绍如何使用 Apache POI 的 DataFormatter 类来简化数据的格式化和读取过程…

java解析facebook的android app直投下的Referral URL

背景&#xff1a; 在facebook的应用推广中&#xff0c;一般使用两种方式&#xff0c;一种是app直投&#xff0c;一种是w2a。 app直投就是用户点击广告直接跳转到应用商店进行下载应用 w2a就是通过落地页方式引导用户进行应用下载 在w2a模式下&#xff0c;可以通过落地页链接…

(普通用户)Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

报错&#xff1a; Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?#大概像以下的报错内容 MernyPierreMBP:~ merny24$ docker info Client:Version: 26.1.4Context: defaultDebug Mode: falseServer: ERROR: Cann…

06结构型设计模式——代理模式

一、代理模式简介 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff08;GoF书中解释结构型设计模式&#xff1a;一种用来处理类或对象、模块的组合关系的模式&#xff09;&#xff0c;代理模式是其中的一种&#xff0c;它可以为其他对象提供一种代…

机器学习常用包numpy篇(三)随机数

目录 前言 随机数的生成 1.指定形状 生成【0&#xff0c;1&#xff09;的随机数组 2.从标准正态分布中返回一个或多个样本值&#xff08;组成数组&#xff09; 3.生成规定区间内的规定形状的随机数组 4. 生成[0, 1) 区间内指定 size 的随机浮点数 数组 5.从给定的数组里…

【概率论与数理统计】第六章:数理统计基础

文章目录 一. 随机样本1. 总体与个体2. 总体对应随机变量X 二. 直方图和箱线图&#xff08;ing&#xff09;1. 直方图2. 箱线图 三. 抽样分布1. 统计量2. 三大样本分布2.1. 卡方分布2.2. t分布2.3. F分布 3. 正态总体的样本均值与样本方差的分布 数理统计(Mathematics Statisti…

等保测评中的常见误区及应对策略

等保测评中的常见误区 等保测评是网络安全等级保护制度的重要组成部分&#xff0c;它涉及信息系统的安全等级评定和安全保护措施的评估。在等保测评过程中&#xff0c;企业和组织常会遇到一些误区&#xff0c;这些误区可能导致测评不达标或资源浪费。以下是等保测评中的一些常见…

Python 异步爬虫:高效数据抓取的现代武器

标题&#xff1a;“Python 异步爬虫&#xff1a;高效数据抓取的现代武器” 在当今信息爆炸的时代&#xff0c;网络爬虫已成为数据采集的重要工具。然而&#xff0c;传统的同步爬虫在处理大规模数据时往往效率低下。本文将深入探讨如何使用 Python 实现异步爬虫&#xff0c;以提…

SQL - 数据类型

字符串类型 char(10)&#xff0c;存储固定长度字符串 varchar(255)&#xff0c;存储可变长度字符串 mediumtext&#xff0c;中文本&#xff0c;对于存储JSON对象、SCV字符串很好使 longtext&#xff0c;长文本&#xff0c;可以很好地存储教本或许多年地日志文件 tinytext&#…

渗透实战——为喜欢的游戏“排忧解难”

本文仅用于技术研究学习&#xff0c;请遵守相关法律&#xff0c;禁止使用本文所提及的相关技术开展非法攻击行为&#xff0c;由于传播、利用本文所提供的信息而造成任何不良后果及损失&#xff0c;与本账号及作者无关。 资料查询来源- 安全社区与AI模型结合探索【文末申请免费…

DAM-E3505N以太网口三相400V 100A全参数交流电量采集模块Modbus-TCP协议

品牌&#xff1a;阿尔泰科技 型号&#xff1a;DAM-E3505 简介&#xff1a; DAM-E3505N为三相全参数交流电量采集模块&#xff0c;以太网通讯接口&#xff0c;支持标准Modbus-TCP协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 指标参数&#xff1…

JDBC是不是通过TCP进行数据传输的?

是的&#xff0c;JDBC&#xff08;Java Database Connectivity&#xff09;与数据库之间的数据传输通常是通过TCP&#xff08;Transmission Control Protocol&#xff09;进行的。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;它广泛应用于互联网中&am…

【Hot100】LeetCode—189. 轮转数组

目录 1- 思路自定义 reverse 翻转函数 2- 实现⭐189. 轮转数组——题解思路 3- ACM 实现 原题链接&#xff1a;189. 轮转数组 1- 思路 自定义 reverse 翻转函数 2- 实现 ⭐189. 轮转数组——题解思路 class Solution {public void rotate(int[] nums, int k) {k % nums.lengt…

光伏电站气象站是如何做到‌全方位、‌高精度的?

‌光伏电站气象站是一款专为光伏发电系统设计的全方位环境监测设备&#xff0c;‌它能够采集太阳倾斜辐射、‌日照时数、‌太阳总辐射、‌太阳直接辐射、‌太阳散射辐射、‌风速、‌风向、‌百叶盒温湿度、‌大气压力、‌经纬度、‌组件温度等一系列关键要素&#xff0c;‌为光…

Windows 上使用 OpenSSL 生成一个 10 年有效期的自签名 PFX 证书

以下是在 Windows 上使用 OpenSSL 生成一个 10 年有效期的自签名 PFX 证书的步骤&#xff1a; 确保 OpenSSL 已安装。你可以从 OpenSSL 官方网站下载并安装&#xff0c;或者如果是通过其他方式安装确保其在系统路径中。 打开命令提示符&#xff08;以管理员身份运行&#xff0…