第六章 中 断 本章学习目标 掌握单片机中断系统 掌握单片机中断处理过程 掌握中断程序设计 理解中断使用过程中需要注意的问题.

Slides:



Advertisements
Similar presentations
单片机技术及应用 河南信息工程学校 电子工程系.
Advertisements

5.1 中断的概述 5.2 MCS - 51中断系统 5.3 中断系统的应用
第5章 中断系统 5.1 中断的概述  5.2 AT89C51中断系统 5.3 中断系统的应用.
主讲人:刘利 交通大学网络控制课程系列 上海交通大学机电控制研究所 交通大学网络控制课程系列 考试课、专业基础课、必修课
第八章 数据通信 本章学习目标 了解通信的有关概念 掌握串行通信和并行通信的原理
第7章 AT89S51单片机的 串行口 1.
6 单片机的中断与定时系统 I/O设备必须通过I/O接口与计算机连接。 I/O接口的功能: 1.速度匹配: 锁存数据、传送联络信号。
项目二 中断应用系统设计 本项目学习目标: (1)制作一个单片机控制的彩灯电路。 (2) 理解中断的基本概念;
实验四 利用中规模芯片设计时序电路(二).
第5章 中断系统 5.1 中断的概念 5.2 MCS-51单片机的中断流程 5.3 MCS-51的中断响应条件和中断处理
KEIL C单片机设计与项目实践 课程主讲: 孙福成 张小义   王晓静 杨至辉 课件制作: 亢娟娜 王 淏.
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
第四章 指令系统及汇编语言程序设计.
8051 指令.
單晶片MCS-51 C語言入門實習 第1章 微電腦與單晶片MCS-51架構 作者:董勝源.
第四章 指令系统及汇编语言程序设计.
单片机原理与应用.
第9章 数模转换器与模数转换器 本章学习目标 了解数模转换器的工作原理及性能指标 掌握模数转换器的应用 掌握数模转换器的应用.
复 习 一. 计算机中的数和编码 1. 2,10,16进制数及其之间的转换(整数) 按权展开,除x取余 2
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
6.3 定时器/计数器的应用 初始化 初始化的内容如下:
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第二部分 微机原理 第8章 单片机的 定时/计数器 主讲教师:喻红.
第6章 MCS - 51单片机内部定时器/ 计数器 及串行接口 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器
單晶片微電腦控制實習 使用計時中斷作走馬燈 計時器的基礎實習 國立大甲高工 電機科 2018年11月21日
第十一章 复位、时钟和省电方式控制.
第五章 单片机的C语言程序设计及仿真调试.
第五章 单片机的C语言程序设计及仿真调试.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月20日.
第2章 单片机的结构原理与 简单应用 (课时:10学时).
本 章 重 点 单片机的简单I/O扩展 8255A可编程并口芯片 8279可编程键盘/显示器接口芯片 单片机键盘接口技术
第七章 定时/计数器.
第八章 数据通信.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
CPU结构和功能.
第10章 综合实训 课题一 水温控制系统设计 一、实训目的 二、课题要求 熟悉常用温度传感器AD590的特性及接口电路的设计方法;
第8章 MCS-51串行口 8.1 串行口及其通信方式 8.2 IBM-PC系列机与 单片机 的通信技术.
6.1 输入/输出 6.2 CPU与外设数据传送方式 6. 3 MCS-51中断系统 6. 4 中断应用举例
第5章 中断系统及其应用 ● 教学目标: 介绍中断、中断源、中断系统的概念 介绍MCS-51中断系统及中断控制
单元五 MCS-51单片机内部资源 5.1 任务九 单片机计数并显示 5.2 任务十 单片机流水灯控制 5.3 任务十一 两台单片机数据互传
本 章 重 点 单片机的结构特点 单片机的存储器特点 I/O端口的特点 CPU时序 课时安排:3个课时.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第四章 指令系统及汇编语言程序设计.
第五章 MCS-51中断与定时系统.
第4章 中断技术 一个完整的微机系统是由硬件和软件共同构成的。微机系统的硬件有CPU、存储器和I/O口,外设组成。CPU与存储器之间的信息交换比较简单,而CPU与外设之间进行信息交换之前必须确定外设是否准备好,即选择I/O传送方式。I/O传送方式有4种:无条件、查询、中断和DMA。本章学习中断传送方式的有关内容。
中 断 王 静 阜阳师范学院 计算机与信息工程学院.
数码管数字时钟电路的设计 1. 系统硬件电路的设计
得技通电子 问题 1.0 、选择题:本大题共15个小题,每小题1分,共15分,在每小题给出的四个选项中,只有一项符合题目要求,把所选项前的字母填在括号内。
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
第五章 MCS-51中断系统 一、中断请求源 MCS-51提供5个中断请求源,即INT0、INT1、TF0、 TF1和串行口发送与接收中断请求源TI或RI。这些 中断请求源分别由TCON与SCON的相应位锁存。
5.2.3 中断请求的响应、撤除及返回 1.中断的响应 从前面介绍的中断允许控制寄存器IE中可看出,一个中断源发出请求后是否被CPU响应,首先必须得到IE寄存器的允许,即开中断。如果不置位IE寄存器中的相应允许控制位,则所有中断请求都不能得到CPU的响应。 在中断请求被允许的情况下,某中断请求被CPU响应还要受下列条件的影响。
第三章 MCS 51的硬件结构.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
5. 1 中 断 概 述 单片机接通电源后将循环执行我们编制好的程序(一般称为主程序),当有外部设备或内部部件要求CPU为其服务时,计算机将被迫“中断”主程序的执行,并记录下暂停处程序地址(断点地址),然后转去为外部设备服务,即执行中断服务程序;在中断程序执行完毕后自动返回被迫中断主程序的地址,继续执行原主程序。
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
单片机原理及应用 实践部分 主讲人:刘 强 四川工商学院单片机教学团队 单片机原理及应用 实践部分 主讲人:刘 强
HSC高速输出例程 HORNER APG.
微算機(二) 's UART mode1 communication
定时中断与LED MCU起航 QQ:
6.1 定时器/计数器的结构及工作原理 定时器/计数器的结构 定时器/计数器T0、T1的逻辑结构如图6-1所示。
单片机原理与应用.
3. 逻辑运算指令 A、简单逻辑操作指令 CLR A. (不影响CY、AC、 OV标志) CPL A
单片机应用技术 (C语言版) 第6章 中断系统.
上节复习(11.14) 1、方式2、方式0的特点? 2、定时/计数器的编程要点? 3、实验5方案优化问题.
单片机应用技术 (C语言版) 第3章 MCS-51指令系统及 汇编程序设计
上节复习(11.7) 1、定时/计数器的基本原理? 2、定时/计数器的结构组成? 3、定时/计数器的控制关系?
第5章 80C51单片机的中断与定时 教学基本要求: (1)、了解单片机系统有关中断的概念; (2)、了解单片机定时器/计数器的功能;
第2章 80C51单片机的硬件结构 教学基本要求: (1)、熟悉单片机的定义、名称、分类方法;
第1章 微型计算机基础.
Presentation transcript:

