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

news2025/1/15 19:34:12

文章目录

  • 前言
    • 定时器是什么
    • 初始化定时器
      • 初始化的大概步骤
      • 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为模式1
    TH0 = 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???1
    TH0 = 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.coloradmin.cn/o/1886005.html

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

相关文章

构建RAG+nebula graph(知识图谱KG)

目标&#xff1a;通过利用 LlamaIndex 和 NebulaGraph 为费城费城人队&#xff08;Philadelphia Phillies&#xff09;构建一个RAG流程&#xff0c;深入探讨知识图谱。 NebulaGraph 是市场上最好的知识图谱数据库之一。它是开源的、分布式的&#xff0c;并且能够处理具有亿万边…

【postgresql】 数据类型

数字类型 名字存储尺寸描述范围smallint2字节小范围整数-32768 ~32767integer4字节整数的典型选择-2147483648 ~ 2147483647bigint8字节大范围整数-9223372036854775808 ~ 9223372036854775807decimal可变用户指定精度&#xff0c;精确最高小数点前131072位&#xff0c;以及小…

Centos7部署Mysql8.0超级详细教程,一看就会!

1、准备 下载 Mysql 安装包源信息,去到这个网址&#xff0c;https://dev.mysql.com/downloads/repo/yum/ 复制红色框的内容&#xff0c; 2、开始安装 # 以下所有操作建议切换到 root 用户后运行。。yum install wget -y# 将上面的复制内容粘贴到后面&#xff0c;格式&…

Jmeter 入门指南:从零开始学习

JMeter 是一个非常流行的开源工具&#xff0c;用于进行负载测试。它支持多种网络协议&#xff0c;包括 HTTP、FTP、SMTP、JMS、SOAP、JDBC 等&#xff0c;使其成为在多种应用环境中检测性能瓶颈的理想选择。本文将详细介绍如何利用 JMeter 进行高效的接口自动化测试。 创建和执…

Redis 7.x 系列【14】数据类型之流(Stream)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 XADD2.2 XRANGE2.3 XREVRANGE2.4 XDEL2.5 XLEN2.6 XREAD2.7 XG…

Chisel学习笔记(1)——Chisel安装与Verilog代码仿真

参考链接&#xff1a; https://www.chisel-lang.org/docs/installation 使用Chisel语言编写硬件描述语言&#xff0c;相比于使用Verilog会更加地灵敏快捷&#xff0c;Coding效率更高&#xff0c;但似乎debug会出现一些小问题。但新工具还是要尝试一下才知道好不好用。 1 安装C…

武汉星起航:跨境电商领域的领航者,助力合作伙伴全球布局

在跨境电商的汹涌浪潮中&#xff0c;武汉星起航电子商务有限公司如同一颗璀璨的明星&#xff0c;自2017年起便以亚马逊自营店铺为核心业务&#xff0c;不断积累实战运营经验&#xff0c;逐步建立了自己在市场中的稳固地位。随着2020年公司的正式成立&#xff0c;武汉星起航明确…

@RequestMapping属性详解及案例演示

RequestMapping源码 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented Mapping public interface RequestMapping {String name() default "";AliasFor("path")String[] value() default {};AliasFor(&quo…

最快33天录用!一投就中的医学4区SCI,几乎不退稿~

【SciencePub学术】今天小编给大家推荐2本生物医学领域的SCI&#xff0c;此期刊为我处目前合作的重点期刊&#xff01;影响因子0-3.0之间&#xff0c;最重要的是审稿周期较短&#xff0c;对急投的学者较为友好&#xff01; 医学医药类SCI 01 / 期刊概况 【期刊简介】IF&…

从0开始搭建vue项目

#先查下电脑有没有安装过node和npm node -v npm -v #安装vue npm install -g vue #安装webpack npm install webpack -g 都安装好后&#xff0c;进入你想创建的文件夹内 创建名字&#xff1a;vue init webpack <project_name> 就默认回车 然后根据项目需求Y/n 比如…

红酒香气探秘:解锁品味酒香的奥秘,带你领略葡萄酒的魅力

在葡萄酒的世界里&#xff0c;香气是葡萄酒的灵魂&#xff0c;它诉说着葡萄的故事&#xff0c;也展现着酿酒师的匠心独运。每一款红酒都有其不同的香气&#xff0c;如同一位优雅的舞者&#xff0c;用曼妙的舞姿诠释着酒的韵味。今天&#xff0c;就让我们一起走进红酒的香气世界…

24年诺瓦星云入职认知能力测验Verify + 职业性格问卷OPQ可搜索带解析求职SHL题库

一、走进西安诺瓦星云科技股份有限公司 西安诺瓦星云科技股份有限公司(简称诺瓦星云) 是全球极具竞争力的LED显示解决方案供应商&#xff0c;实施"基于西安&#xff0c;围绕北京与深圳&#xff0c;辐射全球"的全球化布局&#xff0c;总部位于西安&#xff0c;西安、…

微服务中的Feign远程调用

Feign的个人理解 Feign在英文中是“装”的意思&#xff0c;但在微服务中他是远程调用的一种方式&#xff0c;我的理解是&#xff1a;他替代了RestTemplateNacos中的URL编码的方式&#xff0c;显得很高大上&#xff0c;所以很装&#xff1a;&#xff08;声明式事务&#xff0c;只…

静态IP代理:保障网络稳定的核心技术

静态IP代理作为一种重要的网络工具&#xff0c;因其稳定性和持久性&#xff0c;受到越来越多用户的青睐。本文将深入探讨静态IP代理的定义和优势。 静态IP代理是什么&#xff1f; 静态IP代理是指在代理服务器中分配一个固定的IP地址&#xff0c;用户在使用过程中始终使用同一个…

当我问AI,智星云算力有什么特点时,答案出乎意料!

当我问AI&#xff0c;智星云算力有什么特点时&#xff0c;它的回答几乎全中。 唯一的错误是在“分钟计费”这里&#xff0c;之前确实是按分钟计费过&#xff0c;今年改成了按小时计费&#xff0c;大约一小时0.75元起。 另外就是一些更具体的特点没有展现出来&#xff0c;比如…

Mysql和ES使用汇总

一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id&#xff0c;通过ES查询获取查询商品的列表中展示的数据&#xff0c;通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的&#xff1b; 为什么ES一般…

高效除氟:探索CH-87up树脂在氟化工废水处理中的应用

摘要 本研究旨在评估Tulsimer CH-87up树脂针对经钙镁预处理后的氟化工废水的深度处理效果。实验结果显示&#xff0c;CH-87up树脂能显著降低废水中的氟离子浓度&#xff0c;从43.4mg/L降至0.34mg/L&#xff0c;远低于行业排放标准的5mg/L。此外&#xff0c;该树脂表现出卓越的…

Windows打开redis以及Springboot整合redis

目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis&#xff0c;并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所…

[附源码]最新springboot线上电商|前后端分离|界面简洁

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;线上电商的网站源码&#xff0c;支持二开&#xff0c;无加密。代码的后端是SpringBoot技术栈&#xff08;非jsp&#xff09;&#xff0c;前端是Angular。如果您需要定制需求请找小编。 文章第六小节…

Vue 数据大屏适配

1、准备俩个盒子 .dataScreen-content 盒子内容根据设计稿给的px单位进行正常的布局就行 2、盒子的CSS样式 .dataScreen-container {width: 100%;height: 100%;// 有背景图需要的样式background: url("./images/bg.png") no-repeat;background-repeat: no-repeat;b…