《单片机原理及应用》第 4 章 MCS - 51 单片机的中断系统

第 4 章 MCS - 51 单片机的中断系统

4.1 中断系统概述

4.1.1 中断的概念

中断是指计算机在执行程序的过程中,当遇到紧急事件时,暂时停止当前程序的执行,转而去处理该紧急事件,处理完毕后再返回原来被中断的程序继续执行的过程。在单片机系统中,中断可以使单片机及时响应外部或内部的各种事件,提高系统的实时性和效率。例如,在一个实时数据采集系统中,当外部传感器有新的数据到来时,通过中断通知单片机,单片机立即暂停当前正在执行的任务,去采集和处理新的数据,处理完后再回到原来的任务。

4.1.2 MCS - 51 单片机中断系统结构

MCS - 51 单片机的中断系统结构主要包括以下几个部分:

  1. 中断源:是引起中断的事件或信号来源。MCS - 51 单片机有 5 个中断源(8052 有 6 个),分别为外部中断 0(INT0)、外部中断 1(INT1)、定时器/计数器 0 中断(TF0)、定时器/计数器 1 中断(TF1)和串行口中断(TI/RI)。这些中断源可以是外部设备发出的信号,也可以是单片机内部定时器/计数器溢出或串行口数据传输完成等事件。
  2. 中断允许控制寄存器(IE):用于控制各个中断源的允许或禁止。通过设置 IE 寄存器的相应位,可以使能或屏蔽某个中断源。例如,当设置 IE 寄存器的 EA 位为 1 且 EX0 位为 1 时,外部中断 0 被允许;若 EA 位为 0,则所有中断源都被屏蔽。
  3. 中断优先级控制寄存器(IP):用于设置各个中断源的优先级。MCS - 51 单片机的中断系统有两个优先级,即高优先级和低优先级。当多个中断源同时请求中断时,CPU 首先响应优先级高的中断请求。通过设置 IP 寄存器的相应位,可以确定每个中断源的优先级。
  4. 定时器/计数器控制寄存器(TCON):其中部分位用于控制外部中断的触发方式(电平触发或边沿触发)以及定时器/计数器的溢出标志等。例如,TCON 寄存器的 IT0 位用于设置外部中断 0 的触发方式,当 IT0 = 0 时为电平触发,IT0 = 1 时为边沿触发;TF0 位是定时器/计数器 0 的溢出标志,当定时器/计数器 0 溢出时,TF0 自动置 1,向 CPU 发出中断请求。
  5. 串行口控制寄存器(SCON):用于控制串行口的工作方式和状态,其中 TI(发送中断标志)和 RI(接收中断标志)用于串行口中断的控制。当串行口发送完一帧数据时,TI 自动置 1;当串行口接收到一帧数据时,RI 自动置 1,均可向 CPU 发出中断请求。

4.2 中断源和中断控制

4.2.1 中断源

  1. 外部中断 0(INT0):由单片机的 P3.2 引脚输入,用于处理外部设备的紧急事件。例如,当外部设备需要立即与单片机进行数据交互或通知单片机有特殊情况发生时,可以通过该引脚向单片机发出中断请求。
  2. 外部中断 1(INT1):由单片机的 P3.3 引脚输入,功能与外部中断 0 类似,也是用于响应外部设备的中断请求,为系统提供了额外的外部中断处理能力。
  3. 定时器/计数器 0 中断(TF0):当定时器/计数器 0 溢出时,即定时器/计数器 0 从初始值开始计数,计满溢出时,TF0 标志位自动置 1,向 CPU 发出中断请求。常用于定时控制或对外部事件的计数处理,比如实现定时采样数据或对外部脉冲进行计数。
  4. 定时器/计数器 1 中断(TF1):与定时器/计数器 0 中断类似,当定时器/计数器 1 溢出时,TF1 标志位自动置 1,向 CPU 发出中断请求。可用于一些需要独立定时或计数的任务,如在多任务处理中,一个定时器用于定时控制,另一个定时器用于测量外部信号的频率。
  5. 串行口中断(TI/RI):当串行口发送完一帧数据时,发送中断标志 TI 置 1;当串行口接收到一帧数据时,接收中断标志 RI 置 1。串行口中断用于处理单片机与其他设备之间的串行数据传输,如与计算机进行串口通信时,可通过串行口中断及时处理接收到的数据或发送数据。