第六章 中 断 本章学习目标 掌握单片机中断系统 掌握单片机中断处理过程 掌握中断程序设计 理解中断使用过程中需要注意的问题

§6.1中断的概念 中断是计算机中的一个很重要的技术,它既和硬件 有关,也和软件有关。正是因为有了中断技术,才使得 计算机的控制功能更加灵活、效率更高、使得计算机的 发展和应用大大的前进了一步,中断功能的强弱已成为 衡量一台计算机功能完善与否的重要指标。例如,下面 的情况下,就需要采用中断技术。 当计算机正在正常运行一个程序段的时候,如果有一个紧急的事件出现,又必须要立即处理这个紧急的事件; 计算机一边工作一边随时准备处理一个事件,但又不确定该事件出现的确切时刻,像处理防火防盗事件一样。

处理问题的灵活性,主要表现在3个方面: 计算机采用中断技术,大大提高了工作效率和 可及时处理控制系统中许多随机发生的事件; 较好的解决了快速CPU和慢速外设之间的矛盾,可使CPU和外设并行工作; 具备了处理故障的能力,提高了系统自身的可靠性。

处理程序的入口地址是单片机硬件确定的,用户不能改变 中断类似于主程序调用子程序,但它们又有区别,各自的主要特点如表所示。 表6-1 中断和调用子程序之间的主要区别 中 断 调用子程序 产生时刻是随机的 程序中事先安排好的 既保护断点(自动),又保护现场(程序) 可只保护断点(自动) 处理程序的入口地址是单片机硬件确定的,用户不能改变 子程序的入口地址是程序编排的

