Download presentation
Presentation is loading. Please wait.
1
第六章 中 断 本章学习目标 掌握单片机中断系统 掌握单片机中断处理过程 掌握中断程序设计 理解中断使用过程中需要注意的问题
2
§6.1中断的概念 中断是计算机中的一个很重要的技术,它既和硬件 有关,也和软件有关。正是因为有了中断技术,才使得
计算机的控制功能更加灵活、效率更高、使得计算机的 发展和应用大大的前进了一步,中断功能的强弱已成为 衡量一台计算机功能完善与否的重要指标。例如,下面 的情况下,就需要采用中断技术。 当计算机正在正常运行一个程序段的时候,如果有一个紧急的事件出现,又必须要立即处理这个紧急的事件; 计算机一边工作一边随时准备处理一个事件,但又不确定该事件出现的确切时刻,像处理防火防盗事件一样。
3
处理问题的灵活性,主要表现在3个方面: 计算机采用中断技术,大大提高了工作效率和 可及时处理控制系统中许多随机发生的事件;
较好的解决了快速CPU和慢速外设之间的矛盾,可使CPU和外设并行工作; 具备了处理故障的能力,提高了系统自身的可靠性。
4
处理程序的入口地址是单片机硬件确定的,用户不能改变
中断类似于主程序调用子程序,但它们又有区别,各自的主要特点如表所示。 表6-1 中断和调用子程序之间的主要区别 中 断 调用子程序 产生时刻是随机的 程序中事先安排好的 既保护断点(自动),又保护现场(程序) 可只保护断点(自动) 处理程序的入口地址是单片机硬件确定的,用户不能改变 子程序的入口地址是程序编排的
5
§6.2单片机的中断系统及其管理 一、中断源及其优先级管理 1、中断源 中断源是指能发出中断请求,引起中断的装置或事件。
STC15F2K60S2单片机提供14个中断请求源: 5个外部中断请求 3个片内定时/计数器溢出中断请求 2个片内异步串行口(UART)中断请求 1个ADC中断 1个SPI中断 1个低电压检测中断 1个PCA中断。
6
图6-1 STC15F2K60S2单片机的中断系统
7
(1)定时/计数器T0和T1的控制寄存器TCON
TCON(地址为88H,复位值为00H)的各位定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
8
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类似。
9
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相同。
10
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启动/停止控制位,详细介绍,请参考“定时器”一章。
11
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类似。
12
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,表示串行口申请中断
13
1)RI:串行口1接收中断标志。 RI=1表示串行口1接收器已经接收到数据,所以向CPU申请中断,以便将接收到的数据存到预先安排好的数据区。RI必须由用户在中断处理程序中用指令清0。 2)TI:串行口1发送中断标志。 TI=1表示串行口发送器已经发送完上一个数据,所以向CPU申请中断,以便发送下一个数据。TI必须由用户在中断处理程序中用指令清0。
14
(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
15
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对应位的含义和功能类似,在此,不做详细描述。
16
电源控制寄存器PCON(地址为87H,复位值为30H) 寄存器的各位定义如下:
位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 与中断有关的位是LVDF。 LVDF是低电压检测标志位,同时也是低电压检测中断请求标志位。
17
(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各个模块的标志。
18
SPSTAT(地址为CDH,复位值为00xx xxxxB) 各位的定义如下:
(6)SPI状态寄存器SPSTAT SPSTAT(地址为CDH,复位值为00xx xxxxB) 各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SPIF WCOL -
19
当一次传输完成时,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模块在 “数据通信”一章中介绍。
20
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”
21
单片机对中断源的允许和禁止由两级控制组成,即总控制和对每个中断源的分别控制。
2、中断的允许、禁止及优先级 (1)中断的允许和禁止 STC15F2K60S2单片机中没有专门的开中断和关中断指令,中断的允许和禁止是通过设置IE、IE2和外部中断允许和时钟输出寄存器INT_CLKO的相应位实现的。 单片机对中断源的允许和禁止由两级控制组成,即总控制和对每个中断源的分别控制。
22
中断允许寄存器IE(地址为A8H,复位值为00H)
位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0 1)EA:中断允许总控制位。 0:禁止中断系统,所有中断源的中断请求均被禁止,称为关中断。 1:允许中断系统,所有中断源的中断请求均可以被允许,称为开中断;某一个中断源的请求是否允许,还要由该中断源所对应的中断允许控制位决定。
23
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中断。
24
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中断。
25
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中断。
26
(地址为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中断。
27
3)外部中断使能和时钟输出寄存器INT_CLKO
外部中断使能和时钟输出寄存器INT_CLKO(地址为8FH,复位值为X B,不能进行位寻址)各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 - EX4 EX3 EX2 LVD_WAKE T2CLKO T1CLKO T0CLKO
28
①EX4:外部中断4中断允许位。 1:允许外部中断4中断; 0:禁止外部中断4中断。外部中断4下降沿触发。 ②EX3:外部中断3中断允许位。 1:允许外部中断3中断; 0:禁止外部中断3中断。外部中断3下降沿触发。 ③EX2:外部中断2中断允许位。 1:允许外部中断2中断; 0:禁止外部中断2中断。外部中断2下降沿触发。
29
ECCFn:使能CCFn中断。寄存器CCON的比较/捕获标志CCFn用来产生中断。
4)PCA比较/捕获寄存器CCAPMn(n=0,1,2,下同。地址分别对应DAH, DBH和DCH,复位值均为X B),各位的定义如下: 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn ECCFn:使能CCFn中断。寄存器CCON的比较/捕获标志CCFn用来产生中断。
30
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位的中断。
31
STC15F2K60S2单片机复位后,各中断允许寄存器控制位均被清“0”,即禁止所有中断。如果需要允许某些中断,可在程序中将相应中断控制位置为1。
用户可通过对IE、IE2和INT_CLKO中相应的位进行置1或清0的操作来允许或禁止各中断源的中断申请。禁止某个中断源申请中断,也称为屏蔽某个中断源。欲使某中断源允许中断,必须同时使EA=1,即同时使CPU允许中断。所以EA相当于中断允许的“总开关”。
32
(2)中断的优先级 外部中断2、外部中断3、定时器T2和外部中断4,不能设置为高优先级,其他中断源通过特殊功能寄存器(IP和IP2)中的相应位,可设为高、低二级优先级,实现二级中断嵌套,与传统8051单片机两级中断优先级完全兼容。
33
STC15F2K60S2单片机对中断优先级的处理原则
低优先级中断可被高优先级中断所中断,反之不能。 任何一种中断(不管是高优先级还是低优先级),一旦得到响应,不会再被它的同级中断所中断。
34
同一优先级的中断源同时申请中断时,按照事先约定的硬件查询顺序响应中断。这相当于在每个优先级内,还同时存在另一个辅助优先级结构(称为默认的优先级)
STC15F2K60S2单片机各中断默认的优先级如表6-2所示。其中,默认中断优先级次序号越小,优先级越高。
35
每一位对应其相应的中断源的优先级控制位。 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:低优先级。
36
第二中断优先级低字节寄存器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中断为低优先级。
37
IP、IP2一起确定STC15F2K60S2单片机的二个中断优先级 。
38
例如, 如果要允许外部中断0中断,需要将EX0和EA 都置1。 如果要允许A/D转换中断,则需要将EADC和 EA都置1。
39
二、单片机中断处理过程 1、单片机响应中断的条件和过程 当中断源向CPU发出中断请求时,如果中断 的条件满足,CPU将进入中断响应周期。单片 机响应中断的条件是: 中断源有请求。 相应的中断允许位设置为1。 无同级或高级中断正在处理; CPU中断开放(EA=1)。
40
在每个指令周期的最后一个时钟周期,CPU对各中断源采样,并设置相应的中断标志位。CPU在下一个指令周期的最后一个时钟周期按优先级顺序查询各中断标志,如查到某个中断标志为1,将在下一个指令周期按优先级的高低顺序响应中断并进行处理。
41
CPU响应中断时,将执行如下操作: 当前正被执行的指令执行完毕; PC值被压入堆栈; 现场保护; 阻止同级别其他中断;
执行相应的中断服务程序。
42
每个中断服务程序的入口地址之间只相隔8个单元,一般中断服务程序的长度都超过8个字节,这时可以将中断服务程序存放到存储器的其他区域,然后在中断入口处安排一条转移指令LJMP,转向中断服务程序。例如:
ORG 0003H ;外部中断0入口地址 LJMP X0_ISR ··· ;其他程序代码 X0_ISR: ;外部中断0服务程序 ··· RETI
43
使用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中断函数
44
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中断函数
45
在程序的运行过程中,并不是任何时刻都可以响应中断请求。出现下列情况时,CPU不会响应中断请求:
中断允许总控制位EA=0或发出中断请求的中断源所对应的中断允许控制位为0。 CPU正在执行一个同级或高级的中断服务程序。 当前执行指令的时刻不是指令周期的最后一个时钟周期。 正在执行的指令是中断返回指令RETI或者是访问IE或IP的指令时,CPU至少要再执行一条指令才能响应中断请求。
46
2、中断服务 中断服务程序从入口地址开始执行,直到执行返回指令RETI为止。RETI指令表示中断服务程序的结束。
中断服务程序由四个部分组成,即保护现场、中断服务、恢复现场以及中断返回。 由于在主程序中一般都会用到累加器A和程序状态字寄存器PSW,所以在现场保护时一般都需要保护A和PSW,其他寄存器根据使用情况决定是否需要保护。在C语言程序中不需要进行现场保护。
47
在编写中断服务程序时应注意以下两点: 单片机响应中断后,不会自动关闭中断系统。如果用户程序不希望出现中断嵌套,则必须在中断服务程序的开始处关闭中断,禁止更高优先级的中断请求中断当前的服务程序。 为了保证保护现场和恢复现场能够连续进行,可在保护现场和恢复现场之前先关中断,当现场保护或现场恢复结束后,再根据实际需要决定是否需要开中断。
48
三、中断请求的撤除 中断源向CPU发出中断请求后,中断请求信号分别锁 存在特殊功能寄存器中。
循环的现象;而撤除过早,有可能中断尚未响应,造成 请求信号的丢失。所以,及时撤除中断请求是很重要的。
49
1、定时器/计数器T0、T1中断请求的撤除 2、外部中断请求的撤除
当CPU响应T0或T1的中断请求后,由硬件自动清除相应的中断请求标志TF0或TF1。所以在处理定时器/计数器的中断时,无需关心清除中断请求标志的问题。 2、外部中断请求的撤除 CPU响应外部中断0和外部中断1后,由硬件自动清除中断请求标志IE0和IE1。 外部中断2、3和4的中断请求标志对用户不可见,CPU响应外部中断2~4后,由硬件自动清除中断请求标志,无需用户清0。
50
CPU响应串行口中断后,不能由硬件自动清除
3、串行口中断请求的撤除 CPU响应串行口中断后,不能由硬件自动清除 串行口中断标志(UART1为TI和RI,UART2为 S2TI和S2RI)。由于串行口的发送中断和接收 中断使用相同的入口地址,所以,CPU响应串 行中断后,首先应检测这两个中断标志位,以判 断是发送中断还是接收中断。当检测结束后,应 通过软件将串行口中断标志清0。
51
4、ADC中断请求的撤除 ADC中断请求标志位ADC_FLAG不能自动清 除,需要在ADC中断服务程序中用软件将其清 0。 5、SPI中断请求的撤除 SPI中断请求标志位SPIF不能自动清除,需要 在SPI中断服务程序中用软件清0。
52
6、PCA中断请求的撤除 PCA中断请求标志位CF/CCF0/CCF1不能自动 清除,需要在PCA中断服务程序中用软件将相 应的标志位清0。 7、低电压检测中断请求的撤除 低电压检测中断请求标志位LVDF不能自动清 除,需要在低电压检测中断服务程序中用软件清 0。
53
四、中断程序编程举例 【例6-1】利用INT0引入单脉冲,每来一个负脉冲, 将连接到P1口的发光二极管循环点亮。 解:利用的下降沿触发中断。
54
汇编语言程序如下: 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
55
对应的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;
56
【例6-2】利用上升沿和下降沿均可触发中断的外部中断,可以检测脉冲跳变的次数,也可以检测按键的按下与弹起操作。
下面的例子可以统计从INT1引脚输入脉冲的跳变次数。
57
汇编语言程序如下: ;主程序: ORG 0000H ;主程序入口 LJMP MAIN ORG 0013H ;外部中断1入口
LJMP INT_X1 ORG 0100H ;主程序 MAIN: MOV SP,#7FH CLR A ;假设脉冲的跳变次数保存在累加器ACC中 CLR IT ;设外部中断1为上升沿和下降沿均可触发的方式 SETB EX ;外部中断1开中断 SETB EA ;CPU开中断 SJMP $ ;原地踏步,等待中断发生 ;外部中断1处理子程序: INT_X1: INC A ;统计脉冲跳变次数 ;可以在这个地方读入INT1/P3.3引脚的电平, ;从而判断本次中断是上升沿中断还是下降沿中 RETI ;返回 END
58
对应的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++; //统计脉冲跳变次数
59
【例6-3】外部中断2的使用。 外部中断2~4的使用方法与外部中断0和1的使用方法类似,区别在于外部中断2~4只能是下降沿触发,并且,要注意开放中断的方法。
60
$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
61
对应的C语言程序如下: #include “stc15.h” //包含寄存器定义头文件 void main (void) { INT_CLKO |= 0x10; //允许外部中断2 EA =1; //允许总的中断 while(1); //等待中断 } void X2_ISR (void) interrupt 10 //外部中断2函数 //在这里编写中断处理程序
62
【例6-4】外部中断源扩展。 当外部中断源多于两个时,可采用硬件申请与软 件查询结合的方法,把多个中断源通过硬件“线或”
或经或非门引入外中断源输入端(或),同时又连 到某I/O口。这样,每个源都可能引起中断,在中断 服务程序中通过软件查询便可确定哪一个是正在申 请的中断源,其查询的次序则由中断源优先级决 定,这就可实现多个外部中断源的扩展。
63
如图所示的中断线路可实现系统的故障显示,当系统的各部分工作正常时,4个故障源输入端全为低电平,指示灯全熄灭。若当某部分出现故障,则对应的输入线由低电平变为高电平,从而引起单片机中断,试设计判定故障源的程序,并进行相应的灯光显示。 图6-3 利用中断线路显示系统故障
64
解:通过或非门,将上升沿转换为下降沿,利用下降沿中断方式实现。
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
65
对应的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 //外部中断函数 P2=~P1;
66
五、中断使用过程中需要注意的问题 在嵌入式系统中,中断是一种很有效的事件 处理方式。但是,如果使用中断不当,往往会出 现一些意想不到的结果。为了获得正确的结果可 能要花费大量的调试时间,而且中断复位子程序 的错误是比较难于被发现和纠正的。为了避免发 生类似的问题,下面介绍中断使用过程中需要注 意的问题。
67
1、寄存器保护 由于中断请求的发生时刻是随机的,所以在主程序的 执行过程中,在任何地方都有可能发生中断请求并进入 中断处理程序,因此,必须保证在任何时候都要做好中 断现场的保护工作。例如,主程序是: CLR C MOV A,#25H ADDC A,#10H …… 中断处理程序是: MOV A,#0FFH ADD A,#41H RETI
68
例如,在中断处理程序中应当修改为类似于下面的代码:
PUSH ACC ;保护现场 PUSH PSW MOV A,#0FFH ADD A,#41H MOV H,A ;将运算结果保存在30H中 POP PSW ;恢复现场 POP ACC RETI
69
结论 通常情况下,在中断处理子程序中,需要保护那 些在主程序中用到、而其中的数值在从中断返回后 还需要继续使用的、因而不应被中断处理子程序修
改内容的寄存器。例如,如果在主程序中用到 DPTR,并且不想被别的子程序修改内容,在中断 处理程序中也用到DPTR,此时,就应该在中断处 理子程序中使用PUSH和POP指令对DPTR加以保 护和恢复。
70
如果用C语言编写中断处理程序,通常开发环境本身会自动进行寄存器保护,因此用户不必再编写现场保护代码。
PUSH DPH PUSH DPL ;其他代码 POP DPL POP DPH RETI 如果用C语言编写中断处理程序,通常开发环境本身会自动进行寄存器保护,因此用户不必再编写现场保护代码。
71
2、使用中断常出现的问题 如果使用了中断之后,整个程序出现不能正 确的执行或不能达到预期的目标的现象,应该检 查与中断有关的内容,主要是在以下几个方面。
72
1)寄存器保护 保证所有前面提及的寄存器被保护。如果忘 记保护主程序使用的寄存器,可能会产生错误结 果。如果寄存器未按预期的愿望改变其中的值或 者出现错误的值,这很可能是因为寄存器没有被 保护。
73
2)忘记恢复被保护的值 中断返回前忘记将保护数据从堆栈中弹出。 例如将ACC、B、和PSW压入堆栈进行保护,
用RETI指令的时候,单片机将使用B中的值作为 返回地址,将产生不可预料的混乱结果。
74
3)中断返回使用了RET而不是RETI指令。
程序的混乱。若发现中断仅仅执行了一次,而无 法进行第二次的中断处理,那么应该检查子程序 是否正确使用了RETI指令。
75
4)中断程序尽量短小 中断处理子程序应该尽量短小,这样其执行 速度更快。例如,接收串行中断的处理程序应该
从SBUF中读一个字节,并且将其复制到用户定 义的临时缓冲区中,然后退出中断程序,缓冲区 中的数据的进一步处理应由主程序来处理。中断 的时间消耗越少,那么在中断发生时就可以更快 的响应和处理其他的中断。
76
5)注意中断标志的清除问题 某些中断的中断标志不是在响应相应中断时 由硬件自动清除的,用户需要在中断处理程序返 回前,使用指令将中断标志位清“0”,否则,中 断返回后,还将产生一次新的中断。例如串行通 信中断、ADC中断、SPI中断、低电压检测中断 以及PCA中断。
Similar presentations