4.2.2 中断控制方式

  1. 中断允许控制:通过中断允许控制寄存器 IE 来实现。IE 寄存器的各位定义如下:
    • EA(IE.7):总中断允许控制位。EA = 1 时,开放所有中断;EA = 0 时,屏蔽所有中断。
    • ET2(IE.5):定时器/计数器 2 中断允许位(仅 8052 有)。
    • ES(IE.4):串行口中断允许位。ES = 1 时,允许串行口中断;ES = 0 时,禁止串行口中断。
    • ET1(IE.3):定时器/计数器 1 中断允许位。ET1 = 1 时,允许定时器/计数器 1 中断;ET1 = 0 时,禁止定时器/计数器 1 中断。
    • EX1(IE.2):外部中断 1 中断允许位。EX1 = 1 时,允许外部中断 1 中断;EX1 = 0 时,禁止外部中断 1 中断。
    • ET0(IE.1):定时器/计数器 0 中断允许位。ET0 = 1 时,允许定时器/计数器 0 中断;ET0 = 0 时,禁止定时器/计数器 0 中断。
    • EX0(IE.0):外部中断 0 中断允许位。EX0 = 1 时,允许外部中断 0 中断;EX0 = 0 时,禁止外部中断 0 中断。
  2. 中断优先级控制:通过中断优先级控制寄存器 IP 来设置。IP 寄存器的各位定义如下:
    • PT2(IP.5):定时器/计数器 2 中断优先级控制位(仅 8052 有)。
    • PS(IP.4):串行口中断优先级控制位。PS = 1 时,串行口中断为高优先级;PS = 0 时,串行口中断为低优先级。
    • PT1(IP.3):定时器/计数器 1 中断优先级控制位。PT1 = 1 时,定时器/计数器 1 中断为高优先级;PT1 = 0 时,定时器/计数器 1 中断为低优先级。
    • PX1(IP.2):外部中断 1 中断优先级控制位。PX1 = 1 时,外部中断 1 中断为高优先级;PX1 = 0 时,外部中断 1 中断为低优先级。
    • PT0(IP.1):定时器/计数器 0 中断优先级控制位。PT0 = 1 时,定时器/计数器 0 中断为高优先级;PT0 = 0 时,定时器/计数器 0 中断为低优先级。
    • PX0(IP.0):外部中断 0 中断优先级控制位。PX0 = 1 时,外部中断 0 中断为高优先级;PX0 = 0 时,外部中断 0 中断为低优先级。

4.3 中断响应

4.3.1 中断的响应过程

  1. 中断请求检测:CPU 在每个机器周期的 S5P2 期间,对各个中断源的中断请求标志位进行检测。如检测 TCON 寄存器中的 TF0、TF1、IT0、IT1 等标志位,以及 SCON 寄存器中的 TI、RI 标志位。
  2. 中断判优:当多个中断源同时请求中断时,CPU 根据中断优先级控制寄存器 IP 的设置,确定优先响应哪个中断请求。高优先级的中断请求优先得到响应,若多个中断源优先级相同,则按照自然优先级顺序响应,自然优先级顺序为:外部中断 0 > 定时器/计数器 0 中断 > 外部中断 1 > 定时器/计数器 1 中断 > 串行口中断。
  3. 中断响应条件判断:满足以下条件时,CPU 响应中断请求:
    • 有中断请求,即相应的中断请求标志位为 1。
    • 该中断源的中断允许位为 1,即已开放该中断源。
    • CPU 处于开中断状态,即总中断允许控制位 EA = 1。
    • 当前没有执行比该中断请求优先级更高的中断服务程序。
    • 当前指令执行完毕。
  4. 中断响应操作:当满足中断响应条件时,CPU 执行以下操作:
    • 将程序计数器 PC 的当前值(即断点地址)压入堆栈保存,以便中断服务程序执行完毕后能返回原程序继续执行。
    • 根据中断源的类型,将相应的中断矢量地址装入程序计数器 PC,使程序转向该中断源的中断服务程序入口地址执行。例如,外部中断 0 的中断矢量地址为 0003H,当外部中断 0 被响应时,PC 被装入 0003H,程序从 0003H 处开始执行外部中断 0 的中断服务程序。