§6.2单片机的中断系统及其管理 一、中断源及其优先级管理 1、中断源 中断源是指能发出中断请求,引起中断的装置或事件。 STC15F2K60S2单片机提供14个中断请求源: 5个外部中断请求 3个片内定时/计数器溢出中断请求 2个片内异步串行口(UART)中断请求 1个ADC中断 1个SPI中断 1个低电压检测中断 1个PCA中断。

图6-1 STC15F2K60S2单片机的中断系统

(1)定时/计数器T0和T1的控制寄存器TCON TCON(地址为88H,复位值为00H)的各位定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

1)IT0:外部中断触发方式控制位。可由软件置1或清“0”。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 1)IT0:外部中断触发方式控制位。可由软件置1或清“0”。 0:电平触发方式。当输入低电平时,置位IE0。 1:边沿触发方式。输入脚上电平由高到低的负跳变时,置位IE0。 2)IT1:外部中断触发方式控制位,与IT0类似。

4)IE1:外部中断1请求标志,其意义和IE0相同。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 3)IE0:外部中断0请求标志。 当IT0=0即电平触发方式时,在每个指令周期的最后一个时钟周期采样IT0,若为低电平,由硬件置位IE0 。 当IT0=1即边沿触发方式时,当某个指令周期的最后一个时钟周期采样到为高电平,下一个指令周期的最后一个时钟周期采样到为低电平时,由硬件置位IE0。 IE0=1表示向CPU请求中断。当CPU响应中断转向中断服务程序时,由硬件自动清0中断标志。 4)IE1:外部中断1请求标志,其意义和IE0相同。

4)TR0:定时/计数器T0启动/停止控制位。 5)TR1:定时/计数器T1启动/停止控制位,详细介绍,请参考“定时器”一章。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 4)TR0:定时/计数器T0启动/停止控制位。 5)TR1:定时/计数器T1启动/停止控制位,详细介绍,请参考“定时器”一章。

7)TF1:定时/计数器T1的中断标志,功能和TF0类似。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 6)TF0:定时/计数器T0溢出中断标志。 T0启动计数后,从初值开始加1计数。当计数器产生进位时,由硬件置TF0为1,向CPU申请中断,若CPU响应中断,在进入中断服务后,CPU自动将TF0清0。TF0也可用软件清0(查询方式)。 7)TF1:定时/计数器T1的中断标志,功能和TF0类似。

TI或RI只要有一个为1,表示串行口申请中断 (2)串行口1控制寄存器SCON 用于对串行口1的工作方式进行控制,其最低两位锁存串行口1发送中断标志TI和接收中断标志RI。 SCON(地址为98H,复位值为00H)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SM0/FE SM1 SM2 REN TB8 RB8 TI RI TI或RI只要有一个为1,表示串行口申请中断

1)RI:串行口1接收中断标志。 RI=1表示串行口1接收器已经接收到数据,所以向CPU申请中断,以便将接收到的数据存到预先安排好的数据区。RI必须由用户在中断处理程序中用指令清0。 2)TI:串行口1发送中断标志。 TI=1表示串行口发送器已经发送完上一个数据,所以向CPU申请中断,以便发送下一个数据。TI必须由用户在中断处理程序中用指令清0。

(3)串口2控制寄存器S2CON 寄存器S2CON(地址为9AH,复位值为00H)用于确定串口2的操作方式和控制串口2的某些功能,并设有接收和发送中断标志(S2RI及S2TI)位。 S2CON各位的定义如下: 位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 位名称 S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI

S2TI和S2RI是串口2的发送中断标志和接收中断标志,与寄存器SCON对应位的含义和功能类似,在此,不做详细描述。 位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 位名称 S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI S2TI和S2RI是串口2的发送中断标志和接收中断标志,与寄存器SCON对应位的含义和功能类似,在此,不做详细描述。

电源控制寄存器PCON(地址为87H,复位值为30H) 寄存器的各位定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 与中断有关的位是LVDF。 LVDF是低电压检测标志位,同时也是低电压检测中断请求标志位。

(5)PCA控制寄存器CCON CCON(地址为D8H,复位值为00xx x000B 1)CF:PCA计数器溢出标志位。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 CF CR - CCF2 CCF1 CCF0 1)CF:PCA计数器溢出标志位。 当PCA计数器溢出时,CF由硬件置位。如CMOD寄存器的ECF位置位,CF标志可用来产生中断。CF位可通过硬件或软件置位,但只能通过软件清0。 2)CCF2/CCF1/CCF0:PCA各个模块的标志。

