首页 理论教育 基于汇编与C语言的单片机外部中断应用与扩展

基于汇编与C语言的单片机外部中断应用与扩展

时间:2023-10-23 理论教育 版权反馈
【摘要】:但MCS-51不属于这种情况,一个中断输入只对应一个中断入口,因此,两个外部中断请求源往往不够用。采用8位并入串出移位寄存器74LS165实现外部中断源的扩展。图5-35是中断源查询的一种方案。

基于汇编与C语言的单片机外部中断应用与扩展

5.3.3.1 外部中断的应用

MCS-51为用户提供了两个外部中断请求输入线img。下面将通过实例介绍如何使用外部中断源的实际应用。

【例5-6】 利用img引入单脉冲,每来一个负脉冲,将P1口的发光二极管循环点亮。

汇编语言参考程序为:

C语言参考程序为:

【例5-7】 用S1键(外部中断0)控制D0~D5发光,用S2键(外部中断1)控制D0~D5熄灭。按一次S1键,D0~D5发光;按一次S2键,D0~D5熄灭;再按一次S1键,D0~D5又发光,如此重复。

图5-32为电路图。除了基本的时钟电路、复位电路外,在外部中断0信号输入引脚P3.2上接有按键S1,在外部中断1信号输入引脚P3.3上接有按键S2,在P1口上接有6个红色的发光二极管D0~D5。当按下S1或S2键时,在P3.2或P3.3引脚会产生高到低的电平变化。从图可见,外部中断请求输入端为下降沿有效,即P3.2、P3.3未产生中断请求时,为高电平;有中断请求时,会产生一个低电平,从而使IE0=1或IE1=1,表示外部中断0或外部中断1向CPU申请中断。在外部中断0中断函数中设置相应的发光二极管发光,在外部中断1中断函数中设置相应的发光二极管熄灭。

图5-32 外部中断应用电路图

C语言参考程序为:

5.3.3.2 外部中断源的扩展

MCS-51单片机只有两个外部中断输入端img,并且也只有两个相应的中断服务程序的入口(0003 H和0013H),若是直接使用,意味着只能为两个外设服务,这在许多场合是不够用的。对于有的微处理器(如8086),尽管外部中断输入端也不多,但它的中断控制系统可以控制多个中断服务程序的入口,因而可以为多个外设服务,并不受中断输入端数目的限制。但MCS-51不属于这种情况,一个中断输入只对应一个中断入口,因此,两个外部中断请求源往往不够用。为了能服务于多个外设,就要设法扩展外部中断源。下面介绍5种扩展外部中断源的方法。

1.采用定时/计数器溢出中断作为外部中断

若是两个内部定时/计数器溢出中断没有使用或者有一个没有使用,就可以用来作为外部中断,以扩展一个(或两个)外部中断源。

当把定时器/计数器选为计数器工作模式,T0或T1的引脚上发生负跳变时,T0或T1的计数器加1,利用该特性,可以把T0或T1的引脚作为外部中断请求输入引脚,计数器初值设为最大计数值FFH(方式2为8位计数器)或FFFFH(方式1为16位计数器),TF0(或TF1)作为外部中断请求标志。在允许中断的情况下,当计数值从最大的全1值(FFH或FFFFH)进入全0(00H或0000H)时,就产生溢出中断。因此,只要计数输入端加一个脉冲就可以产生溢出中断申请。若把外部中断输入加到计数输入端T0或T1,就可以利用外中断申请的负脉冲产生定时器溢出中断申请TF0或TF1而转到相应的中断入口000BH或001BH,只要在那里跳转到为外中断服务的中断子程序,就可以最后实现用定时/计数器溢出中断为外部中断(边沿触发型)的目的。具体方法如下:

(1)置定时/计数器为工作方式2,这是一种具有重装初值的8位计数器的工作方式,计数器低8位用做计数,高8位用做存放计数器的初值。当低8位计数器溢出时,高8位内容自动重新装入低8位,从而使计数可以重新按原规定的模值进行。

(2)定时/计数器的高8位和低8位都预置为0FFH。

(3)将定时/计数器的计数输入端T0或T1作为扩展的外部中断输入。

(4)在相应的中断服务程序入口开始存放为外中断服务的中断服务程序。

上面选择方式2的原因是此方式很适用于需要循环定时或循环计数的应用系统,它便于响应一次中断后马上又能自动重载初值,为接受下一次中断申请作好准备。当然,选择方式0、1也可以,但它们需要用户编程实现重载初值FFFFH。

图5-33 例5-8的电路

【例5-8】 如图5-33所示,检测一个外部告警信号,将其接到单片机的T0引脚,当该信号发生一个从“1”到“0”电平的跳变时,使接于P1.0引脚的发光极管亮。

参考程序为:

2.采用串行中断扩展外部中断源

当不需要处理串行接收的数据,可利用串行口方式0的串行接收功能来扩展一个外部中断源。串行口串行接收端为RXD(P3.0),当单片机启动串行接收后,RXD开始逐位接收数据。当接收完8位数时,串行口向CPU发出中断申请,RI=1,CPU响应中断,并执行中断服务程序。串行口中断入口地址为0023H。

采用8位并入串出移位寄存器74LS165实现外部中断源的扩展。管脚2为移位脉冲输入端,与单片机串行口同步脉冲输出端TXD相连;管脚15为串行移位控制端(时钟禁止端),高电平禁止串行输出,低电平允许串行输出;外部中断信号线img接管脚15,低电平申请中断。硬件电路原理图如图5-34所示。

图5-34 串行口方式0扩展外部中断的电路图(www.xing528.com)

