串口中断和定时器中断_启士 | 蓝桥杯单片机教程12 中断与定时器 (上)
这是 北航士谔书院 的第 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 中断与定时器 (上)相关推荐
- 合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)
这是 北航士谔书院 的第 940 篇推送 北航士谔书院X大班提醒您: 道路千万条,学习第一条 不搞单片机,开学两行泪 --新春快乐,我们又回来了! 本文对 I²C 总线的协议做出详细的介绍,并对其在 ...
- [蓝桥杯单片机]模块学习—中断系统
前一段时间的文章已经跟各位一起刷了一部分的客观题了 接下来将会跟大家一起从官方提供的原理图和芯片手册出发 练习每个模块的程序编写 因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以 ...
- 第jiu届蓝桥杯单片机省赛真题_第九届蓝桥杯单片机组省赛试题.pdf
第九届蓝桥杯单片机组省赛试题 "彩灯控制器"的程序设计与调试 (70 分) 一.基本要求 1.1 使用CT107D 单片机竞赛板,完成"彩灯控制器"功能的程序设 ...
- 蓝桥杯单片机比赛学习:7、中断系统之串口中断的基本原理
这一节我们讲一下蓝桥杯单片机比赛中断中的最后一个模块--串口.中断的其他模块在我的个人主页(4条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主有兴趣的可以去学习. 通信 ...
- 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理
上节我们讲了中断的外部中断,基本的了解了一下中断,这一节我们继续来学习中断系统的定时器中断基本原理,本节很重要无论是在比赛中还是在单片机.嵌入式等的学习上都有着很重要的地位.如对本作者有兴趣可以去我主 ...
- 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理
中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...
- 蓝桥杯单片机设计与开发_标准模板
蓝桥杯单片机设计与开发_标准模板 一.前言 首先,这篇文章是笔者第一次在 CSDN 上写博文,较为生疏,读者若有任何意见,欢迎大家在评论区交流! 笔者目前为一名大二学生,参加了2021年蓝桥杯单片机设 ...
- 蓝桥杯单片机串口通信学习提升笔记
今日得以继续蓝桥杯国赛备赛之旅: 有道是 "不知何事萦怀抱,醒也无聊,醉也无聊,梦也何曾到谢桥." 那我们该如何 让这位诗人纳兰 "再听乐府曲 ,畅解相思苦"呢 ...
- 【蓝桥杯单片机组模块】14、STC15定时器2的PWM使用
微信搜索:ReCclay,也可免费阅读博主蓝桥系列所有文章,后台回复"代码"即可获取蓝桥所有备赛代码!关注博主公众号,还可拥有加入博主粉丝群实时沟通技术难题.免费下载CSDN资源等 ...
最新文章
- 数控机床编程用c语言,基于C语言数控机床智能后置处理程序的制作-(1).pdf
- 分享13个帮助你简化开发的jQuery插件
- NanoPi NEO Air使用四:操作GPIO
- linux 760权限,Linux 文件rwx权限问题 chmod 777 XXX 任何人拥有最高权限
- Redis面试题答案整理
- P1009 [NOIP1998 普及组] 阶乘之和-2022.02.01(python3实现)
- fastdfs-02-上传与下载流程
- 查看HTML请求(request)中的标头(Headers)信息
- 工作频率对系统功率、穿透能力、设备体积、系统性能的影响
- 今天是没有python的一天(大物实验‘利用牛顿环测量曲率半径’报告和大物复习)
- 多系统下的蓝牙设备共用配对问题之LTK、EDIV、ERAND.以 Manjaro、Debian、Windows10 为例
- 安卓音视频开发!为了跳槽强刷1000道Android真题,大厂直通车!
- iOS开发 swift 3dTouch实现 附代码
- 解决小米远程管理下电脑出现ftp文件错误提示
- 爱普迪供应CS连接器,适用400G传输
- 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
- 如何顺利通过 PMP 考试?
- MySQL如何自定义函数
- Vue的基础入门及使用
- 修改php多文件运行时间,如何修改php文件创建时间
热门文章
- RabbitMQ——消息发布订阅
- 深入剖析Linux IO原理和几种零拷贝机制的实现
- jdbc连接mysql问题
- 沉浸文化获星瀚资本百万元级种子轮投资,星瀚资本投资
- Leetcode: mimimum depth of tree, path sum, path sum II
- 视频数据:骨骼数据采集(Skeleton Data)
- 使用delphi 开发多层应用(十六)使用XMLRPC 实现basic4android 远程调用RTC服务
- CreateCompatibleBitmap
- Python学习笔记——算术操作符和优先级问题
- oracle+solaris+密码,Oracle Solaris 10回滚补丁文件密码哈希泄露漏洞