《单片机原理及应用》课件第5章-中断模块结构_第1页
《单片机原理及应用》课件第5章-中断模块结构_第2页
《单片机原理及应用》课件第5章-中断模块结构_第3页
《单片机原理及应用》课件第5章-中断模块结构_第4页
《单片机原理及应用》课件第5章-中断模块结构_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章中断模块主要内容:1.中断模块相关寄存器;2.中断执行流程;3.中断服务程序设计。

在CPU和外设交换信息时,存在着快速CPU和慢速外设间的矛盾,机器内部有时也可能出现突发事件,为此,计算机中通常采用中断技术。1.中断:CPU和外设并行工作,当外设数据准备好(或有某种突发事件发生)时向CPU提出请求,CPU暂停正在执行的程序转而为该外设服务(或处理紧急事件),处理完毕再回到原断点继续执行原程序。2.中断源:引起中断的原因或中断申请的来源,称为中断源。

可以是I/O设备、故障、时钟、调试中人为设置。中断相关概念:3.中断优先级:当有多个中断源同时向CPU申请中断时,CPU优先响应最需紧急处理的中断请求,处理完毕再响应优先级别较低的,这种预先安排的响应次序,为中断优先级。4.中断的嵌套:在中断系统中,高优先级的中断请求能中断正在进行的较低级的中断源处理。5.中断系统:能实现中断功能并能对中断进行管理的硬件和软件,称为中断系统。一.中断控制寄存器TCON----定时控制寄存器,

IE----中断允许控制寄存器,IP----中断优先级控制寄存器.1、TCON88HD7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0定时器使用位外部中断使用说明:1.IT0和IT1为外中断INT0

和INT1中断触发方式选择,若选下降沿触发则相应位置1;若选低电平触发,IT相应位置0。2.某中断源有中断请求,该中断标志置1,无中断请求,该中断标志置03.TR0

和TR1

为定时器T0和T1工作启动和停止控制。2、

IE中断允许寄存器A8H

D7D6D5D4D3D2D1D0EAESET1EX1ET0EX00禁止,1允许ET0:定时器T0中断允许位,ET0=1,允许T1计数溢出中断;

ET0=0,禁止T0中断。EX1:外部中断INT1允许位,

EX1=1,允许INT1中断;

EX1=0,禁止INT1中断。EX0:外部中断INT0允许位,

EX0=1,允许INT0中断;

EX0=0,禁止INT0中断。3、IP中断优先级寄存器B8H

D7D6D5D4D3D2D1D0PT2PSPT1PX1PT0PX00低级别,1高级别T0T1串行口

当某几个中断源在IP寄存器相应位同为1或同为零时,由内部查询确定优先级,查询的顺序是:CPU优先响应先查询的中断请求T2INT0INT1五个中断源的优先级别由IP寄存器管理,相应位置1,则该中断源优先级别高,置0的优先级别低。中断系统结构IE0EX0TF0IE1TF1TIESET1EX1ET0RIIP硬件查询高级中断请求低级中断请求中断源INT0INT1中断入口地址中断源10IEPX0PSPT1PX1PT0111111111100000EA1≥1SCON11T0T1RXTXIT0IT100TCON中断入口地址自然优先级自然优先级源允许总允许优先级二、中断执行流程NNYYYN执行指令中断标志1?(中断请求?)指令最后一个T周期?EA=1?允许位=1?CPU判别优先权,响应优先权高的中断断点的PC进栈,中断服务入口地址送PC撤除中断标志RETI中断返回,断点出栈送PC中断请求中断响应中断服务中断返回中断服务中断服务程序按规定的中断矢量地址存入,由于五个中断矢量地址0003H、000BH、0013H、001BH、0023H之间相距很近,往往装不下一个中断服务程序,通常将中断服务程序安排在程序存贮器的其他地址空间,而在矢量地址的单元中安排一条转移指令。

三、应用实例:中断程序的设计

