STC89C52定时器与中断 详细介绍 0基础入门

STC89C52定时器与中断

  • 前言
  • 定时器/计数器
    • 定时器/计数器 功能选择
    • 定时器/计数器 模式选择
    • 使用寄存器进行功能选择与模式选择
  • 中断
    • 使用寄存器进行中断配置
    • 中断执行操作
  • 总结
  • 完整程序

前言

  对于定时器与中断,这是两个完全不同的概念,在单片机中它们也对应着不同的内部结构,但是它们之间的关联度往往十分紧密,因此我们经常会在教科书中见到这两个内容组合在一起。为了避免如同教科书一样上来就直接给出一堆寄存器各种控制方式,让人看着不知所云,这里将首先以图形的方式对整个定时器与中断系统进行简单的介绍(以下所有内容均是以STC89C51单片机为例进行讲解)。如下简图:
在这里插入图片描述
  实际上定时器与中断选择控制系统较为复杂,这里只是图简要地给出了定时器与中断以及中断执行操作之间的关系,定时器的作用如同它的名字一样,就是定时,中断选择控制系统内部较为复杂,这里暂且不表,就将它当作一个用于对所有中断请求机械能分析判断并向cpu发出中断请求的命令的部件即可。
  举个例子,比如你定一个5分钟的时,那么手机五分钟后就会响起,你根据手头上的事情与闹钟提醒你的事情的紧要程度的不同选择接下来将要做的事情。在这里其实就相当于执行了上述整个见图中的所有步骤,首先你在手机上进行定时操作,即对应定时器部分,五分钟后闹钟响起,你听到闹钟后分析应该进行下一步操作,对应中断选择控制系统,最终如果你选择去做闹钟提醒你的事情,那么就是对应执行操作。
  有了上面的简图后,我们再来分别介绍定时器与中断两部分内容将会更加清晰。


定时器/计数器

  博主认为,在介绍中断前,应该首先介绍定时器(另一方面,定时器相对于中断而言较为简单)。因为中断请求可以由定时器时间到发出的信号作为中断请求,当然,并不是所有的中断请求都是定时器的时间到这一信号引起,这里只讲定时器的中断,不讲其他的中断类型,防止发生混淆。
  在传统的51单片机内部有两个16位定时器(只要是51系列的,必然与传统兼容,即也会存在该定时器,可能会有新增的定时器),分别是定时器0和定时器1,这里的16位定时器的意思是指计数值的位数最大是16位,如果不理解后边会再次讲到。下面以定时器0进行相关介绍。

定时器/计数器 功能选择

  注意到,我们的小标题中没有单独使用定时器这一概念,而是在后面使用了另一个名称计数器,从这里可以看出,对于一个定时器,它不单单是定时器,还可以用作计数器,也就是说,如果将这个小系统称为一个部件的话,那么这个部件是有两种功能的,一是定时器功能,二是计数器功能。这里将定时器内部的简要结构图给出如下:
在这里插入图片描述
上图名词解释:
  SYSclk:系统时钟
  MCU in 12T mode:12分频
  MCU in 6T mode:6分频
  T0 Pin:定时器0外部脉冲引脚
   C / T ˜ C/\~T C/T˜:计数器/定时器选择,当该位为0时选择定时器,为1时选择计数器功能
  TR0:定时器0计时开始位
  GATE:门控位,该位为0时,由定时器计数,该位为1时,允许外部输入INT0控制定时
  TL0:计数器0的低八位
  TH0:计数器0的高八位
  TF0:计数器0的溢出标志位
  Interrupt:中断发出信号

  我们对该图进行一个解释,首先看**SYSclk(系统晶振)T0 Pin(外部脉冲)**这一块,这两个的选择即决定了在定时器/计数器中选择的是哪个功能,它们两个的作用本质上都是发出脉冲信号,只不过对于系统晶振而言,它发出的脉冲信号的频率是固定的,可计算的,这样的话,我们就可以根据这个固定频率的脉冲来计数从而实现计时/定时的功能。例如,如果系统时钟的频率是12Mhz,那么经过12分频后,相当于脉冲的频率变成了1Mhz,此时一个周期的脉冲时间即为1us,也就是来一个脉冲信号就过去了1us。再来看计数装置,计数装置的计数方式就是根据脉冲来计数的,也就是每来一个脉冲,计数装置就会+1,可以看到,图中用两个小方块表示计数装置的,这是因为在STC89C51单片机中,定时器是16位的,也就是两个字节,左边是低八位数据,右边是高八位数据,在初始状态下默认是全零,即0000 0000 0000 0000,那么显然,最大可以计数到全1,即1111 1111 1111 1111,此时为65535,当计数装置的值到达最大值后,会产生溢出,并且标志位(TF0)会被自动置1,然后发出中断信号。对于外部脉冲而言,每当外部来一个信号,计数器才会+1,因此此时计数器可以单纯当作一个计数功能的装置,同样地,如果计数到最大值,会发生溢出,标志位置1,产生中断,可以设置中断执行的操作,也可以不设置中断执行的操作。