图中,P1口用于控制发光二极管L1~L8的交替亮灭。无img中断时,8位发光二极管按固定时间间隔交替亮灭;有EXINT中断时,8位二极管全部点亮。

汇编语言参考程序为:

注意,外部中断源img维持低电平的时间要大于8个TXD端输出的移位脉冲时间。

3.采用查询方式扩展外部中断源

当外部中断源比较多对,用定时器溢出中断也不够使用,这时可用查询方式来扩展外部中断源。

图5-35是中断源查询的一种方案。设有4个外部中断源EI1、EI2、EI3和EI4,这4个中断申请输入通过一个或非门电路产生对8051的中断申请信号img。只要4个中断申请EI1~EI4之中有一个或一个以上有效(高电平)就会产生一个负的img信号向8051申请中断。为了确定在img有效时究竟是哪一个中断源发出申请,就要通过对中断源的查询来解决。为此,4个外部中断输入分别接到P1.0~P1.3这4条引线上,在响应中断以后,在中断服务程序中,CPU通过对这4条输入线电位的检测来确定是哪一个中断源提出了申请。

图5-35 软件查询中断源的方式扩展外部中断源

如果4个外部中断源的优先级不同,则查询时就按照优先级由高到低的顺序进行。例如,当优先级由高到低的顺序是EI1~EI4时,则查询的顺序为P1.0~P1.3,也即查询外部中断源的次序为EI1~EI4。在查到一个高级中断申请后,就转去为这个中断申请服务,服务结束后,就返回继续查询较低级的中断申请,直到查不到其他中断申请时返回,并再等待img上出现新的中断申请信号。CPU响应img中断申请后,总是转到入口地址0013H,进入中断服务程序,对中断源的查询就在这个服务程序中进行,并根据查询结果转向各自的服务子程序。这些子程序尽管是为各个中断源服务的,但不是中断服务子程序,而只是一般的子程序。子程序返回时要用RET指令而不是RETI指令。

汇编语言程序段为:

C语言程序段为:

这种中断源的查询与数据传送的查询方式是不同的。查询方式是CPU不断地查询外设的状态,以确定是否可以进行数据交换。而中断源的查询则是在收到中断申请以后,CPU通过查询来认定中断源。这种查询只需进行一遍即可完成,不必反复进行。

4.采用优先编码器的扩展外部中断源

当外部中断源较多而其响应速度又要求很高时,采用软件查询的方法进行中断优先权排队常常满足不了实时要求。为此,采用优先编码器来对外部中断源优先权排队。下面介绍用优先编码器扩展MCS-51外部中断源的方法。

74LS148是8线-3线优先编码器。它有8个编码输入端0~7,输入端7的优先级最高,输入端0的优先级最低。3个编码输出为A0~A2,EI为使能输入端,低电平有效,EO为使能输出端,GS为片优先编码输出端。当EI为高电平时,74LS148不工作;当EI为低电平时,74LS148工作,其输出代码取决于0~7输入端的编码输入信号,总是在诸多个有效输入信号中按编号最大的(即优先级最高)进行编码输出,同时GS=L(低电平),表示有编码输入信号。74LS148的真值表如表5-7所示。

表5-7 74LS148的真值表

图5-36为用74LS148扩展外部中断源的基本硬件电路。8个外部中断源的输入端0~7分别接外部中断请求img(低电平有效),编码输出端A0、A1、A2分别连到单片机P1口的P1.1、P1.2、P1.3;编码器输出片优先编码输出端GS作为_中断请求信号与单片机的img相中有一个产生中断申请信号(低电平有效)时,与其对应的编码便输出到P1.1~P1.3线上,且通过GS(连到单片机外部中断1输入img连。当img引脚)向CPU申请中断。此时,若CPU开放中断,就可以响应外部中断源的中断申请,而由读入的P1.1~P1.3代码判断是哪个中断源发出申请的。根据74LS148的真值表可知,各外部中断源的优先级由低到高依次为img

图5-36 用74LS148扩展8个外中断的电路

为了使程序转向中断源的中断服务程序,可以编写汇编引导程序为:

注意,74LS148的编码输出没有锁存,所以img的中断申请信号的低电平应一直保持到CPU将74LS148提供的编码取出为止,否则会出现错误

上面给定的电路结构简单,但该电路无法实现中断嵌套,即当一个中断请求正在被执行时,单片机不能再响应img中的中断请求。

5.采用可编程中断控制器扩展外部中断源

对中断源的扩展,可以采用并行输入接口结合软件查询方式来实现,但这种方法需要在中断服务程序中通过并行输入接口将各个扩展外部中断源申请中断的状态读入内部寄存器,以便查询确定该次中断是由哪个扩展外部中断源申请而引起,从而转到为该中断源服务的相应程序执行。此方法虽然硬件简单,软件也易于编写,但对各扩展外部中断源的优先级高低也是由查询顺序确定的,不容易改变外部中断的优先级别。为了解决这个缺点,可以采用8259A可编程中断控制器接口实现对MCS-51单片机外部中断源扩展的方法。

可编程中断控制器8259A具有扩展和管理外部中断功能,1片8259A能管理8级硬件中断,并且在基本不增加任何硬件电路的情况下,用9片8259A组成64级主从式中断系统。由于8259A是可编程的,所以使用起来非常灵活,可以通过编程使8259A工作在不同的方式。

利用8259A实现扩展MCS51单片机中断接口的方法可以有效地增加中断请求源,而且8259A工作在级联方式可控制64级中断请求,用户可通过动态地选择或重置其不同的工作方式以适应不同的应用条件的需要。

8259A的功能比较多,控制字也比较复杂,这给初学者学习带来了一定的难度,本书不做详细介绍了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