51单片机 外部中断(汇编语言)问题

刚学到外部中断这一块儿,书上说实现中断要开总中断EA,外外部中断,然后设置外部中断的触发方式
比如一般要有这三句:
SETB EA ;开总中断
SETB EX0 ;开INT0中断
CLR IT0 ; 设置INT0为电平触发
但是书上一个例子的代码中却没有这样的设置。。。
这是为什么?

该例子完整代码如下:

ORG 0000H
LJMP START
ORG 0003H
LJMP INT_0
ORG 0100H

;主函数体,流水灯0到7依次点亮
;然后7到0依次点亮,每次点亮延时一秒
START: MOV A,#00H
MOV R0,#8
SETB C
;P1.0到P1.7的二极管依次点亮
LOOP1: RLC A
MOV P1,A
ACALL DELAY
DJNZ R0,LOOP1
MOV A,#00H
MOV R0,#8
SETB C

;P1.7到P1.0的二极管依次点亮
LOOP2: RRC A
MOV P1,A
ACALL DELAY
DJNZ R0,LOOP2
AJMP START

;延时1秒子程序
DELAY: MOV R5,#200
D1: MOV R6,#20
D2: MOV R7,#123
NOP
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET

;中断子程序
INT_0: PUSH PSW
PUSH ACC
MOV A,#00H
MOV R2,#6
L4: MOV P1,A
LCALL DELAY
CPL A
DJNZ R2,L4
POP ACC
POP PSW
RETI

END
我的问题不在于这段代码执行的功能,我只是不明白为什么没有设置关于总中断(EA)和相关外部中断(EX0)的语句

主程序是:流水灯0到7依次点亮、流水灯7到0依次点亮,反复循环。
外部中断程序是:灯全亮、全灭3次。
但是,程序没有开中断的指令,中断程序是不会执行的。
START: ;在下面添加:
SETB EA ;开总中断.
SETB EX0 ;开INT0中断.
CLR IT0 ; 设置INT0为电平触发.
MOV A,#00H
……
外部中断就可以实现了。追问

就是说,书上的代码有错误?

追答

有可能的。
缺少了这两行:
SETB EA ;开总中断.
SETB EX0 ;开INT0中断.
中断处理程序,肯定是不会执行的。
当然,使用字节传送指令,也可开中断:
MOV IE, #81H ;开总中断 同时 开INT0中断.
这一行,楼主给出的程序里面,也没有,所以,中断,就不可能发生。

追问

51有外部中断0,外部中断1,定时计数器中断0,定时计数器中断1,以及串行发送接收中断这五个中断,是不是要使用其中任何一个中断,都需要编程者主动先开总中断EA,然后开具体相应的中断?没有默认开的中断?

追答

默认,中断都是关闭的。
程序中需要使用中断,都必须由编程者主动打开。
先开总中断EA,然后开具体相应的中断?--次序,不重要,可说是无所谓。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-08
程序不完整,51复位后默认是关闭中断的,不打开中断则不会进入中断服务程序
第2个回答  2011-05-08
不要太相信书上是知识,我在很多是书上都看见过错误。
SETB EA ;开总中断
SETB EX0 ;开INT0中断
是必须有的,没有不能中断。
第3个回答  2011-05-07
你在去看看书上,EA这位是在那个寄存器里面的,别忘了单片机的寻址方式,有的时候有些位的默认状态,和寄存器的默认状态,这些都很重要。
第4个回答  2011-05-07
LJMP INT_0

INT—0 里面应该就有你要的东西 一般是初始化程序
相似回答