SPSTAT(地址为CDH,复位值为00xx xxxxB) 各位的定义如下: (6)SPI状态寄存器SPSTAT SPSTAT(地址为CDH,复位值为00xx xxxxB) 各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SPIF WCOL -

当一次传输完成时,SPIF被置位。此时,如果SPI中断被打开(ESPI=1,EA=1),将产生中断。SPIF标志通过软件向其写入1而清0。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SPIF WCOL - SPIF是SPI传输完成标志。 当一次传输完成时,SPIF被置位。此时,如果SPI中断被打开(ESPI=1,EA=1),将产生中断。SPIF标志通过软件向其写入1而清0。 WCOL位的作用以及SPI模块在 “数据通信”一章中介绍。

ADC_CONTR(地址为C5H,复位值为0XX00000B)各位的定义如下: (7)ADC控制寄存器ADC_CONTR ADC_CONTR(地址为C5H,复位值为0XX00000B)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 位ADC_FLAG是A/D转换结束标志。 A/D转换完成后,ADC_FLAG=1。此时,若允许A/D转换中断(EADC=1,EA=1),则由该位申请产生中断。也可由软件查询该标志位判断A/D转换是否结束, ADC_FLAG一定要软件清“0”

单片机对中断源的允许和禁止由两级控制组成,即总控制和对每个中断源的分别控制。 2、中断的允许、禁止及优先级 (1)中断的允许和禁止 STC15F2K60S2单片机中没有专门的开中断和关中断指令,中断的允许和禁止是通过设置IE、IE2和外部中断允许和时钟输出寄存器INT_CLKO的相应位实现的。 单片机对中断源的允许和禁止由两级控制组成,即总控制和对每个中断源的分别控制。

中断允许寄存器IE(地址为A8H,复位值为00H) 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0 1)EA:中断允许总控制位。 0:禁止中断系统,所有中断源的中断请求均被禁止,称为关中断。 1:允许中断系统,所有中断源的中断请求均可以被允许,称为开中断;某一个中断源的请求是否允许,还要由该中断源所对应的中断允许控制位决定。

2)ELVD:低电压检测中断允许控制位。 1:允许低电压检测中断; 0:禁止低电压检测中断。 3)EADC:ADC中断允许控制位。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0 2)ELVD:低电压检测中断允许控制位。 1:允许低电压检测中断; 0:禁止低电压检测中断。 3)EADC:ADC中断允许控制位。 1:允许ADC中断; 0:禁止ADC中断。

4)ES:串行口1中断允许控制位。 1:允许串行口1中断; 0:禁止串行口1中断。 5)ET1:定时器1中断允许控制位。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0 4)ES:串行口1中断允许控制位。 1:允许串行口1中断; 0:禁止串行口1中断。 5)ET1:定时器1中断允许控制位。 1:允许定时器1中断; 0:禁止定时器1中断。

6)EXl:外部中断中断允许控制位。 1:允许外部中断1中断; 0:禁止外部中断1中断。 7)ET0:定时器0中断允许控制位。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0 6)EXl:外部中断中断允许控制位。 1:允许外部中断1中断; 0:禁止外部中断1中断。 7)ET0:定时器0中断允许控制位。 1:允许定时器0中断; 0:禁止定时器0中断。 8)EX0:外部中断源中断允许控制位。 1:允许外部中断0中断; 0:禁止外部中断0中断。

(地址为AFH,复位值为XXXXXX00B) 2)中断允许寄存器IE2 (地址为AFH,复位值为XXXXXX00B) 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ET2 ESPI ES2 ① ET2:定时器2的中断允许位。 1:允许定时器2产生中断; 0:禁止定时器2产生中断。 ② ESPI:SPI中断允许控制位。 1:允许SPI中断;0:禁止SPI中断。 ③ ES2:串行口2中断允许控制位。 1:允许串行口2中断; 0:禁止串行口2中断。

3)外部中断使能和时钟输出寄存器INT_CLKO 外部中断使能和时钟输出寄存器INT_CLKO(地址为8FH,复位值为X0000000B,不能进行位寻址)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 - EX4 EX3 EX2 LVD_WAKE T2CLKO T1CLKO T0CLKO

①EX4:外部中断4中断允许位。 1:允许外部中断4中断; 0:禁止外部中断4中断。外部中断4下降沿触发。 ②EX3:外部中断3中断允许位。 1:允许外部中断3中断; 0:禁止外部中断3中断。外部中断3下降沿触发。 ③EX2:外部中断2中断允许位。 1:允许外部中断2中断; 0:禁止外部中断2中断。外部中断2下降沿触发。