定时器/计数器 模式选择

  此外,对于计数装置,其不单单是简单地从全0计到全1,计数模式有四种选择,模式0、模式1、模式2、模式3,这里为了避免太多信息导致初学者难以理解,最常用的是模式1。
  模式0:“13位定时器/计数器”,此时TL0只用低5位参与计数,TH0全部使用,因此共13位计数,最大计数值是 2 13 − 1 = 8191 2^{13}-1=8191 2131=8191,标志位置1后需手动赋初值给计数器。
  模式1:“16位定时器/计数器”,也就是说,对于TL0和TH0,所有位全部用于计数,所以一共可计最大值是 2 16 − 1 = 65535 2^{16}-1=65535 2161=65535,标志位置1后需手动赋初值给计数器。
  模式2:“8位自动重装载模式”,此时TL0如果发生了溢出就会直接将TF0置1,并且将TH0的内容重新装入TL0,TH0的内容是需要手动设置的,该模式下,标志位置1后不需手动赋初值给计数器,因为初始是一开始就设置存储在高八位中,并且每次低八位溢出时就会自动将高八位的值取过来重新赋值给低八位,这样一来就十分方便,但是缺点也很明显,因为只能使用八位计数,所以计数范围很小,即最大 2 8 − 1 = 255 2^8-1=255 281=255
  模式3:该模式下,定时器/计数器无效,停止计数。

使用寄存器进行功能选择与模式选择

  在定时器中,主要使用到的寄存器有TCON、TMOD,TL0,TH0四个,其中TCON主要进行初始化操作,用于设置标志位初始值与定时器开关,TMOD主要用于设置定时的工作模式,TL0和TH0用于设置定时器的初始计数值。
TCON
TCON寄存器的数据位格式如下:
在这里插入图片描述
  首先,TCON寄存器是可按位寻址的寄存器,这代表可以直接对寄存器的某一位进行寻址赋值操作。在对定时器0进行初始化时,TCON寄存器中需要使用到的位有TF0和TR0,将定时器溢出标志位TF0=0,并将定时器开始计数位TR0=1,其余位不需要进行操作,代码如下:

TF0=0;
TR0=1;

TMOD
TMOD寄存器的数据位格式如下:
在这里插入图片描述
  同样的,可以注意到,TMOD与TCON不同的地方在于,TMOD不可位寻址,也就是说,对于TMOD只能整体对该寄存器的八位进行赋值,而不可单独对某一位进行赋值。设置定时器0的模式时,对于TMOD寄存器,需要使用到的数据位有GATE、 C / T ˜ C/\~T C/T˜、M1、M0(定时器0,即寄存器的低四位)。其中GATE的作用是用于控制定时器0用作定时器或计数器,当GATE=0时,定时器0用作定时器,此时时钟信号由系统内部产生,当GATE=1时,定时器0用作计数器,此时时钟信号由外部引脚输入。M1与M0用于设置定时器的4种工作模式,如下表:

