第5章 89C51的中断系统_第1页
第5章 89C51的中断系统_第2页
第5章 89C51的中断系统_第3页
第5章 89C51的中断系统_第4页
第5章 89C51的中断系统_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

中断的基本概念80C51中断源中断控制寄存器中断处理过程中断优先控制和中断嵌套中断系统的应用第5章89C51的中断系统

5.1中断的概念CPU正在执行程序时,单片机外部或内部发生的某一事件,请求CPU迅速去处理。CPU暂时中止当前的工作,转到中断服务处理程序处理所发生的事件。处理完该事件后,再回到原来被中止的地方,继续原来的工作,这称为中断。CPU处理事件的过程,称为CPU的中断响应过程。

图5-1所示。对事件的整个处理过程,称为中断处理(或中断服务)。能够实现中断处理功能的部件称为中断系统;产生中断的请求源称为中断请求源。中断源向CPU提出的处理请求,称为中断请求(或中断申请)。进入中断→保护现场→中断处理恢复现场→中断返回⒉为什么要设置中断?⑴提高CPU工作效率⑵具有实时处理功能⑶具有故障处理功能⑷实现分时操作中断功能强弱是计算机性能优劣的重要标志①中断源②中断申请③开放中断④保护现场⑤中断服务⑥恢复现场⑦中断返回中断涉及的几个环节5.289C51中断系统的结构有5个中断请求源,两个中断优先级,可两级嵌套。中断系统结构示意图如图5-2所示。

图5-2⑴ INT0:外部中断0,中断请求信号由P3.2输入。⑵ INT1:外部中断1,中断请求信号由P3.3输入。⑶T0:定时/计数器0溢出中断,对外部脉冲计数由P3.4输入。⑷T1:定时/计数器1溢出中断,对外部脉冲计数由P3.5输入。⑸串行中断:包括串行接收中断RI和串行发送中断TI。中断源是指能发出中断请求,引起中断的装置或事件。89C51单片机的中断源共有5个,其中2个为外部中断源,3个为内部中断源:5.3中断请求源①中断请求:定时和外中断控制寄存器TCON;

串行控制寄存器SCON;②中断允许控制寄存器IE;③中断优先级控制寄存器IP。中断控制寄存器

89C51单片机中涉及中断控制的有3个方面4个特殊功能寄存器:INT0、INT1、T0、T1中断请求标志放在TCON中串行中断请求标志放在SCON中。⑴中断请求控制寄存器

字节地址为88HTCOND7D6D5D4D3D2D1D0位名称TF1—TF0—IE1IT1IE0IT0位地址8FH8EH8DH8CH8BH8AH89H88H功能T1中断标志—T0中断标志—

中断标志

触发方式

中断标志触发方式TCON的结构、位名称、位地址和功能如下:

TCON位功能:①TF1——T1溢出中断请求标志

T1计数溢出后,TF1=1②TF0——T0溢出中断请求标志

T0计数溢出后,TF0=1TF0/TF1:定时器溢出中断申请标志位:=0:定时器未溢出;=1:定时器溢出申请中断,进中断后自动清零。③IE1——外中断中断请求标志

当P3.3引脚信号有效时,IE1=1④IE0——外中断中断请求标志

当P3.2引脚信号有效时,IE0=1IE0/IE1:外部中断申请标志位:=0:没有外部中断申请;=1:有外部中断申请。⑤IT1——外中断触发方式控制位

IT1=1,边沿触发方式,即P3.3出现下跳边脉冲有效;

IT1=0,电平触发方式。⑥IT0——外中断触发方式控制位其意义和功能与IT1相似。IT0/IT1:外部中断请求的触发方式选择位:=0:在INT0/INT1端申请中断的信号低电平有效;=1:在INT0/INT1端申请中断的信号负跳变有效.当89C51复位后,TCON被清0,则CPU关中断,所有中断请求被禁止。串行控制寄存器SCON字节地址为98H。串行口的发送中断和接收中断的中断请求标志TI和RI,TCOND7D6D5D4D3D2D1D0位名称——————TIRI位地址——————99H98H功能——————串行发送中断标志串行接收中断标志①TI——串行口发送中断请求标志②RI——串行口接收中断请求标志