ECCFn:使能CCFn中断。寄存器CCON的比较/捕获标志CCFn用来产生中断。 4)PCA比较/捕获寄存器CCAPMn(n=0,1,2,下同。地址分别对应DAH, DBH和DCH,复位值均为X0000000B),各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn ECCFn:使能CCFn中断。寄存器CCON的比较/捕获标志CCFn用来产生中断。

ECF:PCA计数器溢出中断使能位。ECF=1时,允许寄存器CCON中CF位的中断。ECF=0时,禁止寄存器CCON中CF位的中断。 5)PCA工作模式寄存器(CMOD) CMOD(地址为D9H,复位值为0XXX0000B)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 CIDL - CPS2 CPS1 CPS0 ECF ECF:PCA计数器溢出中断使能位。ECF=1时,允许寄存器CCON中CF位的中断。ECF=0时,禁止寄存器CCON中CF位的中断。

STC15F2K60S2单片机复位后,各中断允许寄存器控制位均被清“0”,即禁止所有中断。如果需要允许某些中断,可在程序中将相应中断控制位置为1。 用户可通过对IE、IE2和INT_CLKO中相应的位进行置1或清0的操作来允许或禁止各中断源的中断申请。禁止某个中断源申请中断,也称为屏蔽某个中断源。欲使某中断源允许中断,必须同时使EA=1,即同时使CPU允许中断。所以EA相当于中断允许的“总开关”。

(2)中断的优先级 外部中断2、外部中断3、定时器T2和外部中断4,不能设置为高优先级,其他中断源通过特殊功能寄存器(IP和IP2)中的相应位,可设为高、低二级优先级,实现二级中断嵌套,与传统8051单片机两级中断优先级完全兼容。

STC15F2K60S2单片机对中断优先级的处理原则 低优先级中断可被高优先级中断所中断,反之不能。 任何一种中断(不管是高优先级还是低优先级),一旦得到响应,不会再被它的同级中断所中断。

同一优先级的中断源同时申请中断时,按照事先约定的硬件查询顺序响应中断。这相当于在每个优先级内,还同时存在另一个辅助优先级结构(称为默认的优先级) STC15F2K60S2单片机各中断默认的优先级如表6-2所示。其中,默认中断优先级次序号越小,优先级越高。

每一位对应其相应的中断源的优先级控制位。 1:高优先级;0:低优先级。 1)中断优先级寄存器IP 中断优先级寄存器IP(地址为B8H,复位值为00H)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 每一位对应其相应的中断源的优先级控制位。 1:高优先级;0:低优先级。

第二中断优先级低字节寄存器IP2(地址为B5H,复位值为XXXXXX00B): 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 PSPI PS2 1)PSPI:SPI中断优先级控制位。 1:SPI中断为高优先级; 0:SPI中断为低优先级。 2)PS2:串口2中断优先级控制位。 1:串口2中断为高优先级; 0:串口2中断为低优先级。

IP、IP2一起确定STC15F2K60S2单片机的二个中断优先级 。

例如, 如果要允许外部中断0中断,需要将EX0和EA 都置1。 如果要允许A/D转换中断,则需要将EADC和 EA都置1。

二、单片机中断处理过程 1、单片机响应中断的条件和过程 当中断源向CPU发出中断请求时,如果中断 的条件满足,CPU将进入中断响应周期。单片 机响应中断的条件是: 中断源有请求。 相应的中断允许位设置为1。 无同级或高级中断正在处理; CPU中断开放(EA=1)。

在每个指令周期的最后一个时钟周期,CPU对各中断源采样,并设置相应的中断标志位。CPU在下一个指令周期的最后一个时钟周期按优先级顺序查询各中断标志,如查到某个中断标志为1,将在下一个指令周期按优先级的高低顺序响应中断并进行处理。

CPU响应中断时,将执行如下操作: 当前正被执行的指令执行完毕; PC值被压入堆栈; 现场保护; 阻止同级别其他中断; 执行相应的中断服务程序。

每个中断服务程序的入口地址之间只相隔8个单元,一般中断服务程序的长度都超过8个字节,这时可以将中断服务程序存放到存储器的其他区域,然后在中断入口处安排一条转移指令LJMP,转向中断服务程序。例如: ORG 0003H ;外部中断0入口地址 LJMP X0_ISR ··· ;其他程序代码 X0_ISR: ;外部中断0服务程序 ··· RETI

