【51单片机入门】速通定时器

文章目录

  • 前言
    • 定时器是什么
    • 初始化定时器
      • 初始化的大概步骤
      • TMOD寄存器
      • C/T寄存器
    • 触发定时器
    • 中断是什么
    • 中断函数
    • 定时器点亮led
  • 总结


前言

在嵌入式系统的开发中,定时器是一个非常重要的组成部分。它们可以用于产生精确的时间延迟,或者在特定的时间间隔内触发某些事件。在51单片机中,定时器的功能尤为强大,可以满足各种复杂的时间控制需求。本文将介绍51单片机的定时器,包括它们是什么,以及如何触发它们。


定时器是什么

定时器是单片机内部的一个重要模块,它可以按照预设的时间间隔产生一个中断。在51单片机中,有两个定时器,分别是定时器0和定时器1。每个定时器都有一个16位的计数器,可以被配置为四种不同的工作模式,以满足不同的应用需求。

初始化定时器

初始化的大概步骤

要触发定时器,我们需要进行以下步骤:

  1. 设置定时器模式:通过TMOD寄存器来设置定时器的工作模式。例如,如果我们想将定时器0设置为模式1(16位定时/计数器模式),我们可以写入TMOD = 0x01;

  2. 加载定时初值:定时初值决定了定时器中断的触发频率。我们可以通过TH0和TL0寄存器来设置定时器0的初值。例如,我们可以写入TH0 = 0xFC; TL0 = 0x18;来设置定时初值,他就会以这个数开始–。在51单片机的定时器中,TH0是高8位,TL0是低8位。这两个寄存器共同组成了一个16位的定时/计数器。当我们说"设置定时器的初值"时,通常是指同时设置这两个寄存器的值。

  3. 开启定时器中断:通过IE寄存器来开启定时器的中断。例如,我们可以写入ET0 = 1; EA = 1;来开启定时器0的中断。

  4. 启动定时器:通过TR0位来启动定时器0。例如,我们可以写入TR0 = 1;来启动定时器。
    在带有XX0中,0就是定时器编号,也可以写1,因为有两个定时器

初始化代码:

void Timer0_Init(void) {TMOD = 0x01;  // 设置定时器0为模式1TH0 = 0xFC;   // 设置定时初值TL0 = 0x18;   // 设置定时初值ET0 = 1;      // 开启定时器0中断EA = 1;       // 开启总中断TR0 = 1;      // 启动定时器0
}

TMOD寄存器

TMOD寄存器用于设置51单片机的定时器模式。它是一个8位的寄存器,分为两个部分:高4位用于设置定时器1,低4位用于设置定时器0。

每个定时器的设置都包括两个部分:工作模式(M1和M0)和工作方式(GATE和C/T)。以下是每个位的详细解释:

  • M1和M0:这两个位用于设置定时器的工作模式。有四种模式可供选择:

    • 模式0(M1=0, M0=0):13位定时/计数器模式。在这种模式下,定时器有12位的计数器(由TL和TH的低4位组成),和一个5位的预分频器(由TH的高4位组成)。
    • 模式1(M1=0, M0=1):16位定时/计数器模式。在这种模式下,定时器有16位的计数器(由TL和TH组成)。
    • 模式2(M1=1, M0=0):8位自动重装定时/计数器模式。在这种模式下,定时器有8位的计数器(由TL组成),并且在溢出时会自动重装TH的值。
    • 模式3(M1=1, M0=1):只对定时器0有效。在这种模式下,定时器0被分为两个8位的定时/计数器(由TL0和TH0组成)。
  • GATE:当GATE位被设置为1时,定时器/计数器只有在对应的INTx引脚(P3.2对于定时器0,P3.3对于定时器1)为高电平时才会运行。当GATE位被设置为0时,定时器/计数器会忽略INTx引脚的状态。

C/T寄存器

  • C/T:当C/T位被设置为1时,定时器会作为计数器使用,计数外部的脉冲信号。当C/T位被设置为0时,定时器会作为定时器使用,计数机器周期。
    好的,让我通过一些例子来解释这个概念。

首先,我们来看当C/T位被设置为0时,定时器作为定时器使用的情况。在这种情况下,定时器会计数机器周期。例如,如果我们的单片机的时钟频率是12MHz,那么每个机器周期的时间就是1/12μs。是的,你的理解是正确的。在数字电路中,频率(单位为赫兹,Hz)是指在一秒钟内的周期数。所以,如果一个系统的频率是x MHz(兆赫兹,即百万赫兹),那么它在一秒钟内会有x百万个周期。