各标志位的功能:(1)TI—发送中断请求标志位。串口每发送完一帧串行数据后,硬件自动置“1”TI。必须在中断服务程序中用软件对TI标志清“0”。

(2)RI—接收中断请求标志位。串口接收完一个数据帧,硬件自动置“1”RI标志。必须在中断服务程序中用软件对RI标志清“0”。89C51对中断源的开放或关闭由中断允许控制寄存器IE控制。字节地址A8H,可位寻址IE的结构、位名称和位地址如下:5.4中断控制5.4.1中断允许控制寄存器IEIED7D6D5D4D3D2D1D0位名称EA——ESET1EX1ET0EX0位地址AFH——ACHABHAAHA9HA8H中断源CPU——串行口T1T0①EA——CPU中断允许控制位(总开关)

EA=1,CPU开中;

EA=0,CPU关中,且屏蔽所有5个中断源。②EX0——外中断INT0中断允许控制位

EX0=1,INT0开中;EX0=0,INT0关中。③EX1——外中断INT1中断允许控制位

EX1=1,INT1开中;EX1=0,INT1关中。④ET0——定时/计数器T0中断允许控制位

ET0=1,T0开中;ET0=0,T0关中。⑤ET1——定时/计数器T1中断允许控制位

ET1=1,T1开中;ET1=0,T1关中。⑥ES——串行口中断(包括串发、串收)允许控制位

ES=1,串行口开中;ES=0,串行口关中。说明:89C51对中断实行两级控制,总控制位是EA,每一中断源还有各自的控制位。首先要EA=1,其次还要自身的控制位置“1”。例如:要使INT0开中(其余关中),可执行下列指令:

MOVIE,#1000000lB;

或者:SETBEA;SETBEX0;

IED7D6D5D4D3D2D1D0位名称EA——ESET1EX1ET0EX0位地址AFH——ACHABHAAHA9HA8H中断源CPU——串行口T1T0中断允许控制寄存器IE改变IE的内容,可由位操作指令来实现,即:

SETBbit;CLRbit。例5-1若允许片内2个定时器/计数器中断,禁止其它中断源的中断请求。编写设置IE的相应程序段(1)用位操作指令来编写如下程序段:

CLRES ;禁止串行口中断 CLREX1 ;禁止外部中断1中断 CLREX0 ;禁止外部中断0中断

SETBET0;允许定时器/计数器T0中断SETBET1;允许定时器/计数器T1中断SETBEA;CPU开中断(2)用字节操作指令来编写:

MOVIE,#8AH;100010010或者用:

MOV0A8H,#8AH;A8H为IE寄存器字节地址IED7D6D5D4D3D2D1D0位名称EA——ESET1EX1ET0EX0位地址AFH——ACHABHAAHA9HA8H中断源CPU——串行口T1T05.4.2中断优先级控制寄存器IP89C51有5个中断源,划分为2个中断优先级:高优先级和低优先级。

89C51中断优先控制的基本原则:①高优先级中断可以中断正在响应的低优先级中断,反之则不能。②同优先级中断不能互相中断。③同一中断优先级中,若有多个中断源同时请求中断,CPU将先响应优先权高的中断,后响应优先权低的中断。中断嵌套结构类似与调用子程序嵌套,不同的是:①子程序嵌套是在程序中事先按排好的;中断嵌套是随机发生的。②子程序嵌套无次序限制,中断嵌套只允许高优先级“中断”低优先级。①PX0:INT0中断优先级控制位。PX0=1,为高优先级;

