51 单片机中断返回为什么?

来源:百度知道 编辑:UC知道 时间:2024/06/08 20:19:58
我是初学的,用12M晶振在59S51中测试。P3.2接信号入。
这是我的一个红外线解码,在没入中断是P0.0会一秒两次地闪的,
但中断返回后总会延时差不多一分钟才会闪,但在这一分钟里是可
随时响应并进入中断,但返回后总会延时差不多一分钟才会闪。
请各位高手详细指教!!!

ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
ORG 0030H
MAIN: SETB EA
SETB IT0
SETB EX0
mov sp,#40h
kkj:cpl p0.0
lcall del
AJMP kkj
INT:CLR EA
push acc
push psw

MOV R6,#5
SB: ACALL YS1
JB P3.2,EXIT
DJNZ R6,SB
JNB P3.2,$
ACALL YS2
MOV R7,#16
JJJA: JNB P3.2,$
LCALL YS1
MOV C,P3.2
JNC UUUA
LCALL YS3
UUUA:DJNZ R7,JJJA

MOV R1,#1AH
MOV R2,#2
PP: MOV R3,#8
JJJJ: JNB P3.2,$
LCALL YS1
MOV C,P3.2
JNC UUU
LCALL YS3
UUU: MOV A ,@R1
RRC A
MOV @R1,A
DJNZ R3,JJJJ
INC R1
DJNZ R2,PP
MOV A,1AH
CPL A

你的程序,我大概看了下。并调试了下。
问题出在以下方面。

你的主程序用的了延时DEL,其中用到了R3,R4,R5,而中断程序中也用到了R4,两者相互影响,出现了你在提问中出现的问题。

修改方法:
1、在进入中断后,使用其他工作寄存器组,出中断再释放。
2、DEL延时使用其他工作寄存器。

以下程序,供你参考。
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT
ORG 0030H
MAIN: SETB EA
SETB IT0
SETB EX0
mov sp,#40h
kkj:cpl p0.0
lcall del
AJMP kkj
INT:CLR EA
push acc
push psw

SETB RS0

MOV R6,#5
SB: ACALL YS1
JB P3.2,EXIT
DJNZ R6,SB
JNB P3.2,$
ACALL YS2
MOV R7,#16
JJJA: JNB P3.2,$
LCALL YS1
MOV C,P3.2
JNC UUUA
LCALL YS3
UUUA:DJNZ R7,JJJA

MOV R1,#1AH
MOV R2,#2
PP: MOV R3,#8
JJJJ: JNB P3.2,$
LCALL YS1
MOV C,P3.2
JNC UUU
LCALL YS3
UUU: MOV A ,@R1
RRC A
MOV @R1,A
DJNZ R3,JJJJ
INC R1
DJNZ R2,PP
MOV A,1AH
CPL A

CJNE A,