使用C语言编写单片机中断应用程序时,用中断号 区分每一个中断。例如, void X0_ISR(void) interrupt 0{} //外部中断0中断函数 void T0_ISR (void) interrupt 1{} //定时器T0 中断函数 void X1_ISR(void) interrupt 2{} //外部中断1中断函数 void T1_ISR (void) interrupt 3{} //定时器T1中断函数 void UART1_ISR (void) interrupt 4{} //串行口1中断函数 void ADC_ISR (void) interrupt 5{} //ADC中断函数 void LVD_ISR (void) interrupt 6{} //低电压检测LVD中断函数

void PCA_ISR (void) interrupt 7{} //PCA中断函数 void UART2_ISR (void) interrupt 8{} //串行口2中断函数 void SPI_ISR (void) interrupt 9{} //SPI通信中断函数 void X2_ISR(void) interrupt 10{} //外部中断2中断函数 void X3_ISR(void) interrupt 11{} //外部中断3中断函数 void T2_ISR (void) interrupt 12{} //定时器T2中断函数 void X4_ISR(void) interrupt 16{} //外部中断4中断函数

在程序的运行过程中,并不是任何时刻都可以响应中断请求。出现下列情况时,CPU不会响应中断请求: 中断允许总控制位EA=0或发出中断请求的中断源所对应的中断允许控制位为0。 CPU正在执行一个同级或高级的中断服务程序。 当前执行指令的时刻不是指令周期的最后一个时钟周期。 正在执行的指令是中断返回指令RETI或者是访问IE或IP的指令时,CPU至少要再执行一条指令才能响应中断请求。

2、中断服务 中断服务程序从入口地址开始执行,直到执行返回指令RETI为止。RETI指令表示中断服务程序的结束。 中断服务程序由四个部分组成,即保护现场、中断服务、恢复现场以及中断返回。 由于在主程序中一般都会用到累加器A和程序状态字寄存器PSW,所以在现场保护时一般都需要保护A和PSW,其他寄存器根据使用情况决定是否需要保护。在C语言程序中不需要进行现场保护。

在编写中断服务程序时应注意以下两点: 单片机响应中断后,不会自动关闭中断系统。如果用户程序不希望出现中断嵌套,则必须在中断服务程序的开始处关闭中断,禁止更高优先级的中断请求中断当前的服务程序。 为了保证保护现场和恢复现场能够连续进行,可在保护现场和恢复现场之前先关中断,当现场保护或现场恢复结束后,再根据实际需要决定是否需要开中断。

三、中断请求的撤除 中断源向CPU发出中断请求后,中断请求信号分别锁 存在特殊功能寄存器中。 循环的现象;而撤除过早,有可能中断尚未响应,造成 请求信号的丢失。所以,及时撤除中断请求是很重要的。

1、定时器/计数器T0、T1中断请求的撤除 2、外部中断请求的撤除 当CPU响应T0或T1的中断请求后,由硬件自动清除相应的中断请求标志TF0或TF1。所以在处理定时器/计数器的中断时,无需关心清除中断请求标志的问题。 2、外部中断请求的撤除 CPU响应外部中断0和外部中断1后,由硬件自动清除中断请求标志IE0和IE1。 外部中断2、3和4的中断请求标志对用户不可见,CPU响应外部中断2~4后,由硬件自动清除中断请求标志,无需用户清0。

CPU响应串行口中断后,不能由硬件自动清除 3、串行口中断请求的撤除 CPU响应串行口中断后,不能由硬件自动清除 串行口中断标志(UART1为TI和RI,UART2为 S2TI和S2RI)。由于串行口的发送中断和接收 中断使用相同的入口地址,所以,CPU响应串 行中断后,首先应检测这两个中断标志位,以判 断是发送中断还是接收中断。当检测结束后,应 通过软件将串行口中断标志清0。

4、ADC中断请求的撤除 ADC中断请求标志位ADC_FLAG不能自动清 除,需要在ADC中断服务程序中用软件将其清 0。 5、SPI中断请求的撤除 SPI中断请求标志位SPIF不能自动清除,需要 在SPI中断服务程序中用软件清0。

6、PCA中断请求的撤除 PCA中断请求标志位CF/CCF0/CCF1不能自动 清除,需要在PCA中断服务程序中用软件将相 应的标志位清0。 7、低电压检测中断请求的撤除 低电压检测中断请求标志位LVDF不能自动清 除,需要在低电压检测中断服务程序中用软件清 0。

