[信息与通信]第七章 AT89S52单片机中断系统.ppt
第八章 AT89S52单片机中断系统,学习目标:了解中断的基本概念、中断的作用及中断请求方式掌握AT89S52单片机中断结构,6个中断源的中断请求、中断屏蔽、优先级设置等初始化编程方法掌握定时/计数器4种工作方式的初始化编程方法学会使用定时器/计数器编写计数、定时应用程序的方法,技能目标:会编写中断和定时/计数器初始化程序 会计算定时/计数器初值根据项目要求,能够灵活应用中断和定时/计数器的资源,项目一 中断控制的流水灯第一部分 项目要求 采用中断方法控制灯的亮灭,由中断服务程序控制I/O口置高,置低,即可控制灯的全亮和全灭。外部中断INT1接按键(KEY),作为中断申请信号,开机后8个发光二极管从左到右流水,产生中断后,8个发光管全亮、全灭,延时一定时间后,再循环。,第二部分 相关知识一、中断概述,中断的定义:当中央处理器CPU正在处理某事件时外界发生了更为紧急的请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完毕后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。,从中断的定义我们可以看到中断应具备中断源、中断响应、中断返回三个要素。中断源发出中断请求,单片机对中断请求进行响应,当中断响应完成后应进行中断返回,返回被中断的地方继续执行原来被中断的程序。,二、AT89S52中断源与中断向量地址,中断源就是向CPU发出中断请求的来源。AT89S52共有六个中断源:2个外部中断(INT0和INT1)、3个定时器中断(定时器0、1和2)和1个串行中断。如图所示。,(一)外部中断外部中断0 P3.2外部中断1 P3.3外部中断请求有两种信号方式:电平方式和脉冲方式。电平方式的中断请求信号是低电平有效。脉冲方式的中断请求信号则是脉冲的负跳变有效。,(二)内部定时和外部计数中断定时:对内部振荡器输出的脉冲计数。计数脉冲的个数反映了时间的长短。计数:对外部脉冲计数。计数脉冲的个数仅仅反映外部脉冲输入的多少。外部脉冲由T0引入 P3.4外部脉冲由T1引入 P3.5外部脉冲由T2引入 P1.0当定时器/计数器发生溢出,便激活中断。外部计数中断请求信号是脉冲的负跳变引起。,(三)串行中断 串行中断是为串行通信的而需要设置的。当串行口发送完或接收完一帧信息时,单片机内部硬件便自动串行发送或接收中断标志位置1。当CPU查询到这些标志位为1时,便激活串行中断。串行中断是由单片机内部自动发生的,不需要在芯片外设置引入脚。,(四)中断矢量地址,三、中断标志与控制,要实现中断,首先中断源要提出中断申请,而中断请求的过程是单片机内部特殊功能寄存器TCON和SCON相关状态位中断请求标志位置1的过程,当CPU响应中断时,中断请求标志位才由硬件或软件清0。,(一)定时器计数器控制寄存器TCON TCON为定时器/计数器的控制器,它也锁存外部中断请求标志,其格式如下:,与中断有关的控制位共6位,IE0和IE1:外部中断请求标志。当CPU采样到(或)端出现有效中断请求(低电平或脉冲下降沿)时,IE0(或IE1)位由片内硬件自动置1;当中断响应完成转向中断服务程序时,由片内硬件自动清0。IT0和ITl:外部中断请求信号触发方式控制标志。IT0(或IT1)=1,(或)信号为脉冲触发方式,脉冲负跳沿有效;IT0(或IT1)=0,(或)信号电平触发方式,低电平有效。IT0(或IT1)位可由用户软件置1或清0 TF0和TFl:定时器/计数器溢出中断请求标志。当定时器0(或定时器1)产生计数溢出时,TF0(或TF1)由片内硬件自动置1;当中断响应完成转向中断服务程序时,由片内硬件自动清0。计数溢出标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用。,(二)串行口控制寄存器SCON,与中断有关的控制位共2位TI:串行口发送中断请求标志。当串行口发送完一帧信号后,由片内硬件自动置1。但CPU响应中断时,并不清除TI,必须在中断服务程序中由软件对TI清0。,RI:串行口接收中断请求标志。当串行口接收完一帧信号后,由片内硬件自动置1。但CPU响应中断时,并不清除RI,必须在中断服务程序中由软件对其清0。应当指出,AT89S52系统复位后,TCON和SCON中各位被复位成“0”状态,应用时要注意各位的初始状态。,(三)中断允许控制寄存器IE,与中断有关的控制位共7位EA:中断允许总控制位。EA=0时,中断总禁止,禁止一切中断;EA=1时,中断总允许,而每个中断源允许与禁止,分别由各自的允许位确定。,EX0和EX1:外部中断允许控制位。EX0(或EX1)=0,禁止外部中断;EX0(或EX1)=1,允许外部中断。ET0和ET1:定时器中断允许控制位。ET0(ET1)=0,禁止定时器0(或定时器1)中断;ET0(ET1)=1,允许定时器0(或定时器1)中断。,ES:串行中断允许控制位。ES=0,禁止串行(TI或RI)中断;ES=1,允许串行(TI或RI)中断。ET2:定时器2中断允许控制位。ET2=0,禁止定时器2(TF2或EXF2)中断;ET2=1,允许定时器2(TF2或EXF2)中断;在单片机复位后,IE各位被复位成“0”状态,CPU处于关闭所有中断的状态。,例如:可以采用如下字节传送指令来开放定时器T0的溢出中断:MOV IE,#82H 也可以用位寻址指令,则需采用如下两条指令实现同样功能:SETB EA SETB ET0 在89S52复位后,IE各位被复位成“0”状态,CPU处于关闭所有中断的状态。所以,在89S52复位以后,用户必须通过程序中的指令来开放所需中断。,(四)中断优先级控制寄存器IP 89S52单片机具有高、低2个中断优先级。高优先级用“1”表示,低优先级用“0”表示。对于所有的中断源,均可由软件设置为高优先级中断或低优先级中断,并可实现两级中断嵌套。IP寄存器可以位寻址。,与中断有关的控制位共6位 PX0:外部中断0优先级设定位。PT0:定时器0(T0)优先级设定位。PXl:外部中断1优先级设定位。PTl:定时器1(T1)优先级设定位。PS:为串行口优先级设定位。PT2:为定时器2优先级设定位。可用软件对IP的各位置1或清0,例如CPU开中断可由以下两条指令来实现:SETB 0AFH;EA置1 或 0RL IE,#80H;按位“或”,EA置1 CPU关中断可由以下两条指令来实现:CLR 0AFH;EA清0 或 ANL IE,#7FH;按位“与”,EA清0 又如设置外部中断源 为高优先级,外部中断源 为低优先级,可由下面指令来实现:SETB 0B8H;PX0置1 CLR 0BAH;PXl清0 或 MOV IP,#00001B;PX0置1,PXl清0,四、优先级结构 中断优先级只有高低两级。所以在工作过程中必然会有两个或两个以上中断源处于同一中断优先级。若出现这种情况,内部中断系统对各中断源的处理遵循以下两条基本原则:低优先级中断可以被高优先级中断所中断,反之不能。一种中断(不管是什么优先级)一旦得到响应,与它同级的中断不能再中断它。中断源 同级自然优先级 外部中断0 最高级 定时器0中断 外部中断1 定时器1中断 串行口中断 最低级 定时器2中断 最低级,例:设89S52的片外中断为高优先级,片内中断为低优先级。试设置IP相应值。解:(a)用字节操作指令 MOV IP,#05H 或 MOV 0B8H,#05H(b)用位操作指令 SETB PX0 SETB PX1 CLR PS CLR PT0 CLR PT1,五、中断系统的初始化及应用(一)中断系统的初始化(1)CPU开中断或关中断;(2)某中断源中断请求的允许或禁止(屏蔽);(3)设定所用中断的中断优先级;(4)若为外部中断,则应规定低电平还是负边沿的中断触发方式。例 请写出 为低电平触发的中断系统初始化程序。解:(1)采用位操作指令 SETB EA;CPU开中断 SETB EXl;开 中断 SETB PXl;令 为高优先级 CLR ITl;令 为电平触发(2)采用字节型指令 MOV IE,#84H;开 中断 ORL IP,#04H;令 为高优先级 ANL TCON,#0FBH;令 为电平触发,(二)中断系统的应用 中断管理与控制程序一般包含在主程序中,根据需要通过几条指令来实现,例如CPU开中断,可用指令“SETB EA”或“ORL IE,#80H”来实现,关中断可用指令“CLR EA”,或“ANL IE,#7FH”来实现。,中断服务程序的一般格式:ORG ADDRESS AJMP INTVS INTVS:CLR EA;关中断 PUSH PSW;保护现场 PUSH A SETB EA;开中断,允许CPU响应高级中断 中断服务 CLR EA;关中断 POP A;恢复现场 POP PSW SETB EA;开中断 RETI;中断返回,编写此程序应注意以下几点:(1)为了要跳到用户设计的中断服务程序,在相应入口地址安排一条跳转指令;(2)在中断服务程序的末尾,安排一条返回指令RETI;(3)由于在响应中断时,CPU只自动保护断点,所以CPU的其他现场(如寄存器A、B状态,状态字PSW,通用寄存器R0、R1等)的保护和恢复也必须由用户在中断服务程序中安排;(4)在此多级中断的中断服务程序中,保护现场之后的开中断(SETB EA)是为了允许有更高级中断打断此中断服务程序,恢复现场和保护现场之前的关中断(CLR EA)是为了保证在恢复和保护现场时,CPU不响应新的中断请求,从而使现场数据不受到破坏或者造成混乱;(5)当把程序中保护现场之后的SETB EA和恢复现场之前的CLR EA删除,就是一个单级中断服务程序。,(三)中断程序举例【例7.3】使用一个按键控制图3.4所示的流水灯,每按一次按键流水灯的流动方向改变一次,要求使用中断技术处理按键。解:如图7.4所示,按键接在P3.3,因此采用外部中断1,中断申请从 输入。每按一次按键,产生一次中断,流水灯流动方向便改变一次。当开关SA17闭合时,发出中断请求。中断服务程序的矢量地址为0013H。,图7.4 方向可控流水灯,ORG 0000H;定义下一条指令的地址 SJMP START;转向主程序 ORG 0013H;安排外部中断1处理程序的第一条指令 SJMP:KEYS;直接转移到中断处理程序 START:;主程序起点 MOV SP,#40H;设置堆栈栈底指针 SETB IT1;设置外部中断1的中断方式为下降沿中断 SETB EX1;开放外部中断1 SETB EA;开放总中断 MOV A,#01H;#01H送累加器A L1:MOV P2,A;累加器A中内容送P2口 MOV R7,#0FFH;延时 L3:MOV R6,#0FFH L2:DJNZ R6,L2 DJNZ R7,L3 JNB FX,L4;FX=0时转移到L4(FX是流水灯流动方向标志)RL A;累加器A中内容左移一位 SJMP L5;转移至L5 L4:RR A;累加器A中内容右移一位 L5:SJMP L1;转移至L1,;按键中断程序;入口:外部中断1;功能:确认按键后改变方向标志FX的状态 KEYS:;中断处理程序入口 MOV R7,#20H;首先延时去抖 K1:MOVR6,#0FFH DJNZ R6,$DJNZ R7,K1 JB KEY,K2;延时完成后再检测按键 CPL FX;确认按键按下,改变方向标志位状态 K2:RETI;中断结束返回 KEY BIT P3.3;定义按键变量 FX BIT 00H;定义位变量,用于判断方向 END;结束,第三部分 项目实施一、项目实施分析(一)硬件电路 P1口连接8个发光二极管,外部中断INT1接KEY(P2.7接按键SW8,P3.3接KEY),作为中断申请信号,开机8个发光二极管从左到右流水,产生中断后,8个发光管全亮、全灭,延时后,再循环。如图7.5所示。,参考程序:ORG 0000h;伪指令 LJMP START;跳转到单片机的主程序 ORG 0013H;外部中断1的入口地址 LJMP EXT1;跳转到中断服务程序 ORG 0100H;伪指令,单片机主程序的开始START:MOV IE,#10000100b MOV IP,#00000100b MOV TCON,#00000000b;定时器初始化 MOV SP,#40H,MOV P1,#0FFH MOV P2,#00H MOV P3,#0FFH;设置P1、P2、P3口状态LOOP:MOV A,#0FFH CLR C MOV R2,#08H LOOP1:RLC A MOV P1,A LCALL DELAY DJNZ R2,LOOP1 JMP LOOP;小灯循环点亮EXT1:PUSH ACC;中断服务程序 PUSH PSW,MOV A,#00H;小灯全亮 MOV R3,#0AHLOOP2:MOV P1,A LCALL DELAY CPL A DJNZ R3,LOOP2 POP PSW POP ACC RETI,DELAY:MOV R5,#20;延时程序D1:MOV R6,#20D2:MOV R7,#248 DJNZ R7,$DJNZ R6,D2 DJNZ R5,D1 RET END,第三部分 项目实施,一、硬件电路,二、软件1.计数器初值计算 在系统初始化时需要将计数器的初值写入TL0和TH0中,如果使用模式0或模式1,当计数器发生溢出后,还要重新将初值写入TL0和TH0中。改变重装入时的TH0和TL0的值就可以改变定时器的定时时间,也就改变了流水灯的流动速度。设定TH0、TL0初值为1000H,每按一次按键增加4000(十进制数),速度加快一挡。最快时为1000H+400010=44096。,2.系统程序(1)流水灯控制 在此之前的各模块中,为了定时都采用了空循环的方法,这种方法浪费了大量的CPU工作时间。在单片机中一般采用定时计数器组成一个定时器来完成这种定时工作。使用定时器后系统的程序框图如图1所示。由于每当定时时间到产生中断后显示控制工作进行一次,所以可以将显示控制工作放在定时中断里完成。这样主程序只需要完成定时计数器和中断的初始化工作即可结束。,图1 使用定时器后系统的程序框图,ORG 0000H SJMP START ORG 000BH SJMP CTCSSTART:MOV SP,#40H;设置堆栈指针 MOV TMOD,#01H;设置定时计数器0工作模式 MOV TL0,#00H;设置定时计数器0的初值 MOV TH0,#10H SETB TR0;启动定时计数器 SETB ET0;允许定时计数器0中断 SETB EA;允许总中断 MOV A,#01H;设置显示控制字初值 SJMP$;主程序停止在本指令,;定时计数器0中断处理程序 CTCS:PUSH PSW;保护现场 MOV TL0,#00H;恢复定时计数器初值 MOV TH0,#10H RL A;调整显示控制字 MOV P2,A;输出显示控制字 POP PSW;恢复现场 RETI;中断返回 上述程序仅实现了使用定时计数器延时,流水灯的速度是一个固定值。为了实现调速的目的,还需进行以下修改。,(2)调速控制 为了改变流水灯的流动速度,可以改变定时计数器0的初值,因此需要使用两个变量保存初值(CTH保存TH0的初值,CTL保存TL0的初值)。在按键中断中改变这两个变量的数值,在定时计数器中使用这两个变量为定时计数器恢复初值就可达到调速的目的。根据要求,每按一次按键时需要改变速度。在按键的中断处理中需要对定时器的初值进行调整,根据前面的分析,提高速度时每次将初值增加4000,而降低速度时每次将初值减小4000。,将初值增加4000和减小4000需要进行2字节的加减法运算,对于这种通用的功能程序可以直接调用。如多字节运算子程序如下:;.;多字节加减法运算;入口:R0指向加数或被减数的低字节(多字节数低位在低地址,高位在高地址);R1指向加数或减数的低字节;R7需要运算的字节数,;AS运算标志位:AS=0时进行加法运算,AS=1时进行减法运算;出口:运算结果存放在R0指向的连续单元中MADDSUB:CLR C LOOP:MOV A,R0 JB AS,SBB ADDC A,R1 SJMP NEXT SBB:SUBB A,R1 NEXT:MOV R0,A INC R0,INC R1 DJNZ R7,LOOP RET 这是一个标准子程序,只需要看懂入口和出口的条件即可直接调用。从调用说明中可以看到,调用此程序前需要做以下的准备工作。安排定时计数器初值CTH和CTL时,两个变量需连续安排且CTL在低地址位 CTL EQU 22H CTH EQU 23H,将4000也安排在两个连续的地址中,4000=0FA0H C4000L EQU 24H C4000H EQU 25H 将R0指向CTL所在地址(CTL),R1指向4000所在地址的低电位(C4000L)MOV R0,#CTL MOC R1,#C4000L R7送立即数#2,需要做加法运算时设置标志位AS=0,需要做减法运算时设置标志位AS=1。,设置完成后调用MADDSUB子程序,就可以完成运算,运算结果在R0所指向的地址中,即CTL和CTH变成了运算后的新数据。(3)主程序 安排变量。根据以上分析,本程序中需要安排以下变量。CTL、CTH:字节变量,用于保存当前计数器的初值。C4000L、C4000H:字节变量,保存每次调整速度用的运算数据4000。JSQ:字节变量,设置一个计数器,计数值从09。每按键1次,JSQ加1。当JSQ=10时表示本次加速或减速已达最大或最小值,程序将其回零,同时改变加减法运算标志。,XS:字节变量,前几个模块直接将显示控制字放置在累加器A中,这样操作简单。但是累加器A是一个使用非常频繁的寄存器,用它做显示控制时,其他地方就不便再使用累加器A了。本技能训练应用一个内存变量保存显示控制字。AS:位变量,加减法运算标志。主程序 ORG0000HSJMPSTARTORG 000BHSJMPCTCS,START:MOV SP,#40H;设置堆栈指针MOV TL,#00H;设置定时计数器0初值MOV TH,#10HMOV 4000L,#0A0H;4000=0FA0HMOV 4000H,#0FH CLR AS;先做加法(加速)MOV JSQ,#0;计数器清0MOV TMOD,#01H;设置定时计数器0工 作模式MOV TL0,CTL,MOV TH0,CTHSETB TR0;启动定时计数器SETB ET0;允许定时计数器0中断SETB EA;允许总中断MOV XS,#01H;设置显示控制字初值SJMP$;主程序停止在本指令JSQ DATA 21H;定义加减速级数计数器变量CTL DATA22H;定义定时计数器0的初值CTH DATA23HC4000L DATA 24H;定义每级改变量,C4000H DATA 25H XS DATA 26H;定义显示控制字 AS BIT 00H;定义运算用标志位(4)定时计数器中断处理程序 由于需要进行调速,定时计数器中断处理程序也需要进行修改,程序清单如下:;.;定时计数器0中断处理程序 CTCS:PUSH PSW;保护现场 MOV TL0,CTL;恢复定时计数器初值,MOV TH0,CTH MOV A,XS RL A;调整显示控制字 MOV XS,A MOV P2,A;输出显示控制字 POP PSW;恢复现场 RETI;中断返回(5)按键中断处理程序(见图2),图 2 中断处理程序框图与程序清单,KEYS:PUSH PSW PUSH ACC MOV PSW,#08H MOV R7,#20 K1:MOV R6,#0FFH DJNZ R6,$DJNZ R7,K1 JB KEY,K2 INC JSQ MOV A,JSQ CJNE A,#10,K3,CPL AS MOV JSQ,#0K3:MOV R0,#CTL MOV R1,#C4000L MOV R7,#2 ACALL MADDSUB K2:POP ACC POP PSW RETI,4、程序清单根据以上分析,本系统程序共有以下几部分。主程序。定时计数器中断处理子程序。按键中断处理子程序。多字节加减法运算子程序。完整的程序清单如下:;速度可控制的流水灯ORG0000H,SJMPSTARTORG000BHSJMPCTCS ORG0013HSJMPKEYSSTART:MOVSP,#40H;设置堆栈指针MOVCTL,#00H;设置定时计数器0初值MOVCTH,#10HMOVC4000L,#0A0H;4000=0FA0HMOVC4000H,#0FHMOVXS,#01H,MOV JSQ,#0;计数器清0CLR AS;先做加法(加速)MOV TMOD,#01H;设置定时计数器0工作 模式MOV TL0,CTLMOV TH0,CTHSETB TR0;启动定时计数器SETB ET0;允许定时计数器0中断SETB EX1;允许外部中断1SETB IT1;设置外部中断1为下降沿中断SETB EA;允许总中断,MOV XS,#01H;设置显示控制字初值S1:SJMP S1;主程序停止在本指令 JSQ DATA 21H CTL DATA 22H CTH DATA 23H C4000LDATA 24H C4000HDATA 25H XS DATA 26H KEY EQU P3.3 AS BIT 00H,;=;定时计数器0中断处理程序;入口:定时计数器0中断CTCS:PUSH PSW;保护现场PUSHACCMOVTL0,CTL;恢复定时计数器初值MOVTH0,CTHMOVA,XSRLA;调整显示控制字MOVXS,AMOVP2,A;输出显示控制字POPACC,POP PSW;恢复现场 RETI;中断返回;=;外部中断0处理程序;入口:外部中断0连接的按键按下KEYS:PUSH PSW PUSH ACC MOVPSW,#08H MOVR7,#20 K1:MOVR6,#0FFH,DJNZ R6,$DJNZR7,K1JBKEY,K2INCJSQMOVA,JSQCJNEA,#10,K3CPLASMOVJSQ,#0K3:MOVR0,#CTLMOVR1,#C4000LMOVR7,#2ACALLMADDSUB,K2:POP ACCPOP PSWRETI;=;多字节加减法运算;入口:R0指向加数或被减数的低字节(多字节数地位在低地址,高位在高地址);R1指向加数或减数的低字节;R7 需要运算的字节数;运算标志位AS:AS=0时进行加法运算,AS=1时进行减法运算;出口:运算结果存放在R0指向的连续单元中,MADDSUB:CLRCLOOP:MOVA,R0JBAS,SBBADDCA,R1SJMPNEXTSBB:SUBBA,R1NEXT:MOVR0,AINCR0INCR1DJNZR7,LOOPRETEND,