PX0=0,为低优先级;②PX1:INT1中断优先级控制位。控制方法同上。③PT0:T0中断优先级控制位。控制方法同上。④PT1:T1中断优先级控制位。控制方法同上。⑤PS:串行口中断优先级控制位。控制方法同上。

IPD7D6D5D4D3D2D1D0位名称———PSPT1PX1PT0PX0位地址———BCHBBHBAHB9HB8H中断源———串行口T1INT1T0INT0IP的结构、位名称和位地址如下:例如:若要将INT1、串行口设置为高优先级,其余中断源设置为低优先级,可执行下列指令:

MOVIP,#00010100B;需要指出的是,若置5个中断源全部为高优先级,就等于不分优先级。

IED7D6D5D4D3D2D1D0位名称———PSPT1PX1PT0PX0位地址———BCHBBHBAHB9HB8H中断源———串行口T1INT1T0INT0中断优先级控制寄存器IP由软件可改变各中断源的中断优先级。89C51的中断系统有两个不可寻址的“优先级激活触发器”:一个用来指示某高优先级的中断正在执行,所有后来的中断均被阻止。另一个用来指示某低优先级的中断正在执行,所有同级中断都被阻止,但不阻断高优先级的中断请求。在同时收到几个同一优先级的中断请求时,优先响应哪一个中断,取决于内部的查询顺序。查询顺序如表5-1:

表5-1 中断查询次序

中断源中断级别

外部中断0 最高 T0溢出中断 外部中断1 T1溢出中断 串行口中断 最低5.5响应中断请求的条件

一个中断请求被响应,需满足以下必要条件:(1)IE寄存器中的中断总允许位EA=1。(2)该中断源发出中断请求,即该中断源对应的中断请求标志为“1”。(3)该中断源的中断允许位=1,即该中断没有被屏蔽。(4)无同级或更高级中断正在被服务。中断响应的主要过程:首先由硬件自动生成一条长调用指令:

LCALLaddr16接着就由CPU执行该指令,将PC的内容压入堆栈以保护断点,再将中断入口地址装入PC。各中断源服务程序的入口地址固定,如表5-2所示:

表5-2 中断查询次序

中断源入口地址

外部中断0 0003H定时器/计数器T0 000BH 外部中断1 0013H

定时器/计数器T1 001BH 串行口中断 0023H中断响应是有条件的,遇到下列三种情况之一时,中断响应被封锁:(1)CPU正在处理同级的或更高优先级的中断。(2)所查询的机器周期不是所当前正在执行指令的最后一个机器周期。只有在当前指令执行完毕后,才能进行中断响应。(3)正在执行的指令是RETI或是访问IE或IP的指令。需要再去执行完一条指令,才能响应新的中断请求。如果存在上述三种情况之一,CPU将丢弃中断查询结果,不能对中断进行响应。中断处理过程中断处理过程大致可分为四步:中断请求、中断响应、中断服务、中断返回⒈中断请求中断源发出中断请求信号,相应的中断请求标志位(在中断控制寄存器TCON、SCON中)置“1”。⒉中断响应

CPU查询(检测)到某中断标志为“1”,在满足中断响应条件下,响应中断。

中断响应条件:①该中断已经“开中”;②CPU此时没有响应同级或更高级的中断;③当前正处于所执行指令的最后一个机器周期;④正在执行的指令不是RETI或者是访向IE、IP的指令,否则必须再另外执行一条指令后才能响应。

中断响应操作

CPU响应中断后,进行下列操作:①保护断点地址;②撤除该中断源的中断请求标志;③关闭同级中断;④将相应中断的入口地址送入PC;

80C51五个中断入口地址:

INT0:0003H; T0:000BH;INT1:0013H; T1:001BH;