4.3.2 外部中断的响应时间

外部中断的响应时间与当前正在执行的指令以及中断请求发生的时刻有关。一般来说,在单级中断系统中,外部中断的最短响应时间为 3 个机器周期。这是因为 CPU 检测到中断请求标志后,需要等待当前指令执行完毕(最长为 2 个机器周期),然后再执行一条硬件子程序调用指令(1 个机器周期),将程序转移到中断服务程序入口。而最长响应时间为 8 个机器周期,当 CPU 正在执行一条多机器周期指令(如乘法或除法指令,需 4 个机器周期),且刚执行到该指令的最后一个机器周期时,外部中断请求到来,此时需要等待该指令执行完毕(4 个机器周期),再等待下一条指令执行完毕(最长 2 个机器周期),然后执行硬件子程序调用指令(1 个机器周期),总共需要 4 + 2 + 1 = 7 个机器周期,再加上检测中断请求标志的那个机器周期,所以最长响应时间为 8 个机器周期。

4.3.3 外部中断的方式

  1. 电平触发方式:当 IT0(或 IT1) = 0 时,外部中断 0(或外部中断 1)为电平触发方式。在这种方式下,CPU 在每个机器周期的 S5P2 期间采样 INT0(或 INT1)引脚的电平。若引脚为低电平,则认为有中断请求;若引脚为高电平,则认为无中断请求。电平触发方式的特点是,只要 INT0(或 INT1)引脚保持低电平,中断请求就会一直有效,直到 CPU 响应中断并将该引脚电平变为高电平。
  2. 边沿触发方式:当 IT0(或 IT1) = 1 时,外部中断 0(或外部中断 1)为边沿触发方式。在这种方式下,CPU 在每个机器周期的 S5P2 期间采样 INT0(或 INT1)引脚的电平。若在相邻的两个机器周期内,前一个机器周期采样到引脚为高电平,后一个机器周期采样到引脚为低电平,则认为有中断请求,硬件自动将 TCON 寄存器中的 IE0(或 IE1)标志位置 1。边沿触发方式的特点是,只有在引脚电平发生负跳变时才会产生中断请求,且中断请求标志在 CPU 响应中断后会自动清零。

4.3.4 中断请求的撤销

  1. 定时器/计数器中断请求的撤销:定时器/计数器溢出时,相应的溢出标志位(TF0 或 TF1)置 1,向 CPU 发出中断请求。在 CPU 响应中断后,硬件自动将该标志位清零,即中断请求自动撤销。
  2. 边沿触发方式的外部中断请求的撤销:在边沿触发方式下,当 CPU 响应中断后,硬件自动将 TCON 寄存器中的 IE0(或 IE1)标志位清零,中断请求自动撤销。
  3. 电平触发方式的外部中断请求的撤销:电平触发方式下,中断请求的撤销需要外部电路配合。因为在这种方式下,只要 INT0(或 INT1)引脚保持低电平,中断请求就会一直有效。所以,在 CPU 响应中断后,需要外部电路将 INT0(或 INT1)引脚的电平变为高电平,才能撤销中断请求。
  4. 串行口中断请求的撤销:串行口中断请求标志 TI 和 RI 在 CPU 响应中断后,不会自动清零,需要在中断服务程序中用软件清零。例如,在串行口发送中断服务程序中,需要执行指令 CLR TI 来清除发送中断标志;在串行口接收中断服务程序中,需要执行指令 CLR RI 来清除接收中断标志,从而撤销中断请求。

