中断一方面可以通过标志位的设定,极大的降低CPU的占用率;另一方面使用中断,也实现了单片机对复杂情景的处理。
CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,转而为该外设服务(或者是处理紧急事件),处理完毕后再回到原断点继续执行原程序。这个过程称为中断。
注:这里对于初学者,额外解释一句,上述所指的外设一般情况下指的是片上外设。例如定时器、串行口等 我们的计算机主要由运算器、控制器(合成中央处理器CPU)、输入、输出、存储这五大部分构成。除了运算器和控制器,基本都可以叫外设。
引起中断的原因和发出中断请求的来源,称为中断源。 中断源可以是外设(通过接口)、紧急事件、定时器或人为设置用于单步或断点调试程序。
当有多个中断源同时向CPU申请中断时,CPU优先响应最需紧急处理的中断请求,这种预先安排的响应次序,称为中断优先级。
能实现中断功能并能对中断进行管理的硬件和软件称为中断系统。 中断请求是在执行程序的过程中随机发生的。
中断系统要解决的问题: ①CPU在不断的执行程序的过程中,如何检测到随机发生的中断请求 ②是否允许中断 ③如何正确的进入中断 ④怎么排列优先级 ⑤中断完成后,怎么返回原断点处
基础51单片机有5个中断源,增强型52系列增加了一个定时计数器2,共有6个中断源。其中包含两个外部中断源,其余为内部中断源(具体几个可参考自己所用单片机型号的对应数据手册,不同型号之间均有差异)。
基础51单片机只有两个中断优先级,其他型号可能有更多的优先级(取决于用来控制优先级的位数多少,问我为什么,先请去复习一下二进制),通过这些优先级的设置,我们可以使中断实现嵌套。
中断控制主要由两个方面: A:是否允许中断 B:中断的优先级设置
① 中断控制寄存器 IE ——中断的允许和接收
EA—ET2ESET1EX1ET0EX0中断总控位T2串行口T1INT1T0INT0EA:中断总控开关,1-CPU开中断,0-关 其他都是一样,为表内各个对应外设的中断开关,1开0关
②中断请求标志及外部中断方式选择寄存器TCON
TF1TR1TF0TR0IE1IT1IE0IT0T1请求有无T1工作启停T0请求有无T1工作启停INT1 请求有无INT1工作方式 下降沿/低电平INT0请求有无INT0工作方式 下降沿/低电平注:串行口的中断标志位在SCON的RI和TI位
补充: 低电平和下降沿触发的区别 ①触发条件不同 低电平触发:低电平触发后一直处于中断状态 下降沿触发:检测到信号有下降沿时就触发开关动作,
②触发次数不同 低电平触发:只要引脚为低电平时间内中断一直有效,就会一直进入中断,直到变为高电平 下降沿触发:下降沿触发只触发一次,只在下次电平发生变化时才重新触发中断
③、中断优先级管理寄存器IP
注:不同型号的单片机,随着寄存器的增多,可用来控制优先级的位数越多,优先级层级就越多
——PT2PSPT1PX1PT0PX0T2优先级高低串行口优先级高低T1优先级高低INT1优先级高低T0优先级高低INT0优先级高低1表优先级高 0低 若同为0或1时,CPU查询顺序为 INT0→T0→INT1→T1→TI/RI→T2
从图中可以看出,我们的51单片机中断部分流程如下:
①检测对应中断源标志位
②检测对应中断开关是否打开
③检测总中断是否打开
④查询是否有优先级更高或同优先级中断正在执行
⑤有高优先级或同级,等待其执行完毕进行中断;无高优先级和同级,直接进行中断
CPU对中断的响应分为4个阶段:中断请求、中断响应、中断服务、中断返回 这里以定时器中断为例进行讲解
①CPU正常执行主程序
②定时器TH0,TL0计满溢出,中断标志位TF0置1
③CPU执行到正在进行的指令的最后一个机器周期,例行检测中断标志位
④检测到TF0=1,暂停主程序执行,查询EA、ET0,看是否允许中断
⑤检测中断优先级,看是否有条件执行中断
⑥查询可以执行中断,将CPU将要执行的下一条存于PC中的指令存入栈内(PC:程序计数器,存放CPU要执行的下一条指令)
⑦将中断入口地址送入PC,PC再送入CPU,进入中断服务函数
⑧进入中断服务函数,擦除中断标志位(软件清零),执行中断服务函数
⑨中断返回,将入栈的断点PC指令存入PC,返回主程序断点,继续执行
1、开中断总开关EA,置位中断源的中断允许位
2、对于外部中断INT0、INT1,应选择中断触发方式为低电平还是下降沿
3、设定中断优先级,预置IP
4、中断服务程序函数定义 注:中断服务函数格式: 返回值 函数名([参数])[模式][ 再入]interrupt n [using m]
含义: interrupt n 将函数声明为中断服务函数 n: 0——外部中断0 1——定时/计数器0溢出中断 2——外部中断1 3——定时计数器1溢出中断
using m 定义函数使用的工作寄存器组 m 取值范围为0~3