串行口:0023H⒊执行中断服务程序中断服务程序应包含以下几部分:⑴保护现场⑵执行中断服务程序主体,完成相应操作⑶恢复现场保护现场:在中断服务程序中,通常会涉及到一些特殊功能寄存器,如Acc、PSW和DPTR等,而这些特殊功能寄存器中断前的数据在中断返回后还要用到,若在中断服务程序中被改变,返回主程序后将会出错。因此,要求把这些特殊功能寄存器中断前的数据保存起来,待中断返回时恢复。

⒋中断返回在中断服务程序最后,必须安排一条中断返回指令RETI,当CPU执行RETI指令后,自动完成下列操作:⑴恢复断点地址。⑵开放同级中断,以便允许同级中断源请求中断。恢复断点地址:将原来压入堆栈中的PC断点地址从堆栈中弹出,送回PC。这样CPU就返回到原断点处,继续执行被中断的原程序。初学者容易模糊的是,中断返回,返回哪里?答案是:从什么地方来,回什么地方去。不是返回到相应中断的入口地址,而是返回到中断断点地址。

5中断请求的撤除中断源发出中断请求,相应中断请求标志置“1”。CPU响应中断后,必须清除中断请求“1”标志。否则中断响应返回后,将再次进入该中断,引起死循环出错。⑴对定时/计数器T0、T1中断,外中断INT0、INT1,若采用边沿触发方式,CPU响应中断时就用硬件自动清除了相应的中断请求标志TF0、TF1。⑵对外中断INT0、INT1,若采用电平触发方式,需要采取软硬结合的方法消除后果。⑶对串行口中断,用户应在串行中断服务程序中用软件清除TI或RI。例:硬件电路如图所示。当外部设备有中断请求时,中断请求信号经反相,加到锁存器CP端,作为CP脉冲。由于D端接地为0,Q端输出低点平,触发

INT0生中断。当CPU响应中断后,应在该中断服务程序中按排两条指令:

CLRP1.0SETBP1.0

从而撤消引起重复中断的INT0低电平信号。

因此一般来说,对外中断INT0、INTl,应尽量采用边沿触发方式,以简化硬件电路和软件程序。

5.6外部中断的响应时间外部中断的最短的响应时间为3个机器周期:

(1)中断请求标志位查询占1个机器周期。(2)子程序调用指令LCALL转到相应的中断服务程序入口,需2个机器周期。外部中断响应的最长的响应时间为8个机器周期:(1)发生在CPU进行中断标志查询时,刚好是开始执行RETI或是访问IE或IP的指令,则需把当前指令执行完再继续执行一条指令后,才能响应中断,当前指令执行完最长需2个机器周期。(2)接着再执行一条指令,按最长指令(乘法指令MUL和除法指令DIV)来算,也只有4个机器周期。(3)加上硬件子程序调用指令LCALL的执行,需要2个机器周期。所以,外部中断响应最长时间为8个机器周期。如果已在处理同级或更高级中断,响应时间无法计算。在一个单一中断的系统里,MCS-51单片机对外部中断请求的响应的时间总是在3~8个机器周期之间。 5.7外部中断的触发方式选择 两种触发方式:电平触发方式和跳沿触发方式。 5.7.1电平触发方式 CPU在每个机器周期采样到的外部中断输入线的电平。在中断服务程序返回之前,外部中断请求输入必须无效(即变为高电平),否则CPU返回主程序后会再次响应中断。 适于外中断以低电平输入且中断服务程序能清除外部中断请求(即外部中断输入电平又变为高电平)的情况。

5.7.2跳沿触发方式

连续两次采样,一个机器周期采样到外部中断输入为高,下一个机器周期采样为低,则置“1”中断请求标志,直到CPU响应此中断时,该标志才清0。这样不会丢失中断,但输入的负脉冲宽度至少保持1个机器周期。

5.8中断请求的撤消1.定时器/计数器中断请求的撤消

中断请求被响应后。硬件会自动清TF0或TF1。2.外部中断请求的撤消