4.4 中断服务程序的设计

4.4.1 中断服务程序设计的任务

  1. 保护现场:在进入中断服务程序后,由于中断服务程序可能会使用单片机的一些寄存器和存储单元,为了避免这些操作影响原程序的运行,需要将原程序中使用的寄存器和存储单元的内容保存起来,这就是保护现场。通常采用堆栈操作来实现,即将需要保护的寄存器内容依次压入堆栈。
  2. 中断处理:根据中断源的类型,执行相应的中断处理任务。例如,对于外部中断 0,可能是处理外部设备发送过来的数据;对于定时器/计数器中断,可能是进行定时控制或计数处理;对于串行口中断,可能是处理串行数据的发送或接收。
  3. 恢复现场:在中断处理任务完成后,需要将保护现场时保存到堆栈中的寄存器和存储单元的内容恢复,以便原程序能够继续正常执行。通过堆栈操作,将压入堆栈的内容依次弹出到相应的寄存器和存储单元。
  4. 返回原程序:执行 RETI 指令,将堆栈中保存的断点地址弹出到程序计数器 PC,使程序返回原程序继续执行。

4.4.2 主程序结构及流程

主程序在初始化阶段需要完成对中断系统的初始化,包括设置中断允许控制寄存器 IE 和中断优先级控制寄存器 IP,以及对其他相关寄存器和外部设备的初始化。例如,若要使用定时器/计数器 0 中断,需要设置定时器/计数器 0 的工作方式、初始值等。主程序在初始化完成后,通常进入一个无限循环,在循环中执行一些常规任务。当有中断请求发生时,CPU 暂停主程序的执行,转而去执行相应的中断服务程序,执行完毕后返回主程序继续执行。

以下是一个简单的主程序和中断服务程序示例(以定时器/计数器 0 中断为例):

ORG 0000H
AJMP MAIN

ORG 000BH ; 定时器/计数器 0 中断矢量地址
AJMP TIMER0_ISR

MAIN:
    ; 初始化定时器/计数器 0
    MOV TMOD, #01H ; 设置定时器/计数器 0 为工作方式 1
    MOV TH0, #HIGH(65536 - 50000) ; 装入初值高 8 位,定时 50ms
    MOV TL0, #LOW(65536 - 50000) ; 装入初值低 8 位
    SETB TR0 ; 启动定时器/计数器 0
    ; 初始化中断
    SETB ET0 ; 允许定时器/计数器 0 中断
    SETB EA ; 开放总中断
    ; 主循环
    MAIN_LOOP:
        ; 主程序常规任务
        SJMP MAIN_LOOP

TIMER0_ISR:
    ; 保护现场
    PUSH ACC
    PUSH PSW
    ; 中断处理
    MOV TH0, #HIGH(65536 - 50000) ; 重新装入初值高 8 位
    MOV TL0, #LOW(65536 - 50000) ; 重新装入初值低 8 位
    ; 执行其他中断处理任务,例如 LED 闪烁控制
    CPL P1.0 ; 取反 P1.0 引脚电平,实现 LED 闪烁
    ; 恢复现场
    POP PSW
    POP ACC
    RETI ; 返回原程序
END

4.5 外部中断源的扩展

4.5.1 利用定时器/计数器扩展外部中断源

  1. 原理:MCS - 51 单片机的定时器/计数器除了可以进行定时和计数功能外,还可以将其设置为计数器模式,并将外部计数脉冲输入引脚(T0 或 T1)作为外部中断请求输入引脚。当外部计数脉冲输入引脚出现负跳变时,计数器加 1,当计数器溢出时,产生定时器/计数器中断。通过这种方式,可以将定时器/计数器扩展为外部中断源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请向我看齐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值