四、中断程序编程举例 【例6-1】利用INT0引入单脉冲,每来一个负脉冲, 将连接到P1口的发光二极管循环点亮。 解:利用的下降沿触发中断。

汇编语言程序如下: ORG 0000H LJMP MAIN ORG 0013H LJMP INT_X1 ORG 0100H MAIN: MOV SP,#60H MOV A,#01H MOV P1,#00H SETB IT1 ;设置下降沿触发中断 SETB EX1 ;开放外部中断1 SETB EA ;开放总中断 SJMP $ ;等待,本条指令相当于“HERE: LJMP HERE” INT_X1: MOV P1,A RL A RETI END

对应的C语言版本如下: #include "stc15.h" //包含寄存器定义头文件 unsigned char i=0x01; void main(void) { P1=0; IT0=1; EX0=1; EA=1; while(1); //循环等待 } void X0_ISR(void) interrupt 0 i<<=1; if (i==0) i=1; //移位8次后,i将变为0,因此需要重新赋值 P1=i;

【例6-2】利用上升沿和下降沿均可触发中断的外部中断,可以检测脉冲跳变的次数,也可以检测按键的按下与弹起操作。 下面的例子可以统计从INT1引脚输入脉冲的跳变次数。

汇编语言程序如下: ;主程序: ORG 0000H ;主程序入口 LJMP MAIN ORG 0013H ;外部中断1入口 LJMP INT_X1 ORG 0100H ;主程序 MAIN: MOV SP,#7FH CLR A ;假设脉冲的跳变次数保存在累加器ACC中 CLR IT1 ;设外部中断1为上升沿和下降沿均可触发的方式 SETB EX1 ;外部中断1开中断 SETB EA ;CPU开中断 SJMP $ ;原地踏步,等待中断发生 ;外部中断1处理子程序: INT_X1: INC A ;统计脉冲跳变次数 ;可以在这个地方读入INT1/P3.3引脚的电平, ;从而判断本次中断是上升沿中断还是下降沿中 RETI ;返回 END

对应的C语言程序如下: #include “stc15.h” //包含寄存器定义头文件 unsigned char p_cnt=0; //统计脉冲跳变次数变量 void main (void) { IT1=0; //外部中断1为上升沿和下降沿均可触发的方式 EX1=1; //允许外部中断1 EA =1; //允许总的中断 while(1); //等待中断 } void X1_ISR (void) interrupt 2 //外部中断1函数 p_cnt++; //统计脉冲跳变次数

【例6-3】外部中断2的使用。 外部中断2~4的使用方法与外部中断0和1的使用方法类似,区别在于外部中断2~4只能是下降沿触发,并且,要注意开放中断的方法。

$INCLUDE (STC15.INC) ;包含STC15F2K60S2寄存器定义文件 ;主程序: ORG 0000H ;主程序入口 LJMP MAIN ORG 0053H ;外部中断2入口 LJMP INT_X2 ORG 0100H ;主程序 MAIN: MOV SP,#7FH ORL INT_CLKO, #10H ;开放外部中断2 SETB EA ;CPU开中断 SJMP $ ;原地踏步,等待中断发生 ;外部中断2处理子程序: INT_X2: ;在这里编写中断处理程序 RETI ;返回 END

对应的C语言程序如下: #include “stc15.h” //包含寄存器定义头文件 void main (void) { INT_CLKO |= 0x10; //允许外部中断2 EA =1; //允许总的中断 while(1); //等待中断 } void X2_ISR (void) interrupt 10 //外部中断2函数 //在这里编写中断处理程序

【例6-4】外部中断源扩展。 当外部中断源多于两个时,可采用硬件申请与软 件查询结合的方法,把多个中断源通过硬件“线或” 或经或非门引入外中断源输入端(或),同时又连 到某I/O口。这样,每个源都可能引起中断,在中断 服务程序中通过软件查询便可确定哪一个是正在申 请的中断源,其查询的次序则由中断源优先级决 定,这就可实现多个外部中断源的扩展。

如图所示的中断线路可实现系统的故障显示,当系统的各部分工作正常时,4个故障源输入端全为低电平,指示灯全熄灭。若当某部分出现故障,则对应的输入线由低电平变为高电平,从而引起单片机中断,试设计判定故障源的程序,并进行相应的灯光显示。 图6-3 利用中断线路显示系统故障