模式M1M0
000
101
210
311

  假设将定时器0工作模式设置为模式1,则GATE=0, C / T ˜ = 0 C/\~T=0 C/T˜=0,M1=0,M0=1,即0001,此时可以设置寄存器TMOD=0x01,但是这样会导致定时1的设置发生改变,为了避免这种情况,通常采用下面的方式进行赋值:

TMOD &= 0xf0;
TMOD |= 0x01;

TL0 TH0
  TL0与TH0是设置的计数器初值,这里解释一下为什么要设置初值,因为计数器只有计满时溢出才会发出中断信号,因此,我们没办法控制它在计数值为多少时发出信号,但是我们可以通过控制计数器的初值来间接实现计时的功能,例如还是以模式1为例,12Mhz12分频下,1次计数表示1us,那么如果计数器从0x00计到0xff,那么就是过去了65535us,而这个数值显然不是一个整数可以转换为ms的数值,所以如果我们将初值设为65535-1000=64535,那么只需要再计1000次,即可溢出触发中断信号,而此时1000us=1ms,是刚好可以转成整数的。在这种条件下,TL0=64535%256,TH0=64535/256;

TL0 = 64535%256;
TH0 = 64535/256;

中断

  对于中断的介绍这里就不做过多解释,相信学过操作系统的同学都能轻易理解中断所表达的含义,这里先主要介绍一下中断源,在STC89C51中,有8个不同的中断源,分别是外部中断0( I N T 0 ˜ \~{INT0} INT0˜),定时器0中断,外部中断1( I N T 1 ˜ \~{INT1} INT1˜),定时器1中断,定时器2中断,串口(UART)中断,外部中断2( I N T 2 ˜ \~{INT2} INT2˜),外部中断3( I N T 3 ˜ \~{INT3} INT3˜),本文主要介绍定时器,因此这里只介绍定时器中断,而刚刚上面已经讲过了,当计数器达到最大值时,会发生溢出,溢出会导致中断信号产生,这里产生的中断信号就是定时0中断,作为一个中断源发起中断请求。
  对于这么多,共8个中断源,我们不可能一视同仁,它们之间是存在着不同的优先级的,因此在这里我们主要介绍一下中断的优先级。其实这8个中断源的优先级就是按照上面给出的次序由高到低排序的,即外部中断0>定时器中断0>外部中断1>定时器中断1>定时器中断2>串口中断>外部中断2>外部中断3。对于可以发生中断嵌套的系统,高优先级的中断会打断低优先级的中断程序。
  假设现在所有的中断优先级只有两个,一类是高优先级中断,一类是低优先级中断,那么对于定时器0,如下图:
