您的位置: 网站首页 > 电子与嵌入式 > 单片机原理与应用 > 第6章 中断系统 > 【6.3 中断程序应用举例】

6.3 中断程序应用举例

 

6.3  中断程序应用举例

【例6-1】 利用定时器作外部中断源。

解:MCS-51单片机有两个定时器/计数器,当它们选择计数工作方式时,T0或T1引脚上的负跳变将使T0或T1计数器加“1”计数,故若把定时器/计数器设置成计数工作方式,计数初始设定为满量程,一旦外部从计数引脚输入一个负跳变信号,计数器T0或T1加“1”产生溢出中断,这样便可把外部计数输入端T0(P3.4)或T1(P3.5)扩充作为外部中断源输入。

例如,将T1设置为工作方式2(自动恢复常数)及外部计数方式,计数器TH1、TL1初值设置为0FFH。当计数输入端T1(P3.5)发生一次负跳变,计数器加“1”并产生溢出标志,向CPU申请中断,中断处理程序使累加器A内容加“1”,送P1口输出,然后返回主程序。编程如下:

ORG     0000H               ;用户程序首址

AJMP        MAIN         ;转主程序

ORG     00lBH

AJMP        INTS         ;转中断服务程序

MAIN:   MOV         SP,#60H          ;堆栈指针赋初值

MOV         TMOD,#60H       ;T1方式2,计数

MOV         TL1,#0FFH        ;送常数

MOV   TH1,#0FFH

SETB    TR1                   ;启动Tl计数

SETB    ET1                   ;允许T1中断

SETB    EA                ;CPU开中断

LOOP:   SJMP    LOOP             ;等待

INTS:   INC         A                ;T1中断处理程序

         MOV         P1,A

RETI                    ;中断返回

【例6-2】 图6-5为多个故障显示电路。当系统无故障时,4个故障源输入端X1~X4全为低电平,显示灯全灭;当某部分出现故障,其对应的输入由低电平变为高电平,从而引起MCS-51单片机中断,中断服务程序的任务是判定故障源,并用对应的发光二极管LED1~LED4进行显示。

图6-5  利用中断对多个故障进行显示

解:编程如下。

ORG         0000H

AJMP    MAIN

ORG         0003H

AJMP    SERVE

MAIN:   ORL         P1,#0FFH    ;灯全灭,准备读入

SETB    IT0         ;选择边沿方式

SETB    EX0         ;允许INT0中断

SETB    EA          ;CPU开中断

AJMP    $           ;等待中断

SERVE:  JNB         P1.3,L1     ;若X1有故障

CLR         P1.4        ;LED1亮

L1:     JNB     P1.2,L2     ;若X2有故障

CLR         P1.5        ;LED2亮

L2:     JNB     P1.1,L3     ;若X3有故障

CLR         P1.6        ;LED3亮

L3:     JNB     P1.0,L4     ;若X4有故障

CLR         P1.7        ;LED4亮

L4:     RETI

下面给出一个应用定时器中断的实例。要求编制一段程序,使P1.0端口线上输出周期为2 ms的方波脉冲。设单片机晶振频率为6 MHz。

方法:利用定时器T0作1ms定时,达到定时值后引起中断。在中断服务程序中,使P1.0的状态取一次反,并再次定时1ms。

机器周期显然为2ms,所以定时1ms所需的机器周期个数为500,亦即01F4H。设T0为工作方式1(16位方式),则定时初值是01F4H,求补等于0FE0CH。

程序如下:

ORG     0000H

AJMP    START

ORG     000BH

AJMP    IST0            ;转入T0中断服务程序入口地址IST0

MOV         TMOD,#01H       ;T0为定时器状态,工作方式1

MOV         TL0,#0CH        ;T0的低位定时初值

MOV         TH0,#0FEH       ;T0的高位定时初值

MOV         TCON,#10H       ;打开T0

SETB    ET0             ;允许T0中断

SETB    EA              ;允许中断

AJMP    $               ;动态暂停

IST0:  MOV         TL0,#0CH        ;重置定时器初值

MOV     TH0,#0FEH       ;重置定时器初值

CPL         P1.0            ;P1.0取反

RETI                    ;中断返回

6.4  练  习  题

(1)编写出外部中断1为跳沿触发的中断初始化程序。

(2)中断服务子程序返回指令RETI和普通子程序返回指令RET有什么区别?

(3)某系统有3个外部中断源1、2、3,当某一中断源变为低电平时,便要求CPU进行处理,它们的优先处理次序由高到低依次为3、2、1,中断处理程序的入口地址分别为1000H、1100H、1200H。试编写主程序及中断服务程序(转至相应的中断处理程序的入口即可)。