解:通过或非门,将上升沿转换为下降沿,利用下降沿中断方式实现。 ORG 0000H LJMP MAIN ;转主程序 ORG 0003H LJMP INT_X0 ;转中断服务程序 ORG 0100H MAIN: MOV SP,#7FH MOV P2,#0FFH ;指示灯全熄灭 SETB IT0 ; 为边沿触发中断方式 SETB EX0 ;允许中断 SETB EA ;CPU开中断 SJMP $ ;等待中断 INT_X0: MOV A,P1 ;对应关系:LED0--P2.0--P1.0,其他类推 CPL A ANL A,#0FH MOV P2,A RETI END

对应的C语言版程序: #include “stc15.h” //包含寄存器定义头文件 void main (void) { unsigned char i; P2=0x0f; //熄灭所有的指示灯 IT0=1; //外部中断0为下降沿触发方式 EX0=1; //允许外部中断0 EA =1; //允许总的中断 while(1); //等待中断 } void X0_ISR (void) interrupt 0 //外部中断函数 P2=~P1;

五、中断使用过程中需要注意的问题 在嵌入式系统中,中断是一种很有效的事件 处理方式。但是,如果使用中断不当,往往会出 现一些意想不到的结果。为了获得正确的结果可 能要花费大量的调试时间,而且中断复位子程序 的错误是比较难于被发现和纠正的。为了避免发 生类似的问题,下面介绍中断使用过程中需要注 意的问题。

1、寄存器保护 由于中断请求的发生时刻是随机的,所以在主程序的 执行过程中,在任何地方都有可能发生中断请求并进入 中断处理程序,因此,必须保证在任何时候都要做好中 断现场的保护工作。例如,主程序是: CLR C MOV A,#25H ADDC A,#10H …… 中断处理程序是: MOV A,#0FFH ADD A,#41H RETI

例如,在中断处理程序中应当修改为类似于下面的代码: PUSH ACC ;保护现场 PUSH PSW MOV A,#0FFH ADD A,#41H MOV 30H,A ;将运算结果保存在30H中 POP PSW ;恢复现场 POP ACC RETI

结论 通常情况下,在中断处理子程序中,需要保护那 些在主程序中用到、而其中的数值在从中断返回后 还需要继续使用的、因而不应被中断处理子程序修 改内容的寄存器。例如,如果在主程序中用到 DPTR,并且不想被别的子程序修改内容,在中断 处理程序中也用到DPTR,此时,就应该在中断处 理子程序中使用PUSH和POP指令对DPTR加以保 护和恢复。

如果用C语言编写中断处理程序,通常开发环境本身会自动进行寄存器保护,因此用户不必再编写现场保护代码。 PUSH DPH PUSH DPL ;其他代码 POP DPL POP DPH RETI 如果用C语言编写中断处理程序,通常开发环境本身会自动进行寄存器保护,因此用户不必再编写现场保护代码。

2、使用中断常出现的问题 如果使用了中断之后,整个程序出现不能正 确的执行或不能达到预期的目标的现象,应该检 查与中断有关的内容,主要是在以下几个方面。

1)寄存器保护 保证所有前面提及的寄存器被保护。如果忘 记保护主程序使用的寄存器,可能会产生错误结 果。如果寄存器未按预期的愿望改变其中的值或 者出现错误的值,这很可能是因为寄存器没有被 保护。

2)忘记恢复被保护的值 中断返回前忘记将保护数据从堆栈中弹出。 例如将ACC、B、和PSW压入堆栈进行保护, 用RETI指令的时候,单片机将使用B中的值作为 返回地址,将产生不可预料的混乱结果。

3)中断返回使用了RET而不是RETI指令。 程序的混乱。若发现中断仅仅执行了一次,而无 法进行第二次的中断处理,那么应该检查子程序 是否正确使用了RETI指令。

4)中断程序尽量短小 中断处理子程序应该尽量短小,这样其执行 速度更快。例如,接收串行中断的处理程序应该 从SBUF中读一个字节,并且将其复制到用户定 义的临时缓冲区中,然后退出中断程序,缓冲区 中的数据的进一步处理应由主程序来处理。中断 的时间消耗越少,那么在中断发生时就可以更快 的响应和处理其他的中断。

5)注意中断标志的清除问题 某些中断的中断标志不是在响应相应中断时 由硬件自动清除的,用户需要在中断处理程序返 回前,使用指令将中断标志位清“0”,否则,中 断返回后,还将产生一次新的中断。例如串行通 信中断、ADC中断、SPI中断、低电压检测中断 以及PCA中断。