1、1,第7章 AT89S52中断系统,内容: 第一节 概念 第二节 中断源 第三节 中断控制 第四节 中断系统的C51编程方法 第五节 外部中断及应用实例,2,第一节 概念,中断的概念CPU对外界异步事件的一种响应方法。在执行程序的过程中,由于某种外界的原因,必须打断当前的程序执行,而去执行相应的处理程序,待处理结束后,再回来继续执行被终止的程序。这个过程叫中断。相当于有一个独立于CPU的事件管理机制,只在事件发生后并且满足CPU响应条件,才由CPU予以处理,从一个侧面看,相当于并行工作。,3,中断及其嵌套,4,中断技术的优点:提高CPU的效率提高实时数据的处理时效故障处理 中断系统的功能:中断
2、优先权排队实现中断嵌套 自动响应中断实现中断返回,5,AT89S52的中断系统,8个中断源,6个中断矢量,具有二个中断优先级,可实现二级中断服务程序的嵌套。每个中断源均可软件编程为高优先级或低优先级中断,允许或禁止向CPU请求中断。 有关的特殊功能寄存器(SFR)有: 中断允许寄存器IE 中断优先级寄存器IP 中断源寄存器(TCON、SCON中的有关位) 注:均可位寻址。,6,第二节 AT89S52中断源,向CPU申请中断的请求源,AT89S52的8个中断源:外部中断/INT0、/INT1; T0、T1计数中断; 串行口发送中断或接收中断; T2计数中断和捕获中断。,外中断对应两个中断矢量;
3、T0、T1中断对应两个中断矢量; 串行口对应一个中断矢量; T2对应个一个中断矢量。,1,2,3,4,5,6,7,第二节 AT89S52中断源,外部中断 /INT0、/INT1:在P3.2或P3.3引脚上产生负跳变或低电平时,置位中断请求标志位IE0或IE1, 外部中断请求标志和触发方式控制位存在于特殊功能寄存器TCON的低四位。硬件自动复位IE0和IE1标志位。 T0、T1计数溢出中断:内部定时器/计数器T0、T1的计数值溢出时,置位中断请求标志TF0、TF1,定时器中断请求标志和控制位存在于特殊功能寄存器TCON的高四位。硬件自动复位TF0、TF1标志位。 T2计数溢出中断:内部定时器/计
4、数器T2的计数值溢出时,置位中断请求标志TF2。必须用软件复位TF2标志位。 T2捕获中断:当外部输入端口T2EX发生下降沿跳变时,只为EXF2,向CPU请求中断。必须用软件复位EXF2标志位。,8,第二节 AT89S52中断源,串行口通信中断:串行接口完成一帧的发送或接收时,置位请求标志TI或RI, 两个标志逻辑或后做为内部的一个中断源。RI和TI存在于特殊功能寄存器SCON的最低二位。必须用软件复位TI、RI。,9,(LSB),(MSB),中断请求位相关寄存器,1、TCON,定时器控制寄存器,地址88H,可按位寻址,注意请求位的清除问题: 避免对一次事件的多次重复响应,IE0 外部中断0
5、请求标志位, 当检测到P3.2 有从高到低的电平跳变时置1。 TF0 定时器0 溢出(计数值由全1变全0)标志,响应中断后由 处理器清零。 IE1 外部中断1 请求标志位, 当检测到P3.3 有从高到低的电平跳变时置1。 TF1 定时器1 溢出(计数值由全1变全0)标志,响应中断后由 处理器清零。TR0 定时器0运行控制位,1:运行,0:停止 TR1 定时器1运行控制位,1:运行,0:停止 IT0 外部中断0触发方式控制位, 1: 跳变触发 0:低电平触发 IT1 外部中断1触发方式控制位, 1: 跳变触发 0:低电平触发,11,(LSB),(MSB),中断请求位相关寄存器,2、SCON,串口
6、控制寄存器,地址98H,可按位寻址,TI: 完成一个串行帧的发送则 TI置1,需由软件清零。 RI: 完成一个串行帧的接收则 RI置1,需由软件清零。,12,(LSB),(MSB),中断请求位相关寄存器,3、T2CON,定时器2控制寄存器,地址C8H,可按位寻址,TF2:定时器2溢出标志,响应中断后必须由软件清零。 EXF2: 定时器2捕获中断标志,T2EX(P1.1)引脚产生下降沿,置位EXF2。需由软件清零。,13,第三节 中断控制,中断允许控制 IE(A8H) 实现两级控制 注意:复位时,禁止所有中断中断优先级控制 IP(B8H) 每一中断源可编程为高优先级或低优先级中断,以实现二级嵌套
7、。,14,中断允许寄存器 IE (0A8H,可位寻址),EA:总允许位。EA=0:禁止一切中断;EA=1:中断开放,各中断是否被允许有其对应的允许位确定。ES:串行口中断允许位。ES=1:允许RI、TI引发中断;ES=0:禁止串口中断。 ET2:定时器T2中断允许位。1:允许,0:禁止。 ET1、ET0:定时器T1、T0允许位。1:允许,0: 禁止。EX1、EX0:外中断INT1、INT0允许位。1:允许,0:禁止。,(LSB),(MSB),15,中断优先级寄存器IP(0B8H,可位寻址),PS:串行口中断优先级设定位;1:高 0:低PT2:定时器T2中断优先级设定位;1:高 0:低PT1、P
8、T0:定时器T1、T0中断优先级设定位; 1:高 0:低PX1、PX0:外中断/INT1、0中断优先级设定位;1:高 0:低,(LSB),(MSB),PT2,16,一、主优先级规则,由于IP寄存器的设定,将8个中断源分为两个级别。中断的发生将遵循下面的2条基本原则:1、低级中断在响应执行中,可以被高级中断所中断,反之则不能。2、一个中断(不论是什么优先级)一旦得到响应,与它同级的中断则不能再中断它。 二、辅优先级规则3、当CPU同时收到几个同一级别的中断要求时,CPU响应哪个中断源取决于硬件的查询顺序。,优先级规则,17,当2个以上中断先后发生时(不在同一个机器周期内),或者当2个以上不同优先
9、级中断同时发生时,由IP寄存器决定哪个先被响应。 当2个以上同优先级中断同时发生时(在同一个机器周期内发生),IP寄存器已经不能决定哪个先被响应,要由内部查询顺序决定哪个先被响应。具体先后顺序如下: IE0 TF0 IE1 TF1 RI+TI TF2+EXF2,优先级规则,高,低,18,中断的响应过程,中断系统每个机器周期都顺序检查每一个中断源,若查询到某个被允许的中断请求标志位为1, 如果不被下述条件所阻止,则将在下一个机器周期的转到响应的中断服务程序。阻止条件: 1)CPU正在处理相同或更高级的中断请求; 2)现在的机器周期不是执行指令的最后一个机器周期(MOV R1,20H); 3)正在
10、执行的指令是RETI或对IE、IP的写操作指令。(执行这些指令后,至少再执行一条指令后才会响应中断)。,19,CPU响应中断时完成工作,置位相应的优先级状态触发器(阻止同级和较低优先级的中断发生); 执行一条硬件子程序调用(内部),使控制转移到相应的中断入口地址; PC的内容进栈(断点地址) ; 被响应的中断服务程序的入口地址送PC。,20,注意,各个中断源的中断入口地址均已由系统规定,不能改动。中断源 入口地址INT0 0003HT0 000BHINT1 0013HT1 001BH串行口 0023H T2 002BH C51 用interrupt n 来确定入口地址。即入口地址=n*8+3,
11、21,第四节 中断系统的C51编程方法,在主程序中对中断初始化 打开相应中断源的中断;(IE) 设定中断优先级;(IP) 若为外部中断,设定外部中断的触发方式; 启动产生中断的事件运行 (如定时器),以便可以发生中断。 编写中断服务程序 正确使用 interrupt 关键字和中断号; 一般使用无入口参数无返回值的函数; 用全局变量在主程序和中断服务程序间交换信息。,22,8051的中断系统十分重要,C51使你能够用C来声明中断和编写中断服务程序,中断过程通过使用interrupt 关键字和中断号(0 到31)来实现,中断号告诉编译器中断程序的入口地址。对于8052,中断号对应着 IE 寄存器中
12、的使能位,换句话说IE寄存器中的0位对应着外部中断0,相应的外部中断0的中断号是0。下表反映了这种关系。,interrupt关键字和中断号,23,中断号 interrupt n,24,第五节 外部中断及应用实例,25,第五节 外部中断及应用实例,IE0、IE1:中断请求标志,有两种方法使其置位,即电平和边沿。IT0(IT1)=0:低电平触发,CPU响应中断后无法自动清除请求位IE0、IE1。低电平要保持到CPU响应后,退出中断服务程序前要保证/INT0、/INT1已经变成高电平。IT0(IT1)=1:边沿触发,CPU响应中断后自动清除请求位IE0、IE1。 高电平和低电平时间都必须大于1Tm,
13、26,4个独立按键,用中断方式识别。(相当于外部中断的简单扩充),外部中断的应用: 例 1,27,#include /要用到sfr sbit xIR0=P14; sbit xIR1=P15; sbit xIR2=P16; sbit xIR3=P17; main() P1=0xff; /P1输入EA=1; EX1=1; IT1=1; /开INT1中断,边沿触发 for(;) ; /无限循环作为main的结束 ,程序代码,void delay(void) int i, j ;for(i=0; i10; i+)for(j=0; j1000; j+); void key_press(void) int
14、errupt 2 /INT1的中断服务程序 delay();if(P1 /返回 ,外部中断的应用: 例 2,8051单片机的P1口控制8个LED灯,要求8个灯循环移位点亮,当中断来时,灯全灭全亮交替变化6次(闪烁3次),然后继续循环移位点亮。,30,#include /要用到sfr #include /_crol_() sbit INT0=P32; main() P1=0xfe; /P1.0上的LED亮,其余灭EA=1; EX0=1; IT0=0; /开INT0中断,电平触发 for(;) /无限循环作为main的结束 int i, j;for (i=0; i50; i+)for(j=0; j
15、1000; j+);/延时一会_crol_(P1, 1); / P1左循环移1位 ,程序代码,void key_press(void) interrupt 0 /INT0的中断服务程序 int m, n, j ;for(m=0; m10; m+)for(n=0; n300; n+);if(INT0=1) return; /延时约10ms去抖动, for (m=0; m3; m+) P1=0; /全亮for( n=0; n100; n+) for(j=0; j500; j+); P1=0xff; /全灭for( n=0; n100; n+) for(j=0; j500; j+); P1=0xfe; / 回初始状态while(INT0=0); /等键释放,要不会重复进入中断(电平触发) ,32,作业,P159:1、3、8 、10 补充题: 1、 在例2中,要求8个LED中有一个闪烁,当中断到来时,闪烁位循环移位1次,试编程实现。,