在这里插入图片描述
其中红框所选区域即为我们需要重点关注的区域。可以看到,红框的内容有T0,TF0,ET0,PT0,以及最下面有一个总允许EA,这里一一介绍。
  T0:即为定时器0中断源
  TF0:定时器0中断溢出标志位(这里可以看出,中断与定时器在物理上是存在连接的
  ET0:定时器0的中断允许控制位,当该位为1时,表示允许T0中断,为0时表示禁止T0中断,相当于设置定时器0的中断请求是否响应。
  PT0:定时器0的中断优先级控制位,在本例中,假设只有两个优先级,则当PT0=0时,定时器0的优先级最低,当PT0=1时,定时器0的优先级最高。注意,如果系统是四个优先级,则往往需要与另一个中断优先级控制位PT0H相结合控制,具体如下表(从0到3优先级依次增加):

优先级PT0HPT0
000
101
210
311

  EA:中断总允许控制位,除了对于每个中断源有一个单独的中断允许控制位外,系统对于整个中断系统也有一个中断总控制,当EA=0时,表示关闭总中断,任何中断信号来了都不会执行任何操作;当EA=1时,表示开启总中断,不论使用哪个中断,EA必须要置1,否则任何中断都将不会响应。

使用寄存器进行中断配置

  在中断配置中,使用到的寄存器有IE(中断允许寄存器)和IP(中断优先级寄存器),其中IE用于对定时器0中断进行初始化,IP用于配置定时器0的优先级。
IE
IE寄存器的数据位格式如下:
在这里插入图片描述
  可以看到,对于IE,同样是一个可位寻址的寄存器。这里需要使用到的数据位有EA和ET0,需要将EA和ET0置1,允许总中断和定时器0的中断开关打开,代码如下:

EA=1;
ET0=1

IP
IP寄存器的数据位格式如下:
在这里插入图片描述
  同样地,IP寄存器也是可按位寻址的。这里需要使用到的只有一个位,PT0,用于设置定时器0的中断优先级。如果希望设置4个优先级,可以结合PT0H位进行设置,其中PT0H位是IPH寄存器中的第2位,如下图:
在这里插入图片描述
  通过PT0H与PT0的组合,可以设置四种不同的优先级,具体设置第一个表中已经给出过,这里不再细说。假设只是用PT0一位设置优先级,则可置PT0=1为高优先级;

PT0=1;

中断执行操作

  在cpu响应中断后,会跳转到中断操作函数处执行该中断函数,这里需要额外说明的是,一个中断源只能有一个中断函数,并且对于中断函数的书写格式是与普通函数的格式存在一点区别的,也就是多了一个关键字interrupt+中断号。前面并没有提到过中断号,这里解释一下,每个中断源都有其对应的唯一中断号,在STC89C51中,中断源与中断号的对应关系如下:

中断源中断函数(建议名称)中断号
外部中断0Int0_Routine(void)0
定时器中断0Timer0_Routine(void)1
外部中断1Int1_Routine(void)2
定时器中断1Timer1_Routine(void)3
串口中断UART_Routine(void)4
定时器中断2Timer2_Routine(void)5
外部中断2Int2_Routine(void)6
外部中断3Int3_Routine(void)7

  需要注意的是,中断函数不能传参!!!不需要手动调用中断函数!!!依旧以定时器0为例,在这里定义定时器0的中断执行函数Timer0_Routine();

void Timer0_Rountine() interrupt 1
{// 恢复初值TL0 = 64535%256;TH0 = 64535/256;/*在这里执行你需要的操作*//*在这里执行你需要的操作*//*在这里执行你需要的操作*/
}

总结

  中断与定时器是两套相互关联的硬件系统,它们在一起组合能够产生出十分强大的效果,在对定时器与中断配置好模式以及初值后,中断函数便会一次又一次不断执行,从而可以实现程序的计时以及其他希望达到的效果。相信你在看完本篇文章后,会对定时器与中断的认识上到一个新的台阶,如果还有不懂的问题欢迎在评论区留言提问~


完整程序

#include <REGX52.H>
void Timer0Init(void)		//1毫秒@12.000MHz
{// 设置定时器工作模式TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式//设置定时器初值TL0 = 0x18 + 1;		//设置定时初值TH0 = 0xFC;		//设置定时初值//清除定时器0标志位 只需清除一次TF0 = 0;//定时器0开始计时TR0 = 1;		// 使能Timer0中断ET0=1;// 使能总中断EA=1;// 设置Timer0优先级PT0=0;
}
unsigned int Timer0_cnt;void main()
{Timer0Init();while(1){}
}void Timer0_Routine() interrupt 1
{TL0 = 0x18 + 1;		//设置定时初值TH0 = 0xFC;		//设置定时初值Timer0_cnt++;if(Timer0_cnt%1000==0){// 数码管闪烁P2_0=~P2_0;}
}

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

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

相关文章

C++的哲学思想

C的哲学思想 文章目录 C的哲学思想&#x1f4a1;前言&#x1f4a1;C的哲学思想☁️C底层不应该基于任何其他语言&#xff08;汇编语言除外&#xff09;☁️只为使用的东西付费&#xff08;不需要为没有使用到的语言特性付费&#xff09;☁️以低成本提供高级抽象&#xff08;更…

WebAssembly进阶,vue3 使用 WebAssembly,及 WebAssembly vs JavaScript 的性能对比

目录 核心使用步骤 .c文件.cpp文件编译 使用 Emscripten 转译文件 页面中引入.wasm文件中的函数 WebAssembly vs JavaScript 的性能对比 性能对比关键点: 具体场景 实际案例分析 如果对WebAssembly不熟悉可以前往:WebAssembly最详教程,进行WebAssembly基础学习 Web…

【有啥问啥】Stackelberg博弈方法:概念、原理及其在AI中的应用

Stackelberg博弈方法&#xff1a;概念、原理及其在AI中的应用 1. 什么是Stackelberg博弈&#xff1f; Stackelberg博弈&#xff08;Stackelberg Competition&#xff09;是一种不对称的领导者-追随者&#xff08;Leader-Follower&#xff09;博弈模型&#xff0c;由德国经济学…

【LVIO-SLAM】 激光slam理论与实践

【LVIO-SLAM】 激光slam理论与实践 1. 激光slam理论与实践1.1 2D激光SLAM1.2 3D激光SLAM 2. 激光雷达运动畸变去除2.1 Lidar数学模型与点云去畸变2.2 运动畸变 3. 激光slam的前端配准3.1 帧间匹配3.2 3.2 ICP (Iterative Closest Point)3.3 PI-ICP (Point-to-Line Iterative Cl…

ubuntu22 解决docker无法下载镜像问题

参考在 Ubuntu 中安装 Docker_ubuntu安装docker-CSDN博客 安装docker完成后&#xff0c;运行如下命令验证 Docker 服务是否在运行&#xff1a; systemctl status docker 运行&#xff08;sudo docker run hello-world&#xff09;例子报错&#xff1a; 问题&#xff1a;Docker…

Vue 内存泄漏分析:如何避免开发过程中导致的内存泄漏问题

一. 引言 Vue 作为一款流行的前端框架&#xff0c;已经在许多项目中得到广泛应用。然而&#xff0c;随着我们在 Vue 中构建更大规模的应用程序&#xff0c;我们可能会遇到一个严重的问题&#xff0c;那就是内存泄漏。内存泄漏是指应用程序在使用内存资源时未正确释放&#xff…

iPhone 16 还剩一个月,微软开源新技术让手机以 6 倍速度提前跑上大模型

作者 | 微软亚洲研究院 责编 | 王启隆 出品 | AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 随着人工智能技术的飞速发展&#xff0c;将大语言模型(LLMs)部署到边缘设备上已成为当前 AI 领域的一个热门趋势。这一趋势不仅体现在微软 Windows 11 AI PC 等产品…

【Qualcomm】高通SNPE框架简介、下载与使用

说明&#xff1a;基础内容&#xff01;不建议订阅&#xff01;不建议订阅&#xff01;不建议订阅&#xff01; 目录 一 高通SNPE框架 1 SNPE简介 2 QNN与SNPE 3 Capabilities 4 工作流程 二 SNPE的安装与使用 1 下载 2 Setup 3 SNPE的使用概述 一 高通SNPE框架 1 SNP…

Axure精选各类组件案例集锦:设计灵感与实战技巧

在设计大屏页面时&#xff0c;设计师们面临着如何构建丰富、直观且用户友好的界面的挑战。幸运的是&#xff0c;Axure等强大的原型设计工具提供了丰富的可视化组件库&#xff0c;为设计师们提供了无限的设计灵感和实战技巧。本文将通过精选的各类组件案例&#xff0c;探讨大屏设…

综合题第二题(路由器的配置)

题目 如何计算子网掩码 我们可以观察到上图的IP地址后面有“/26”、“30”。我们都知道子网掩码是由多个连续“1”和多个连续“0”组成的&#xff0c;“、26”表示子网掩码的二进制表达中有26个1。 例如&#xff1a;156.95.9.128/26 1111 1111.1111 1111.1111 1111.1100 0000…

摒弃“流量思维”,以精准流量驱动企业发展——基于开源 AI 智能名片、链动 2+1 模式及 O2O 商城小程序的思考

摘要&#xff1a;本文深入探讨在当前竞争激烈的营销环境下&#xff0c;摒弃“流量思维”的紧迫性与必要性。强调做内容营销不能仅仅局限于发文案&#xff0c;而应摆脱一味追求阅读量、推荐量和粉丝数的误区&#xff0c;聚焦于获取精准流量。结合开源 AI 智能名片、链动 21 模式…

??实验——完全使用Ansible部署多台服务器的服务

文章目录 需求两台Web服务器部署同一Web应用WeCenter&#xff0c;且两台服务器的用户上传的数据目录挂载到共享存储服务器中&#xff0c;总数据保存在一台数据库服务器中使用sersync简单实现两台共享存储服务器之间的Web应用共享数据目录的数据同步每天定时将两台Web服务器的We…

中国中车在线测评考的啥?大易题库如何通过|附真题型国企题库通关秘籍和攻略

言语理解题目&#xff1a;这类题目主要考察你的语言理解和表达能力&#xff0c;例如&#xff0c;给你一个段落&#xff0c;让你根据段落内容选择最合适的答案。要点是快速捕捉文段中的关键信息&#xff0c;理解作者的意图和观点 逻辑推理题目&#xff1a;这类题目需要你从一组…

盘点那些功能强大的思维导图在线工具,你用过几个

如果我们日常遇到比较繁杂的信息需要梳理&#xff0c;那我比较推荐使用思维导图在线工具进行梳理。这些工具可以通过图形化的方式展示各种信息之间的关系。这篇文章我将要介绍几款好用的思维导图工具帮我们更好的组织思维。 1.福晰思维导图 链接一下&#xff1a;https://www.…

RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?

LLM 的知识仅限于其训练数据。如希望使 LLM 了解特定领域的知识或专有数据&#xff0c;可&#xff1a; 使用本节介绍的 RAG使用你的数据对 LLM 进行微调结合使用 RAG 和微调 1 啥是 RAG&#xff1f; RAG 是一种在将提示词发送给 LLM 之前&#xff0c;从你的数据中找到并注入…

记录:ubuntu20.04的安装和必要的开发准备

记录ubuntu20.04的安装和必要的开发准备 准备1. 安装ubuntu20.04时的Tips2. 屏幕亮度调节问题3. 解决 "No Wi-Fi Adapter Found"4. Nvidia Driver && cuda5. 修改安装源6. ssh 远程开发 准备 没有装双系统&#xff0c;只有 ubuntu20.04&#xff0c;记录安装之…

微服务--Gateway网关

在微服务架构中&#xff0c;Gateway&#xff08;网关&#xff09;是一个至关重要的组件&#xff0c;它扮演着多种关键角色&#xff0c;包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口&#xff1a; Gateway作为微服务的统一入口&#xff0c…

HTTP协议1.1请求头和keep-alive

请求头分类 End-to-end&#xff08;端对端&#xff09; 必须全部带给目标服务器&#xff0c;不会被中途变化或去掉 Hop-by-hop&#xff08;逐跳头&#xff09; 比如客户端发请求&#xff0c;要路过代理(例如Nginx)&#xff0c;头可以被自动删掉&#xff0c;来到真正服务器上…

IAR创建工程与工程配置

第一步&#xff1a;先创建一个新的工作区间 第二步&#xff1a;创建一个新的工程&#xff08;工程名与文件夹名字要一致&#xff09; 第三步&#xff1a;添加组 第四步&#xff1a;往各个组里添加文件 第五步&#xff1a;配置工程 因为我的程序下载是通过ST-link的SWD&#xf…

正向科技|格雷母线定位系统的设备接线安装示范

格雷母线安装规范又来了&#xff0c;这次是设备接线步骤 格雷母线是格雷母线定位系统的核心部件&#xff0c;沿着移动机车轨道方向上铺设&#xff0c;格雷母线以相互靠近的扁平状电缆与天线箱电磁偶合来进行信号传递&#xff0c;从而检测得到天线箱在格雷母线长度方向上的位置。…