因此,每个周期的时间(也就是周期时间或者说是时钟周期)就是一秒钟的时间除以周期的数量。所以,对于x MHz的频率,每个周期的时间就是1/x μs(微秒,即百万分之一秒)。

用数学公式表示,就是:

T = 1 f T = \frac{1}{f} T=f1

其中,T是周期时间,f是频率。如果f的单位是MHz,那么T的单位就是μs。

如果我们设置定时器的初值为0xFFFF,那么定时器会在每个机器周期增加1,直到计数值溢出(达到0),这时就会触发一个中断。这就是我们通常说的定时器溢出,也是定时器最常见的用途。

然后,我们来看当C/T位被设置为1时,定时器作为计数器使用的情况。在这种情况下,定时器会计数外部的脉冲信号。例如,我们可以将一个按钮连接到定时器的计数输入端口(对于定时器0,这个端口是P3.4)。当我们按下按钮时,就会在这个端口产生一个脉冲信号。定时器会在每次检测到脉冲信号时增加1,直到计数值溢出(达到0),这时就会触发一个中断。这就是我们通常说的计数器溢出,也是计数器的一种常见用途。
当C/T位被设置为1时,定时器会作为计数器使用,计数外部的脉冲信号。在这种情况下,TH0和TL0的值通常被设置为0,因为我们希望从0开始计数外部的脉冲信号。

触发定时器

当定时器计数溢出时,就会触发一个中断,我们可以在中断服务程序中编写需要定时执行的代码。

中断是什么

中断,顾名思义,就是打断当前正在执行的任务,去做一些更重要的事情。你可以把它想象成你正在看电视,突然有人按门铃,你就需要"中断"你正在做的事情,去开门。

在计算机中,中断的概念也是类似的。当计算机正在执行一个程序时,如果发生了一个中断,计算机就会暂时停止执行当前的程序,去处理这个中断。处理完中断后,计算机会回到被中断的地方,继续执行原来的程序。

中断可以由很多事情触发,比如输入/输出设备(如键盘、鼠标)的操作,定时器的超时,甚至是软件的请求。处理中断的程序叫做中断服务程序或者中断处理程序。

中断是计算机实现并发操作的一种重要机制。通过中断,计算机可以在处理一个任务的同时,响应其他的事件。这使得计算机可以更有效地利用资源,提高工作效率。

我们的定时器也是调用中断的
在C语言中,中断运行的代码使用函数表示,中断发生后,会去运行中断中的代码

中断函数

中断函数相对我们的C语言函数,在参数列表后面加interrupt x即可,x为定时器编号,他从1开始

void Timer0_ISR(void) interrupt 1 {TH0 = 0xFC;   TL0 = 0x18;   //。。。。
}

在中断函数中需要重新装载THxTLx,其中x为定时器编号

在51单片机的定时器中,"重新装载"是一个非常重要的概念。当我们说"重新装载"时,我们是指将定时器的计数值重新设置为它的初值。

那么,为什么我们需要重新装载呢?这主要是因为定时器的工作方式。当定时器开始运行时,它会从初值开始计数,每个机器周期增加1。当计数值达到最大值(对于16位定时器,这个值是0xFFFF)时,定时器就会溢出,并触发一个中断。

然而,如果我们在中断服务程序中不重新装载定时器的初值,那么定时器在下一个机器周期就会从0开始计数。这意味着定时器会立即再次溢出,并立即再次触发中断。这样,我们的中断服务程序就会被连续调用两次,而且这个过程会一直重复,导致我们的程序无法正常运行。

通过重新装载定时器的初值,我们可以控制定时器中断的触发频率。例如,如果我们希望定时器每1ms触发一次中断,我们就可以将定时器的初值设置为一个特定的值,使得定时器在1ms后溢出。然后,在每次中断服务程序被调用时,我们就重新装载这个初值,这样定时器就会在下一个1ms后再次溢出,再次触发中断。

定时器点亮led

当我们设置TH0TL00xFC0x18时,他们移除需要加下面数量:
在这里插入图片描述
当计数这么多时,就溢出触发中断

在51单片机中,定时器0的工作方式默认为模式1,也就是16位定时/计数模式。当TH0和TL0分别设置为0xFC和0x18时,定时器0的初始值为0xFC18。由于定时器0是16位的,所以它的最大值为0xFFFF。当定时器0从0xFC18开始计数,每次增加1,直到达到0xFFFF,然后溢出并回到0x0000,这个过程就会产生一个中断。