(1)跳沿方式外部中断请求的撤消是自动撤消的。(2)电平方式外部中断请求的撤消:除了标志位清“0”之外,还需在中断响应后把中断请求信号引脚从低电平强制改变为高电平,如图5-8所示。 只要P1.0端输出一个负脉冲就可以使D触发器置“1”,从而撤消了低电平的中断请求信号。所需的负脉冲可增加如下两条指令得到:

ORLP1,#01H ;P1.0为“1” ANLP1,#0FEH ;P1.0为“0”

ORLP1,#01H ;P1.0为“1” 电平方式的外部中断请求信号的完全撤消,是通过软硬件相结合的方法来实现的。 3.串行口中断请求的撤消 响应串行口的中断后,CPU无法知道是接收中断还是发送中断,还需测试这两个中断标志位的状态,以判定是接收操作还是发送操作,然后才能清除。所以串行口中断请求的撤消只能用软件清除

CLRTI;清TI标志位 CLRRI;清RI标志位

5.9中断服务程序的设计1.中断服务程序设计的任务

基本任务:(1)设置中断允许控制寄存器IE。(2)设置中断优先级寄存器IP。(3)对外中断源,是采用电平触发还是跳沿触发。(4)编写中断服务程序,处理中断请求。前2条一般放在主程序的初始化程序段中。例5-3

假设允许外部中断0中断,并设定它为高级中断,其它中断源为低级中断,采用跳沿触发方式。在主程序中编写如下程序段:

SETBEA;CPU开中断SETBET0;允许外中断0产生中断SETBPX0;外中断0为高级中断SETBIT0;外中断0为跳沿触发方式

2.采用中断时的主程序结构常用的主程序结构如下:

ORG0000H LJMPMAIN

ORG中断入口地址 LJMPINT ⋮

ORGXXXXHMAIN:主程序

INT:中断服务程序

⋮3.中断服务程序的流程如图5-9所示。图5-9补充:中断系统的应用

⒈中断初始化⑴设置堆栈指针SP⑵定义中断优先级⑶定义外中断触发方式⑷开放中断⑸安排好等待中断或中断发生前主程序应完成的操作内容。⒉中断服务主程序中断服务子程序内容要求:⑴在中断服务入口地址设置一条跳转指令,转移到中断服务程序的实际入口处。⑵根据需要保护现场。⑶中断源请求中断服务要求的操作。⑷恢复现场。与保护现场相对应,注意先进后出、后进先出操作原则。⑸中断返回,最后一条指令必须是RETI。⒈中断初始化⑴设置堆栈指针SP

因中断涉及保护断点PC地址和保护现场数据,且均要用堆栈实现保护,因此要设置适宜的堆栈深度。

①深度要求不高且工作寄存器组1~3不用时,可维持复位时状态:SP=07H,深度为24B(20H~2FH为位寻址区)。

②要求有一定深度时,可设置SP=60H或50H,深度分别为32B和48B。

⑵定义中断优先级根据中断源的轻重缓急,划分高优先级和低优先级。用MOVIP,#XXH或SETBXX指令设置。

⑶定义外中断触发方式一般情况,定义边沿触发方式为宜。若外中断信号无法适用边沿触发方式,必须采用电平触发方式时,应在硬件电路上和中断服务程序中采取撤除中断请求信号的措施。

⑷开放中断注意开放中断必须同时开放二级控制,即同时置位EA和需要开放中断的中断允许控制位。可用MOVIE,#XXH指令设置,也可用SETBEA和SETBXX位操作指令设置。

⑸安排好等待中断或中断发生前主程序应完成的操作内容。⒉中断服务主程序中断服务子程序内容要求:

⑴在中断服务入口地址设置一条跳转指令,转移到中断服务程序的实际入口处。由于89C51相邻两个中断入口地址间只有8B的空间,8B只能容纳一个有3~8条指令的极短程序,一般情况中断服务程序均大大超出8B长度。因此,必须跳转到其他合适的地址空间。跳转指令可用SJMP、AJMP或LJMP指令,SJMP、AJMP均受跳转范围影响,建议用LJMP指令,则可将真正的中断服务程序不受限制地安排在64KB任何地方。