例1.在下图中P1.4~P1.7接有四个发光二极管,P1.0~P1.3接四个开关,消抖电路产生中断请求信号,当消抖电路的开关来回拔动一次产生一个下降沿信号,通过INT0向CPU申请中断。

要求:初时发光二极管全灭,每中断一次,P1.0~P1.3所接的开关状态反映到发光二极管上,且要求开关断开的对应发光二极管亮

程序:ORG0000HAJMPMAINORG0003H;INT0中断入口

AJMPSER1;转中断服务程序

ORG0030H;主程序

MAIN:MOVP1,#0FH;高4位灯灭,低四位输入写1SETBIT0;边沿触发中断

SETBEX0;允许外中断0中断

SETBEA;开中断开关

SJMP$;等待中断ORG0050H

SER1:MOVP1,#0FH;P1先写入“1”且灯灭

MOVA,P1;输入开关状态换到高4位

SWAPA;低4位开关状态电平

MOVP1,A;输出到P1高4位

RETIEND中断服务例2.AT89S51的P1口接一个共阴极的数码管,利用消抖开关产生中断请求信号,每来回拔动一次开关,产生一次中断,用数码管显示中断的次数(最多15次,十六进制数显示)。×P1.189S51P1.0P1.2P1.4P1.3P1.5P1.6&&1K2INT1驱动器+5VagEAORG0000HAJMPMAINORG0013H;INT1中断入口

AJMPINT1;转中断服务程序

ORG0030H;主程序MAIN:SETBIT1;边沿触发中断

SETBEX1;允许INT1中断

SETBEA;开中断开关

MOVR0,#0;计数初值为0MOVA,#3FH;“0”的字形码送AAL1:MOVP1,A;显示数码AL2:CJNER0,#0FH,AL1;没满15次循环显示

MOVR7,#0FFH;满15次,显‘F’

DJNZR7,$

MOVP1,#0;关显示

CLREA;关中断

SJMP$;结束INT1:INCR0;中断次数加1MOVA,R0MOVDPTR,#TAB;DPTR指向字形码表首址

MOVCA,@A+DPTR;查表

POPDPHPOPDPL;弹出断点

MOVDPTR,#AL1PUSHDPLPUSHDPH;修改中断返回点,AL1压入堆栈

RETI;AL1地址→PC,返主程序AL处

TAB:DB3FH,06H,5BH,4FH,66H,6DHDB7DH,07H,7FH,6FH,77H,7CHDB39H,5EH,79H,71H;字形码表

END

上面程序每中断一次,执行一次中断服务程序INT1。在中断服务程序中,累计中断次数并查字形表,返回到主程序AL1地址执行显示。

将上面程序重排在同一页:ORG0000HAJMPMAINORG0013HAJMPINT1ORG0030HMAIN:SETBIT1SETBEX1SETBEAMOVR0,#0MOVA,#3FHAL1:MOVP1,AAL2:CJNER0,#0FH,AL1MOVR7,#0FFHDJNZR7,$

MOVP1,#0CLREASJMP$

INT1:INCR0MOVA,R0MOVDPTR,#TABMOVCA,@A+DPTRPOPDPHPOPDPLMOVDPTR,#AL1PUSHDPLPUSHDPHRETI;AL1地址→PCTAB:DB3FH,06H,5BH,…

END

以上中断在AL1或AL2两指令处发生,究竟是哪一指令处中断是随机的,为保证返回到AL1显示‘F’

,这里采用修改中断返回点的办法,即先从栈中弹出中断响应时压入的断点弹到DPTR中,修改DPTR为用户需要的返回点,并将其压入堆栈,再通过执行RETI指令弹出栈中内容到PC、弹出的即为修改后的地址,从而返回到主程序中所希望的地址执行。

上例中中断次数在主程序判断,目的是了解修改中断返回点的方法,如果改在中断服务程序中判断,编程简洁些,下面仅介绍和上例中的不同部分的程序。