在一个12MHz的系统时钟下,每个机器周期为1/12μs。在定时器模式下,定时器每过12个机器周期就会增加1。因此,从0xFC18增加到0xFFFF所需的时间可以通过以下公式计算:

T = ( 0 x F F F F − 0 x F C 18 + 1 ) × 12 × 1 12 M H z T = (0xFFFF - 0xFC18 + 1) \times 12 \times \frac{1}{12MHz} T=(0xFFFF0xFC18+1)×12×12MHz1

为什么需要+1?
这是因为计数是从0开始的。当我们从0xFC18计数到0xFFFF时,我们实际上是包括了0xFFFF这个数值的。所以,我们需要计算的是从0xFC18到0xFFFF的所有数值,包括这两个数值本身,总共有(0xFFFF - 0xFC18 + 1)个数值。

计算结果,我们可以得到定时器溢出并产生中断的时间。这就是当TH0和TL0设置为0xFC和0x18时,12MHz系统时钟下,溢出调用中断的时间。

#include <reg51.h>sbit led = P1^0;void Timer0_Init(void) {TMOD = 0x01;  // ?????0???1TH0 = 0xFC;   // ??????TL0 = 0x18;   // ??????ET0 = 1;      // ?????0??EA = 1;       // ?????TR0 = 1;      // ?????0
}void Timer0_ISR(void) interrupt 1 {static unsigned short x = 0;TH0 = 0xFC;   TL0 = 0x18;   if( x == 0){led = !led;}x++;x%= 500;
}void delay(unsigned int ms) {unsigned int i, j;for(i = ms; i > 0; i--)for(j = 120; j > 0; j--);
}void main()
{Timer0_Init();while(1){}
}

总结

定时器是51单片机中非常强大的一个功能,它为我们提供了一种精确控制时间的方法。通过合理地设置定时器模式和定时初值,我们可以实现各种复杂的时间控制需求。希望通过本文的介绍,你对51单片机的定时器有了更深入的理解。在未来的学习和开发中,你可以尝试利用定时器来实现更多有趣和实用的功能。祝你学习愉快!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java--常用类APl(复习总结)

前言: Java是一种强大而灵活的编程语言&#xff0c;具有广泛的应用范围&#xff0c;从桌面应用程序到企业级应用程序都能够使用Java进行开发。在Java的编程过程中&#xff0c;使用标准类库是非常重要的&#xff0c;因为标准类库提供了丰富的类和API&#xff0c;可以简化开发过…

【接口自动化测试】第三节.实现项目核心业务接口自动化

文章目录 前言一、实现登录接口对象封装和调用 1.0 登录接口的接口测试文档 1.1 接口对象层&#xff08;封装&#xff09; 1.2 测试脚本层&#xff08;调用&#xff09;二、课程新增接口对象封装和调用 2.0 课程新增接口的接口测试文档 2.1 接口对象层…

AVL树模拟

1.概念 虽然二叉搜索树可以缩短查找的效率&#xff0c;但如果数据有序或者接近有序时二叉搜索树树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。AVL 树是具有一下性质的二叉搜索树&#xff1a; 1.它的左右子树都是AVL树 2.左右子…

Mac 如何安装 wget

1.安装 Homebrew2.安装 wget3.检测 wget 是否安装成功 1.安装 Homebrew 在安装 wget 之前需要安装一个适用于 mac 的包管理器 Homebrew&#xff0c;打开 mac 终端执行如下命令进行安装&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/h…

新手第一个漏洞复现:MS17-010(永恒之蓝)

文章目录 漏洞原理漏洞影响范围复现环境复现步骤 漏洞原理 漏洞出现在Windows SMB v1中的内核态函数srv!SrvOs2FeaListToNt在处理FEA&#xff08;File Extended Attributes&#xff09;转换时。该函数在将FEA list转换成NTFEA&#xff08;Windows NT FEA&#xff09;list前&am…

【Golang - 90天从新手到大师】Day14 - 方法和接口

一&#xff0e; go方法 go方法&#xff1a;在函数的func和函数名间增加一个特殊的接收器类型&#xff0c;接收器可以是结构体类型或非结构体类型。接收器可以在方法内部访问。创建一个接收器类型为Type的methodName方法。 func (t Type) methodName(parameter list) {}go引入…