⑵根据需要保护现场。

保护现场不是中断服务程序的必需部分。通常是保护Acc、PSW和DPTR等特殊功能寄存器中的内容。若中断服务程序中不涉及Acc、PSW,DPTR,则不需保护,也不需恢复。例如:累加器A是最常用的特殊功能寄存器,主程序中不可能不用到A。而发生中断又是随机的,可能正好发生在对A进行操作、A中的数据还有用时进入中断,而在中断服务程序中又涉及到A,改变了A中的内容,则在进入中断服务程序对A操作前应对原A中数据进行保护,以便中断返回后恢复A中原来数据

需要指出的是,保护现场数据越少越好,数据保护越多,堆栈负担越重,堆栈深度设置应越深。⑶中断源请求中断服务要求的操作。⑷若是外中断电平触发方式,应有中断信号撤除操作。若是串行收发中断,应有对RI、TI清0指令。

⑸恢复现场。与保护现场相对应,注意先进后出、后进先出操作原则。(6)中断返回,最后一条指令必须是RETI。例:通过外部中断1,在中断服务中将B寄存器里的内容左环移一位。已知:(B)=01h,要求采用边沿触发,低优先级。此例的实际意义:在INT1引脚接一个按钮开关到地,每按一下按钮就申请一次中断,中断服务则是:依次点亮八盏灯中的一盏。

P1.0P1.7INT1300⒊中断系统应用举例

ORG0000H

LJMPMAIN

ORG0013H;中断矢量

LJMPINTMAIN:SETBEA;开总中断允许“开关”

SETBEX1;开分中断允许“开关”

CLRPX1;0优先级(也可不要此句)

SETBIT1;边沿触发

MOVB,#01H;给B寄存器赋初值HERE:SJMPHERE;原地等待中断申请INT:MOVA,B;自B寄存器中取数

RLA;左环移一次

MOVB,A;存回B,备下次取用

MOVP1,A;输出到P1口

RETI;中断返回END中断服务程序对应的C语言程序如下:#include<reg51.h>unsignedchari=0x01;voidintxl_isr()interrupt2{i<<=1;if(i==0)i=1;//移位8次后,i将变为0,需重新赋值P1=i;}Voidmain(void){P1=0;IT1=1;EX1=1;EA=1;While(1); //循环等待}【例】出租车计价器计程方法是车轮每运转一圈产生一个负脉冲,从外中断INT0(P3.2)引脚输入,行驶里程为轮胎周长×运转圈数,设轮胎周长为2m,试实时计算出租车行驶里程(单位米),数据存32H、31H、30H。

⒊中断系统应用举例解:编程如下:

ORG 0000H

;复位地址

LJMP STAT ;转初始化

ORG 0003H

;中断入口地址

LJMP INT ;转中断服务程序

ORG0100H

;初始化程序首地址STAT:MOVSP,#60H ;置堆栈指针

SETBIT0 ;置边沿触发方式

MOVIP,#01H ;置高优先级

MOVIE,#81H ;开中

MOV30H,#0 ;里程计数器清0

MOV31H,#0 ;MOV32H,#0 ;LJMPMAIN ;转主程序,并等待中断

ORG0200H ;中断服务子程序首地址INT:PUSHAcc ;保护现场

PUSHPSW ;

MOVA,30H ;读低8位计数器

ADDA,#2 ;低8位计数器加2m

MOV30H,A ;回存

CLRA ;

ADDCA,31H ;中8位计数器加进位

MOV31H,A ;回存

CLRA ;

ADDCA,32H ;高8位计数器加进位

MOV32H,A ;回存

PUSHPSW ;恢复现场

PUSHAcc ; RETI ;中断返回

