这是 北航士谔书院 的第 949 篇推送

本文介绍中断(interrupt)的基本概念,并演示定时器中断、外部中断的使用方法。如果同学们对文章内容有疑问,或发现文中有任何不妥之处,请点击“阅读原文”在页面末尾评论区留言,我会及时回复并订正。

中断

设想你在电脑上进行简单的 C 程序开发。你的程序只能按顺序运行,没有任何东西可以阻挡它。这看起来似乎没有什么问题,但是在单片机上,你有时会有一些特殊的需求。比如,你可能会需要快速响应外部的事件,或者你想定时执行某个任务。这时,你需要使用“中断”。

中断的含义

“中断”是指在内部 / 外部事件产生时,暂停主程序,转而执行用户定义的中断处理程序(Interrupt Service Routing,通常为一个函数)。当中断处理程序完毕后,返回继续主程序。中断产生时,单片机会将主程序的执行上下文保存到内存中,待中断处理程序结束后,单片机会恢复主程序的上下文,仿佛它从未被中断一样。

中断让单片机可以即时相应各类事件,而无需在主程序中一直检查事件是否发生。

中断事件的种类

在 51 单片机中,“内部事件”一般为定时器事件,“外部事件”一般为外部中断(引脚电平改变引起的中断)或串口中断(串口收到数据引起的中断)。

51 单片机只有 5 个中断,interrupt 0 – 4,它们的功能如下:

  • interrupt 0:外部中断 0;

  • interrupt 1:定时器中断 0;

  • interrupt 2:外部中断 1;

  • interrupt 3:定时器中断 1;

  • interrupt 4:串行口中断;

其它种类的单片机平台可能存在种类更丰富的中断。

C51 语言中对中断的处理

在 C51 语言中, 可以通过 interrupt 关键字将某个函数声明为中断处理程序:

// 定时器中断 0 处理函数

void isr_timer_0(void) interrupt 1

{

}

// 外部中断 0 处理函数

void isr_ext_0(void) interrupt 0

{

}

C51 语言中还有 using 关键字,用于指定中断处理函数使用的寄存器组。一般无需使用这个关键字。

8051 定时器

在开发程序时,我们可能需要定期 / 延迟执行某项任务,或者需要计量时间间隔。这时,我们需要使用 8051 定时器。每个 8051 单片机都带有两个定时器(T0 和 T1),它们分别独立工作。

基本原理

每个 8051 单片机都有一个基准时钟(通常为 12MHz),在较新的 STC 系列单片机上,这个时钟是单片机内部产生的。将基准时钟 12 分频,就得到机器周期(1MHz)。

每个 8051 定时器都有大小可配置(8-bit / 13-bit / 16-bit)的数值寄存器。当其启用时,每经过一个机器周期,定时器会将其数值寄存器的数值增加 1。通过读取数值寄存器的值,就可以计算出经过的时间。

在非自装载模式下,数值寄存器的二进制位全为 1 时,其无法被递增,发生溢出,此时数值寄存器停止递增,系统设置溢出标志位。在自装载模式下,发生溢出时,系统会自动重置数值寄存器为设定值。

用户可以控制定时器中断开关。如果中断开关处于打开模式,则每次溢出时,相应定时器的中断处理程序会被触发。如果需要每间隔一个周期就执行某项任务,就可以使用定时器中断。

定时器还可被用作脉冲计数器。在脉冲计数器模式下,数值寄存器的递增不由机器周期控制,而由外部脉冲控制。外部的一次脉冲,寄存器的数值增加 1。

工作模式

8051 定时器有 4 种工作模式,其中两个定时器都可以使用前 3 个模式:

  • 模式 0 13-bit 手动装载模式(M1 = 0,M0 = 0)

  • 模式 1 16-bit 手动装载模式(M1 = 0,M0 = 1)

  • 模式 2 8-bit 自动装载模式(M1 = 1,M0 = 0)

  • 模式 3 独立定时器模式(M1 = 1,M0 = 1,仅 T0 能用这种模式,且当 T0 工作于这种模式时,T1 可工作于模式 0, 1, 2,但此时 T1 的中断标志被 T0 占用,T1 不能使用中断控制)

在模式 0 和模式 1 下,单片机分别采用 13-bit 的计数器(最大值 8191)和 16-bit 的计数器(最大值 65535),并且当计数器溢出时,它们不会重新装载。在模式 2 下,由于计数器太小,手动重新装载计数器会带来较大误差,所以系统会自动重新装载计数器。模式 3 的用途较少,此处暂时略过。

控制方式

TCON 寄存器

定时器的工作状态由 TCON 寄存器来判断 / 控制。其中 6、7 位控制定时器 1,4、5 位控制定时器 0。各位的含义如下:

  • TF:溢出状态指示。在手动装载模式下,当定时器的数值寄存器溢出时,该位被置为 1,定时器暂停。

  • TR:使能控制。TR = 1,定时器运行;TR = 0,定时器停止。

  • IE:中断控制。IE = 1,在数值寄存器溢出时触发相应定时器中断;IE = 0,不会触发中断。

  • IT:中断触发方式。此位仅对计数器模式有效,对定时器模式无效。IT = 0,使用电平触发方式;IT = 1,使用边沿触发方式。

TMOD 寄存器

定时器的工作模式由 TMOD 寄存器来控制,其中高 4 位控制定时器 1,低 4 位控制定时器 0。TMOD 每位(由高到低)的含义如下:

