第1页:项目6 中断及定时系统封面
项目6「中断及定时系统」是《单片机原理及应用》的核心章节,系统讲解MCS-51单片机的中断机制与定时/计数器原理及应用。
- 中断系统的结构、中断源与中断标志
- 中断请求的控制:中断允许、优先级与嵌套
- 中断处理过程:响应、处理、返回与请求撤除
- 定时/计数器的结构、控制寄存器与四种工作方式
第2页:中断的定义、嵌套与优先级
本页给出中断的基本定义,并说明中断嵌套与优先级的机制。
- 中断的定义
- CPU在处理事件A时,发生另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前工作,转去处理事件B(中断响应和中断服务);待处理完毕后回到原事件A被中断处继续处理(中断返回),这一过程称为中断。引起中断的请求源称为中断源。8051共有5个中断源:两个外部中断、两个定时/计数器中断、一个串行口中断。
- 中断的嵌套与优先级
- 8051单片机的5个中断源具有两个优先级,高优先级中断可打断低优先级中断,实现两级中断嵌套。
第3页:中断的响应过程
本页详述中断响应过程的四个步骤及中断系统的意义。
- 保护断点:保存下一将要执行的指令地址,送入堆栈
- 寻找中断入口:根据5个中断源查找对应的中断服务程序入口地址
- 执行中断处理程序
- 中断返回:从中断处返回主程序,继续执行
中断系统是计算机的重要组成部分,可提高CPU工作效率与实时数据处理时效,广泛应用于实时控制、故障自动处理、计算机与外围设备间数据传送及人机联系。
第4页:6.1.2 中断系统的结构
本页为「6.1.2 中断系统的结构」章节标题页,引出MCS-51中断系统的内部结构组成与工作机制。
第5页:中断源和中断标志
本页介绍MCS-51的5个中断源及各自的中断标志产生方式。
- 外部中断请求源
- 外部中断0和1,经由外部引脚引入,即P3.2、P3.3两个引脚。
- 内部中断请求源
- 两个定时器中断和串行口中断。内部两个16位定时/计数器对内部定时脉冲或T0/T1引脚输入的外部计数脉冲计数,定时时间到或计数满时自动向CPU提出中断请求。
串行口中断分为发送中断和接收中断,发送/接收完一组数据后,单片机自动使串行口控制寄存器SCON的RI或TI中断标志置位,并向CPU提出中断请求。
第6页:80C51中断系统结构总览
本页对80C51单片机中断系统的构成进行总览。
- 5个中断源:2个外部中断(由引脚输入中断请求信号)、2个片内定时器/计数器溢出中断(T0、T1)、1个片内串行口中断
- 2个中断优先级,可实现两级中断嵌套
- TCON、SCON:存放各中断源的中断申请标志
- IE:设置是否允许各中断源中断
- IP:设置各中断源的优先级别
- 硬件查询:同级中断源再排队的硬件电路
第7页:定时器控制寄存器TCON
- IE0
- 外部中断0请求标志位。CPU检测到引脚上出现下降沿或低电平信号时,由内部硬件置位IE0(IE0=1),向CPU请求中断。
- IE1
- 外部中断1请求标志位。CPU检测到引脚上出现下降沿或低电平信号时,由内部硬件置位IE1(IE1=1),向CPU申请中断。
- TF0
- 定时器/计数器T0的溢出中断请求标志位。T0计数溢出时由内部硬件置位TF0(TF0=1),向CPU申请中断。
- TF1
- 定时器/计数器T1的溢出中断请求标志位。T1计数溢出时由内部硬件置位TF1(TF1=1),向CPU申请中断。
- IT0
- 外部中断0触发方式控制位。IT0=0为电平触发、低电平有效;IT0=1为边沿触发、下降沿有效。
- IT1
- 外部中断1触发方式控制位。IT1=0为电平触发、低电平有效;IT1=1为边沿触发、下降沿有效。
第8页:串行口控制寄存器SCON
- TI
- 串行口发送中断请求标志位。串行口发送完一个数据帧时,将TI置位(TI=1),向CPU申请中断。
- RI
- 串行口接收中断请求标志位。串行口接收完一个数据帧时,将RI置位(RI=1),向CPU申请中断。
第9页:对中断请求的控制概述
本页概述中断请求控制的基本分类。
- 非屏蔽中断:用户不能用软件禁止,一旦有中断申请,CPU必须响应
- 可屏蔽中断:用户可通过软件控制是否允许某中断源中断;允许中断称中断开放,不允许称中断屏蔽
MCS-51系列单片机的5个中断源都是可屏蔽中断。
第10页:中断允许寄存器IE
- EA
- 中断允许总控制位。EA=0中断总禁止,禁止所有中断;EA=1中断总允许,置1后各中断源由各自控制位设置。
- EX0、EX1
- 外部中断允许控制位。为0禁止外中断INT0(INT1)申请;为1允许外中断INT0(INT1)申请。
- ET0、ET1
- 定时/计数中断允许控制位。为0禁止定时/计数器0(1)申请;为1允许定时/计数器0(1)申请。
- ES
- 串行口中断允许控制位。为0禁止串口中断;为1允许串口中断。
中断允许寄存器IE的单元地址是A8H,各控制位可位寻址也可字节寻址。例如用位指令开放外部中断:SETB EA、SETB EX0;用字节传送指令仅需一条:MOV IE,#81H。
第11页:IE寄存器设置实例
本页通过实例演示IE寄存器的设置方法。
例:设允许定时器/计数器T1的溢出中断请求,禁止其它中断源的中断请求,写出设置IE的指令。
- 分析:EA=1、ET1=1、其它位为0,IE值应为10001000B,即88H
- 字节传送指令:MOV IE,#88H 或 MOV 0A8H,#88H
- 位操作指令:SETB ET1(允许T1溢出中断)、SETB EA(CPU允许所有中断源中断)
第12页:中断优先级寄存器IP概述
本页为中断优先级寄存器IP的概述。
- 80C51单片机的5个中断源均可由程序设置为高优先级或低优先级中断
- 优先级高的中断源先被响应
- 每个中断源的优先级通过中断优先级寄存器IP统一设置
第13页:IP寄存器各控制位
- PX0、PX1
- PX0为外部中断0的中断优先级控制位;PX1为外部中断1的中断优先级控制位。
- PT0、PT1
- PT0为定时器/计数器T0的溢出中断优先级控制位;PT1为定时器/计数器T1的溢出中断优先级控制位。
- PS
- 串行口中断优先级控制位。
当某中断源的优先级控制位为1时,设置为高优先级中断;为0时,设置为低优先级中断。
第14页:8051中断源中断优先级顺序表
表6-1 8051各个中断源中断优先级顺序:8051单片机在出现三个或更多中断请求源、同一优先级别不止一个中断源时,按统一规定的优先级顺序排队。
表6-1 8051各个中断源中断优先级顺序| 优先级顺序 | 中断源 |
|---|
| 最高 | 外部中断0 |
|---|
| 第2 | 定时/计数器0溢出中断 |
|---|
| 第3 | 外部中断1 |
|---|
| 第4 | 定时/计数器1溢出中断 |
|---|
| 最低 | 串行口中断 |
|---|
中断系统的两条基本规则:1) 低优先级中断可被高级中断打断,反之不能;2) 多个中断源同时申请时,级别高的先服务(先按高低优先级区分,再按辅助优先级区分)。
第15页:IP寄存器设置实例
本页通过实例演示IP寄存器的设置方法。
例:设80C51单片机的外部中断为高优先级,内部中断为低优先级,写出设置IP的指令。
- 分析:PX1=1、PX0=1,其余位为0,即IP=00000101B=05H
- 字节传送指令:MOV IP,#05H 或 MOV 0B8H,#05H
- 位操作指令:SETB PX0、SETB PX1、CLR PT0、CLR PT1、CLR PS
第16页:中断响应
本页讲解中断响应的条件与过程,属于中断处理过程的第一阶段。
- 中断响应
- CPU对中断源中断请求的响应,包括保护断点和将程序转向中断服务程序的入口地址(矢量地址)。
- 中断响应条件
- (1) 有中断源发出中断请求;(2) 中断总允许位EA=1;(3) 申请中断的中断源允许。
满足基本条件CPU一般会响应中断;但若CPU正在响应同级或高优先级中断、正在执行RETI指令或访问IE和IP寄存器,则CPU不响应中断请求,而在下一机器周期继续查询,否则在下一机器周期响应中断。
第17页:中断入口地址表
本页给出MCS-51系列单片机各中断源的入口地址分配表,并说明入口地址的使用方式。
表6-2 中断入口地址| 中断源 | 入口地址 |
|---|
| 外部中断0 | 0003H |
|---|
| 定时/计数器0溢出中断 | 000BH |
|---|
| 外部中断1 | 0013H |
|---|
| 定时/计数器1溢出中断 | 001BH |
|---|
| 串行口中断 | 0023H |
|---|
各中断源的入口地址由硬件事先设定,因5个入口地址之间只相隔8个存储单元,一般中断服务程序容纳不下,通常在这些入口地址处存放一条绝对跳转指令(如AJMP),使程序跳转到存储器其他空间执行中断服务程序。例如定时器T0中断入口地址为000BH,中断服务程序名为TIME00,指令形式为:ORG 000BH(T0中断入口)、AJMP TIME00(转向中断服务程序入口地址)。
第18页:中断处理
本页讲解中断处理阶段,即执行中断服务程序的内容。
中断服务程序从中断入口地址开始执行,到返回指令RETI为止,一般包括保护现场和完成中断源请求的服务两部分。
主程序和中断服务程序都会用到累加器A、状态寄存器PSW等寄存器,进入中断服务程序后若破坏寄存器内容,返回后将导致主程序混乱,因此一般要先保护现场,再执行中断处理程序,返回前再恢复现场。示例:
- TIME00: CLR EA(关中断)
- PUSH PSW(保护现场)
- PUSH ACC、PUSH B
- ……中断处理……
- POP B、POP ACC、POP PSW(恢复现场)
- SETB EA(开中断)、RETI(中断返回)
第19页:编写中断服务程序的注意事项
本页列出编写中断服务程序时需注意的要点。
- 各中断源入口地址之间只相隔8个字节,容纳不下普通中断服务程序,因此入口地址单元通常存放一条无条件转移指令,将中断服务程序转至存储器其它空间
- 若执行当前中断程序时禁止其它更高优先级中断,需先用软件关闭CPU中断或禁止相应高优先级中断,返回前再开放中断
- 保护现场前关中断,保护现场后若允许高优先级中断则应开中断;恢复现场前先关中断,恢复之后再开中断,以免现场数据被破坏或造成混乱
第20页:中断返回
本页讲解中断处理的第三阶段——中断返回。
- 中断返回
- 中断服务完成后,计算机返回原来断开的位置(断点),继续执行原来的程序,由中断返回指令RETI实现。
RETI指令的功能:把断点地址从堆栈中弹出送回程序计数器PC,并通知中断系统已完成中断处理,同时清除优先级状态触发器。
第21页:中断请求的撤除
本页说明MCS-51各中断源中断请求的撤除方法,CPU响应中断后应撤除该中断请求,否则会重复引起中断而导致错误。
- 定时器中断请求撤除:定时器0或1溢出中断,CPU响应中断后即由硬件自动清除标志位TF0或TF1,无需其它措施
- 串行口中断请求撤除:CPU响应中断后硬件不能自动清除TI、RI,必须在中断服务程序中用软件清除,如CLR TI、CLR RI
- 外部中断请求撤除:边沿触发的外部中断0或1,CPU响应后由硬件自动清除IE0或IE1;电平触发的外部中断,CPU响应后硬件不会自动清除,也不能用软件清除,需通过硬件配合软件在响应后立即撤除引脚上的低电平,否则会引起重复中断
第22页:【例6.1】按键控制信号灯
本页给出外部中断的应用实例。
【例6.1】电路如图6-3所示,按键控制信号灯,试利用两个外部中断编程实现以下功能:K0单独按下,黄灯亮;K1单独按下,绿灯亮。
第23页:定时的概念与计数源
本页讲解定时与计数的基本概念。
- 计数的概念:计算事件发生的次数
- 定时的概念:生活中常见的定时如电视机定时关机、空调定时开关、微波炉定时加热等
单片机中的定时器和计数器是一个东西:计数器记录外界发生的事件,定时器则由单片机提供一个稳定的计数源,即由晶振经12分频后获得的一个脉冲源。在晶振为12MHz的情况下,这个计数脉冲的时间间隔就是1μs。
第24页:计数器的容量与预置数
本页讲解8051计数器容量与预置数概念。
- 8051单片机中有两个16位计数器T0和T1,最大计数量为65536,即0000H~FFFFH
- 计到65536个即产生溢出
- 预置数法:实际需要计数值少于65536时,先放入初值再计数。如要计100,先放进65436,再来100个脉冲即可到65536
定时同理:每个脉冲1μs,计满65536个脉冲需65.536ms;若要10ms(10000个脉冲),只需在计数器中放进55536即可。
第25页:定时/计数器的结构
本页为「6.2.2 定时/计数器的结构」内容,介绍定时器/计数器的内部结构。
8051单片机内部有两个16位的可编程定时器/计数器,称为定时器0(T0)和定时器1(T1),可编程选择其作为定时器或计数器使用。工作方式、定时时间、计数值、启动、中断请求等都可以由程序设定,其逻辑结构如图6-7所示。
第26页:定时器/计数器方式寄存器TMOD
本页为「6.2.3 定时器/计数器的控制」的开篇,介绍通过两个特殊功能寄存器TMOD和TCON让定时/计数器工作。
- TMOD
- T0、T1的工作方式寄存器,低4位为T0的方式字段,高4位为T1的方式字段,含义完全相同。
第27页:TMOD各位定义
- GATE
- 门控位。GATE=0时计数器启动只受TCON中TR0或TR1控制,不受外部引脚控制;GATE=1时启动还受外部引脚信号控制。
- C/T
- 功能选择位。为0时为定时功能,计数脉冲为时钟振荡信号12分频(对机器周期计数);为1时为计数功能,计数脉冲从T0(P3.4)或T1(P3.5)端输入的外部脉冲。
- M1、M0
- 工作方式选择位。定时器/计数器有4种工作方式,通过M1、M0组合设置。
第28页:TMOD工作方式选择表
TMOD工作方式选择:下表列出M1、M0组合对应的四种工作方式。
定时器/计数器工作方式选择| M1 M0 | 工作方式 |
|---|
| 0 0 | 13位定时器/计数器方式 |
|---|
| 0 1 | 16位定时器/计数器方式 |
|---|
| 1 0 | 自动重装载8位定时器/计数器方式 |
|---|
| 1 1 | T0被拆为两个8位定时器/计数器,T1停止计数方式 |
|---|
TMOD不能位寻址,只能用字节指令设置定时器工作方式,高4位定义T1,低4位定义T0;复位时TMOD所有位均置0。
第29页:定时器/计数器控制寄存器TCON
本页为定时器/计数器控制寄存器TCON的讲解起始页,承接TMOD之后的定时器控制内容。
第30页:TCON各位定义
- TF1
- 定时器1溢出标志位。定时器1计数满产生溢出时由硬件自动置TF1=1,中断允许时向CPU发出中断请求,进入中断服务程序后由硬件自动清0;中断屏蔽时作查询测试用,只能由软件清0。
- TR1
- 定时器1运行控制位。由软件置1或清0启动或关闭定时器1。GATE=1且为高电平时TR1置1启动定时器1;GATE=0时TR1置1即可启动。
- TF0
- 定时器0溢出标志位,功能及操作同TF1。
- TR0
- 定时器0运行控制位,功能及操作同TR1。
TCON低4位(IE1、IT1、IE0、IT0)用于控制外部中断,与定时器/计数器无关;系统复位时TCON所有位均清0。TCON字节地址为88H,可位寻址,清溢出标志或启动定时器可用位操作指令,如SETB TR1、JBC TF1,LOOP。
第31页:方式0的13位计数器结构
本页讲解定时器/计数器的工作方式0——13位计数器结构。
- 当TMOD的M1、M0位为00时,定时器/计数器工作在方式0
- 方式0的计数器由TL0的低5位与TH0的8位组成13位结构,TL0的高3位未用
- TL0低5位进位时TH0加1;TH0最高位进位产生溢出,使TF0=1,向CPU申请中断
- 若CPU响应中断,系统自动将TF0复位
图6-9为方式0中的13位计数器分配。
第32页:方式0的定时时间计算
本页给出定时器/计数器工作方式0的定时时间与计数初值计算。
- 当C/T=0时,多路开关连接12分频器输出,T0对机器周期计数,此时T0为定时器
- 当C/T=1时,多路开关与T0(P3.4)相连,外部计数脉冲由T0脚输入,外部信号发生由0到1的负跳变时计数器加1,此时T0为计数器
定时时间计算公式:t =(计数最大值-X)×12/fosc。方式0为13位计数器结构,计数最大值为2¹³=8192。设fosc为12MHz,经12分频后每个计数脉冲周期为1μs;当计数初值X为0时定时时间最长,方式0的最大定时时间为:tmax=(2¹³-0)×12/fosc=8192×1μs=8.192ms。
第33页:方式0的计数次数计算
本页给出定时器/计数器工作方式0的计数次数计算。
- 设计数次数为C,计数初值为X,则计数次数公式为:C = 计数最大值 − X
- 当计数初值X为0时,计数次数最多,方式0的最大计数次数为:Cmax = 2¹³ − 0 = 8192
第34页:【例6.2】方式0定时1ms求解
本页给出定时器0工作方式0的应用实例求解过程。
【例6.2】用定时器0的工作方式0实现1ms的定时,在P1.0引脚上输出周期为2ms的方波。设晶振频率为12MHz。
- 第一步,设置TMOD:M1M0=00(方式0),C/T=0(定时状态),GATE=0(定时器与外部中断无关),其余位取0,即TMOD=00000000B=00H
- 第二步,计算初值:根据公式得出X=1C18H=0001110000011000B;因13位计数器中TL0高3位未用应填0,TH0占高8位,实际填写值为X=E018H,即TH0=E0H、TL0=18H
第35页:【例6.2】方式0定时查询方式程序
本页为【例6.2】的查询方式汇编源程序。
- ORG 0000H / LJMP MAIN
- ORG 0100H
- MAIN: MOV TMOD,#00H(设定时器0为工作方式0)
- SETB TR0(启动定时器)
- LOOP: MOV TH0,#0E0H / MOV TL0,#18H(装入计数初值)
- JNB TF0,$(T0没有溢出,等待溢出)
- CLR TF0
- CPL P1.0(P1.0取反输出方波)
- LJMP LOOP / END
第36页:方式1的16位定时器/计数器
本页讲解定时器/计数器的工作方式1。
- 定时器工作于方式1时构成16位定时器/计数器,最大计数值为2¹⁶=65536
- 其结构与操作几乎完全与方式0相同,唯一差别是计数位数不同(将M1M0设为01)
- 方式0是为与51机的前辈48系列兼容而设,一般可直接使用方式1
第37页:【例6.3】方式1定时50ms求解
本页给出定时器0工作方式1的应用实例求解过程。
【例6.3】用定时器0的工作方式1实现50ms的定时,在P1.0引脚上输出周期为100ms的方波。设晶振频率为12MHz。
- 第一步,设置TMOD:M1M0=01(方式1),其余与例6.2相同,即TMOD=00000001B=01H
- 第二步,计算初值:根据公式得出X=2¹⁶−50000=15536=3CB0H,即TH0=3CH、TL0=B0H
第38页:【例6.3】方式1定时中断方式程序
本页为【例6.3】的中断方式汇编源程序。
- ORG 0000H / LJMP MAIN
- ORG 000BH / LJMP TIME00
- ORG 0100H
- MAIN: MOV TMOD,#01H(设定时器0为工作方式1)
- MOV TH0,#3CH / MOV TL0,#0B0H(装入计数初值)
- SETB EA(开总中断)
- SETB ET0(开定时器中断)
- SETB TR0(启动定时器T0)
- LOOP: SJMP $(等待中断)
- TIME00: CPL P1.0(P1.0取反输出方波)
- MOV TH0,#3CH / MOV TL0,#0B0H(重新装入计数初值)
- RETI
第39页:方式2的自动重装载机制
本页讲解定时器/计数器的工作方式2——自动再装入预置数的工作方式。
- 方式2中16位定时/计数器被分割为两个:TL0(TL1)用作8位计数器,TH0(TH1)用以保持初值
- TH0(TH1)作8位寄存器存放计数器初始值;TL0(TL1)作8位加1计数器
- 当TL0(TL1)计数溢出时,不仅TF0(TF1)置1,还自动把TH0(TH1)中的内容重装到TL0(TL1)
- 程序初始化时TL0与TH0由软件赋予相同初值,溢出后TF0置位并自动重装初值,进入新一轮计数,循环不止
用于定时工作方式时,其定时时间按8位计数初值计算。
第40页:【例6.4】方式2定时100μs输出方波
本页给出定时器0工作方式2的应用实例及程序。
【例6.4】用定时器0的工作方式2实现100μs的定时,在P1.0引脚上输出周期为200μs的方波。设晶振频率为12MHz。
- 第一步,设置TMOD:M1M0=10(方式2),TMOD=00000010B=02H
- 第二步,计算初值:X=2⁸−100=156=9CH,即TH0=9CH、TL0=9CH
程序采用中断方式:
- ORG 0000H / LJMP MAIN
- ORG 000BH / CPL P1.0 / RETI
- MAIN: MOV TMOD,#02H、MOV TH0,#9CH、MOV TL0,#9CH
- MOV IE,#82H(开中断)、SETB TR0(启动定时器T0)
- LOOP: SJMP $(等待中断)
第41页:定时器/计数器工作方式总述与方式0
本页为「6.2.4 定时器/计数器的工作方式」总述,通过TMOD中M0、M1位设置可选择方式0、方式1、方式2和方式3。在方式0、1和2时,T0和T1工作方式相同;方式3时两个定时器工作方式不同。
- 方式0构成13位定时器/计数器,最大计数值为2¹³=8192
第42页:方式0的结构与启停控制
本页详述方式0的结构与启停控制逻辑。
- 16位加法计数器(TH0和TL0)只用了13位:TH0占高8位,TL0占低5位(高3位未用)
- TL0低5位溢出时自动向TH0进位,TH0溢出时向中断位TF0进位并申请中断
- CPU在每个机器周期查询TF0是否置位以产生T0中断
启停控制:当GATE=0时或门输出为1,TR0直接控制定时器0的启动和关闭,TR0=1从初值开始计数直至溢出并申请中断,需循环计数时须重置初值并用软件将TF0复位,TR0=0则停止计数;当GATE=1时与门输出由外部引脚电平与TR0状态确定,外部信号可直接开启或关断计数。
第43页:方式1的16位定时器/计数器
本页讲解定时器/计数器的工作方式1。
- 定时器工作于方式1时构成16位定时器/计数器,最大计数值为2¹⁶=65536
- 其结构与操作几乎完全与方式0相同,唯一差别是计数位数不同(将M1M0设为01)
- 方式0是为与51机的前辈48系列兼容而设,一般可直接使用方式1
第44页:方式2的自动重装载机制
本页详解定时器/计数器的工作方式2——自动再装入预置数的工作方式。
- 16位定时/计数器被分割为两个:TL0(TL1)用作8位计数器,TH0(TH1)用以保持初值
- TL0计数溢出时TF0(TF1)置1,并自动把TH0(TH1)中的内容重装到TL0(TL1)
- 初始化时TL0与TH0赋予相同初值,溢出后自动重装进入新一轮计数,循环不止
- 用于计数模式时,最长计数长度为2⁸=256个外部脉冲
- 可省去用户软件中重装常数的程序,产生相当精度的定时时间,特别适于作串行口波特率发生器
第45页:方式3的T0与T1特殊结构
本页讲解定时器/计数器的工作方式3——T0与T1工作方式大不相同。
- 方式3下定时器T0被分解为两个独立的8位计数器TL0和TH0
- TL0占用原T0的控制位、引脚和中断源(C/T、GATE、TR0、TF0、T0(P3.4)引脚、外部中断(P3.2)引脚),功能与方式0、方式1类似,可定时亦可计数
- TH0占用原定时器T1的控制位TF1和TR1,同时占用T1的中断源,启动关闭仅受TR1控制,只能对机器周期计数,只能用作简单的内部定时,不能对外部脉冲计数,是T0附加的一个8位定时器
方式3时定时器1仍可设置为方式0、方式1或方式2,但TR1、TF1及T1的中断源已被T0占用,T1仅由控制位切换定时或计数功能,计数溢出时只能将输出送往串行口,一般用作串行口波特率发生器或不需要中断的场合。