ENDMAIN主程序可以处理循环显示等任务。5.10多外部中断源系统设计 两个外部中断请求源往往不够用。需对外部中断源进行扩充。本节介绍一种扩充外部中断源的方法。 如图5-10所示,若系统中有5个外部中断请求源IR0~IR4,它们均为高电平请求有效,这时可按中断请求的轻重缓急进行排队,把其中最高级别的中断请求源IR0直接接到89C51的一个外部中断请求源IR0输入端,其余的4个中断请求源IR1~IR4按图5-10的办法通过各自的OC门(集电极开路门)连到89C51的另一个外中断源输入端,同时还连到P1口的P1.0~P1.3脚,供89C51查询。 各外部中断请求源的中断请求由外设的硬件电路产生。采用如图5-10所示的电路,5个外部中断源的中断优先权由高到低的顺序依次为IR0,IR1,…,IR4。图5-10假设图5-10中的4个外设中有一个外设提出为高电平有效的中断请求信号,则中断请求通过4个集电极开路OC门的输出公共点,即引脚的电平就会变低。究竟是哪个外设提出的中断请求?还要通过程序查询P1.0~P1.3引脚上的逻辑电平来确定。

【例】现有5个外中断源EX1、EX20、EX21、EX22和EX23,高电平时表示请求中断,要求执行相应中断服务程序,试编制程序。解:ORG 0000H ;复位地址LJMP MAIN

;转主程序ORG 0003H ;中断入口地址LJMP PINT0

;转中断服务程序ORG 0013H ;中断入口地址LJMP PINT1

;转中断服务程序

ORG 0100H

;主程序首地址MAIN:MOV SP,#60H ;置堆栈指针

ORL TCON,#05H ;置INT0、INT1为边沿触发方式

SETB PX0 ;置为高优先级

MOV IE,#0FFH ;全部开中 … ;主程序内容

ORG1000H

;中断服务程序首地址

PINT0:PUSH Acc ;中断,保护现场

LCALLWORK1 ;调用EX1服务子程序

POP Acc ;恢复现场

RETI ;中断返回

ORG 2000H

;中断服务程序首地址PINT1:CLR EA ;CPU禁中

PUSH Acc ;中断保护现场

PUSH DPH ;PUSH DPL ;SETB EA ;CPU开中

JBP1.0,LWK20;P1.0=1,EX20请求中断

JBP1.1,LWK21;P1.1=1,EX21请求中断

JBP1.2,LWK22;P1.2=1,EX22请求中断

LCALLWORK23;P1.3=1,调用EX23服务子程序

LRET: CLR EA ;CPU禁中

POP DPL ;恢复现场

POP DPH ;POP Acc ;SETB EA ;CPU开中

RETI ;中断返回LWK20:LCALLWORK20 ;P1.0=1,调用EX20服务子程序

SJMPLRET;转中断返回LWK21:LCALLWORK21 ;P1.1=1,调用EX21服务子程序

SJMPLRET ;转中断返回LWK22:LCALLWORK22;P1.2=1,调用EX22服务子程序

SJMPLRET ;转中断返回

4.8函数4.8.1函数的定义函数定义的一般格式如下:函数类型函数名(形式参数表)[reentrant][interruptm][usingn]形式参数说明{

局部变量定义 函数体}前面部件称为函数的首部,后面称为函数的尾部,格式说明:1.函数类型函数类型说明了函数返回值的类型。2.函数名函数名是用户为自定义函数取的名字以便调用函数时使用。3.形式参数表形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数。【例21】定义一个返回两个整数的最大值的函数max()。intmax(intx,inty){intz;z=x>y?x:y;return(z);}也可以用成这样:intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}4.reentrant修饰符这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间接调用函数本身。一般的函数不能做到这样,只有重入函数才允许递归调用。

关于重入函数,注意以下几点

温馨提示

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

最新文档

评论

0/150

提交评论