TMOD 寄存器

  • Gate:定时器使能控制模式。Gate = 1 时,定时器使能由 TRx 和硬件引脚(INTx)共同控制,只有外部引脚为高且 TRx 为 1 时,定时器才会工作;Gate = 0 时,定时器使能仅由 TRx 控制,TRx 为 1 时,定时器工作。

  • C / T (Counter / Timer):定时器 / 计数器模式选择。C / T = 0 时,工作在定时器模式,数值寄存器受机器周期控制;C / T = 1 时,工作在计数器模式,数值寄存器受外部引脚控制。

  • M1、M0:工作模式选择,见“工作模式”节。

数值寄存器

每个定时器均有两个 8-bit 的数值寄存器(TLx 和 THx),通过读取这些寄存器,可以获得定时器。

  • 模式 0 13-bit 的数值被存储在 TH 的 8 位和 TL 的较低 5 位中。

  • 模式 1 16-bit 的数值被存储在 TH 和 TL 中。

  • 模式 2 TL 作为 8 位数值寄存器,TH 存储计数初值。当计数溢出时,自动将 TH 中存储的数值送入 TL,使 TL 从这一初值开始重新计数。TH 的值始终不变。

代码解析

在实际项目中,我们一般使用定时器进行标志位重设及刷新数码管。

(未完待续)

串口中断和定时器中断_启士 | 蓝桥杯单片机教程12 中断与定时器 (上)相关推荐

  1. 合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)

    这是 北航士谔书院 的第 940 篇推送 北航士谔书院X大班提醒您: 道路千万条,学习第一条 不搞单片机,开学两行泪 --新春快乐,我们又回来了! 本文对 I²C 总线的协议做出详细的介绍,并对其在 ...

  2. [蓝桥杯单片机]模块学习—中断系统

    前一段时间的文章已经跟各位一起刷了一部分的客观题了 接下来将会跟大家一起从官方提供的原理图和芯片手册出发 练习每个模块的程序编写 因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以 ...

  3. 第jiu届蓝桥杯单片机省赛真题_第九届蓝桥杯单片机组省赛试题.pdf

    第九届蓝桥杯单片机组省赛试题 "彩灯控制器"的程序设计与调试 (70 分) 一.基本要求 1.1 使用CT107D 单片机竞赛板,完成"彩灯控制器"功能的程序设 ...

  4. 蓝桥杯单片机比赛学习:7、中断系统之串口中断的基本原理

    这一节我们讲一下蓝桥杯单片机比赛中断中的最后一个模块--串口.中断的其他模块在我的个人主页(4条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主有兴趣的可以去学习. 通信 ...

  5. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...

  6. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理

    中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...

  7. 蓝桥杯单片机设计与开发_标准模板

    蓝桥杯单片机设计与开发_标准模板 一.前言 首先,这篇文章是笔者第一次在 CSDN 上写博文,较为生疏,读者若有任何意见,欢迎大家在评论区交流! 笔者目前为一名大二学生,参加了2021年蓝桥杯单片机设 ...

  8. 蓝桥杯单片机串口通信学习提升笔记

    今日得以继续蓝桥杯国赛备赛之旅: 有道是 "不知何事萦怀抱,醒也无聊,醉也无聊,梦也何曾到谢桥." 那我们该如何 让这位诗人纳兰 "再听乐府曲 ,畅解相思苦"呢 ...

  9. 【蓝桥杯单片机组模块】14、STC15定时器2的PWM使用

    微信搜索:ReCclay,也可免费阅读博主蓝桥系列所有文章,后台回复"代码"即可获取蓝桥所有备赛代码!关注博主公众号,还可拥有加入博主粉丝群实时沟通技术难题.免费下载CSDN资源等 ...

最新文章

  1. 数控机床编程用c语言,基于C语言数控机床智能后置处理程序的制作-(1).pdf
  2. 分享13个帮助你简化开发的jQuery插件
  3. NanoPi NEO Air使用四:操作GPIO
  4. linux 760权限,Linux 文件rwx权限问题 chmod 777 XXX 任何人拥有最高权限
  5. Redis面试题答案整理
  6. P1009 [NOIP1998 普及组] 阶乘之和-2022.02.01(python3实现)
  7. fastdfs-02-上传与下载流程
  8. 查看HTML请求(request)中的标头(Headers)信息
  9. 工作频率对系统功率、穿透能力、设备体积、系统性能的影响
  10. 今天是没有python的一天(大物实验‘利用牛顿环测量曲率半径’报告和大物复习)
  11. 多系统下的蓝牙设备共用配对问题之LTK、EDIV、ERAND.以 Manjaro、Debian、Windows10 为例
  12. 安卓音视频开发!为了跳槽强刷1000道Android真题,大厂直通车!
  13. iOS开发 swift 3dTouch实现 附代码
  14. 解决小米远程管理下电脑出现ftp文件错误提示
  15. 爱普迪供应CS连接器,适用400G传输
  16. 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
  17. 如何顺利通过 PMP 考试?
  18. MySQL如何自定义函数
  19. Vue的基础入门及使用
  20. 修改php多文件运行时间,如何修改php文件创建时间

热门文章

  1. RabbitMQ——消息发布订阅
  2. 深入剖析Linux IO原理和几种零拷贝机制的实现
  3. jdbc连接mysql问题
  4. 沉浸文化获星瀚资本百万元级种子轮投资,星瀚资本投资
  5. Leetcode: mimimum depth of tree, path sum, path sum II
  6. 视频数据:骨骼数据采集(Skeleton Data)
  7. 使用delphi 开发多层应用(十六)使用XMLRPC 实现basic4android 远程调用RTC服务
  8. CreateCompatibleBitmap
  9. Python学习笔记——算术操作符和优先级问题
  10. oracle+solaris+密码,Oracle Solaris 10回滚补丁文件密码哈希泄露漏洞