MOVR0,#0;计数初值为0MOVP1,#3FH;显示‘0’

MOVDPTR,#TAB;指向字形码表AGA:SJMP$;等待中断INT1:INCR0;中断次数加1MOVA,R0MOVCA,@A+DPTR;查字形码表

MOVP1,A;显示

CJNER0,#0FH,RE;15次中断未到转RECLREA;15次到关中断

RE:RETI;返回主程序的AGA处

TAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HC51使用户能编写高效的中断服务程序,编译器在规定的中断源的矢量地址中放入无条件转移指令,使CPU响应中断后自动地从矢量地址跳转到中断服务程序的实际地址,而无需用户去安排。中断服务程序定义为函数,函数的完整定义如下。

其中interruptn表示将函数声明为中断服务函数,n为中断源编号,可以是0~31间的整数,编译器从8n+3处产生中断向量地址。不允许是带运算符的表达式,n通常取以下值:返回值函数名([参数])interruptn[usingm]C51中断程序的设计

0外部中断0;

1定时器/计数器0溢出中断

2外部中断1;

3定时器/计数器1溢出中断

4串行口发送与接收中断

Usingm定义函数使用的工作寄存器组,m的取值范围为0~3,可缺省,它对目标代码的影响是:函数入口处将当前寄存器保存,使用m指定的寄存器组,函数退出时原寄存器组恢复。选不同的工作寄存器组,可方便实现寄存器组的现场保护。

再入:属性关键字reentrant将函数定义为再入的,在C51中,普通函数(非再入的)不能递归调用,只有再入函数才可被递归调用。中断服务函数不允许用于外部函数,它对目标代码影响如下:①当调用函数时,SFR中的ACC、B、DPH、DPL和PSW(当需要时入栈)。②如果不使用寄存器组切换,中断函数所需的所有工作寄存器Rn都入栈。③函数退出前,所有工作寄存器出栈。④函数由“RETI”指令终止。

例1:C语言编程#include<reg51.h>int0()interrupt0/*INT0中断函数*/{P1=0x0f;/*输入端先置1,灯灭*/P1<<=4;/*读入开关状态,并左移四位,}使开关反映在发光二极管上*/main(){

EA=1;/*开中断总开关*/EX0=1;/*允许INT0中断*/IT0=1;/*下降沿产生中断*/while(1);/*等待中断*/

主函数执行while(1);语句进入死循环等待中断,当拨动INT0的开关后,进入中断函数,读入P1.0~P1.3的开关状态并将状态数据右移四位到P1.4~P1.7的位置上输出控制LED亮,执行完中断,返回到等待中断的while(1)语句,等待下一次的中断。

法1:在主程序中控制中断次数

#include<reg51.h>chari;codechartab[16]={0x3f,0x06,0x5b,0x4F,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};int1()interrupt2{i++;/*计中断次数*/P1=tab[i];/*查表,次数送显示*/

例2:用C语言编程,可有两种编程方法。

main()

EA=1;EX1=1;IT1=1;ap5:P1=0x3f;/*显示“0”*/for(i=0;i<16;);/*当I<16等待中断*/gotoap5;/*当i=16重复下一轮16次中*/

法二:在中断服务程序中控制中断次数#include<reg51·h>chari;codechartab[16]={0x3f,0x06,0x5b,0x4F0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};int()interrupt2{

i++if(i<16)P1=tab[i];

else{i=0;P1=0x3f;}}

main(){

EA=1;EX1=1;IT1=1;P1=0x3f;

while(1);/*等待中断*/

}四、

外部设备中断的接入

在前面的示例中,中断信号是按键动作模拟产生的,如果是某事件或某设备产生,将该事件或该设备转变成低电平或脉冲下降沿引入INT中断请求端即可,图5-5和图5-6是采用中断方式输入、输出的接口,图中省去了应答信号。如果外设需要应答信号,可由并行口设定。8XX51

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论