解决“Duplicate keys detected: ‘ ‘.This may cause an update error.”问题

问题原因 出现“Duplicate keys detected”的错误&#xff0c;通常表示在v-for指令中使的:key绑定值有重复。 如果前端是静态数据&#xff0c;一般能自我避免:key绑定值有重复。如果前端是绑定的动态数据&#xff0c;那么需要另外提供一个唯一的键。 在这个例子中&#xff0c…

【LeetCode】接雨水

目录 一、题目二、解法完整代码 一、题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff…

【UML用户指南】-23-对高级行为建模-状态机

目录 1、概述 2、状态 2.1、状态的组成 3、转移 3.1、转移的组成 4、高级状态和转移 4.1、进入效应和退出效应 4.2、内部转移 4.3、do活动 4.4、延迟事件 4.5、子状态机 5、子状态 5.1、非正交子状态 5.2、历史状态 5.3、正交子状态 6、分叉与汇合 7、主动对象…

GOROOT GOPATH GOPROXY GO111MODULE

GOROOT GOROOT代表Go的安装目录。可执行程序go(或go.exe)和gofmt(或gofmt.exe)位于 GOROOT/bin目录中。 配置GOROOT环境变量&#xff0c;其值为Go的安装目录&#xff1b;然后在环境变量PATH中添加GOROOT/bin路径。 注意&#xff1a;GOROOT变量只是代表了安装目录&#xff0c;不…

【面试题】信息系统安全运维要做什么

信息系统安全运维是确保信息系统稳定、可靠、安全运行的一系列活动和措施。 其主要包括以下几个方面&#xff1a; 1.系统监控&#xff1a; 实时监测信息系统的运行状态&#xff0c;如服务器的性能指标、网络流量、应用程序的运行情况等。通过监控工具&#xff0c;及时发现系统…

企业数据治理的下一步是数据资产管理?

随着信息技术的飞速发展和数字化转型的深入推进&#xff0c;企业数据已成为驱动业务增长和创新的核心要素。当企业数据治理工作取得显著成效后&#xff0c;如何进一步发挥数据的价值&#xff0c;实现数据资产的有效管理&#xff0c;成为企业面临的重要课题。 数据治理的基石作用…

学习感悟丨在誉天学习数通HCIP怎么样

大家好&#xff0c;我是誉天学员的徐同学&#xff0c;学习的数通HCIP课程。 在学校的时候&#xff0c;听说下半年就要出去实习了&#xff0c;心中坎坷不安&#xff0c;现在我学到的知识远远不够的。然后就想着学点东西充实一下自己的知识面和专业能力&#xff0c;有一次和同学谈…

【漏洞复现】飞企互联——SQL注入

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据…

[图解] 向量数据库之何谓乘积量化器?

Product Quantization 在前面一节讲解了向量数据库索引相关的内容&#xff0c;那么本节将会讲解其中压缩方法的量化手段&#xff1a;乘积量化器。 简单来说将向量的所有维度划分为多个子空间&#xff0c;每个子空间一部分维度&#xff0c;然后每个子空间独立去找最近距离。例如…

haproxy实现代理和负载均衡

HaProxy介绍&#xff1a; haproxy是法国开发者威利塔罗在2000年使用C语言开发的一个开源软件&#xff0c;是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计&…

Numpy array和Pytorch tensor的区别

1.Numpy array和Pytorch tensor的区别 笔记来源&#xff1a; 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…

信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换

PDF文档公众号回复关键字:20240629 2022 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 5.对于入栈顺序为a,b,c,d,e的序列&#xff0c;下列( )不合法的出栈序列 A. a&#xff0c;b&a…

螺旋矩阵问题C代码

给定一个n行m列的二维数组&#xff0c;要求按顺时针螺旋顺序输出矩阵中的所有元素&#xff0c;n和m小于等于10 如下图是一个三行四列的螺旋矩阵 要求输出 1 2 3 4 8 12 11 10 9 5 6 7 全局变量定义 int a[11][11]; int vis[11][11]; // 访问标记数组关键代码如下 int dx[] …

MySQL高级-MVCC-基本概念(当前读、快照读)

文章目录 1、MVCC基本概念1.1、当前读1.1.1、创建表 stu1.1.2、测试 1.2、快照读 1、MVCC基本概念 全称Multi-Version Concurrency Control&#xff0c;多版本并发控制。指维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个…