为什么51单片机中中断程序调用住程序中0.5秒的延时会在27秒后才恢复运行

程序要实现的功能是控制交通灯,住程序中p0口是倒计时显示,用7448译码,p1口是控制交通灯的亮灭,外部中断1是让两路口都红灯,三秒后恢复交通灯正常运行。但我这个一进入中断总是27秒后才恢复运行,查了很多资料,也没找到原因,高手帮帮忙
代码如下:
ORG 0000H
AJMP START
ORG 0013H
AJMP JQ
ORG 0100H

START:
MOV R0,#10
MOV R1,#5
SETB EA
SETB EX0
SETB EX1
SETB IT0
SETB IT1

L:
MOV A,R0
MOV R2,A
L1:MOV P2,#21H
MOV A,R2
ACALL BCD
MOV P0,A
ACALL DELAY
ACALL DELAY
DEC R2
CJNE R2,#4,L1

L2:MOV A,R2
ACALL BCD
MOV P0,A
MOV P2,#20H
ACALL DELAY
MOV P2,#22H
ACALL DELAY
DJNZ R2,L2

MOV A,R1
MOV R2,A

L3:MOV A,R2
ACALL BCD
MOV P0,A
MOV P2,#0CH
ACALL DELAY
ACALL DELAY
DEC R2
CJNE R2,#4,L3

L4:MOV A,R2
ACALL BCD
MOV P0,A
MOV P2,#04H
ACALL DELAY
MOV P2,#14H
ACALL DELAY
DJNZ R2,L4
AJMP L

BCD:
MOV B,#10
MOV A,R2
DIV AB
SWAP A
ORL A,B
RET

DELAY:MOV R5,#5
D2:MOV R6,#200
D1:MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET

JQ:
MOV P2,#24H
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY

RETI
END
虽然提出问题后我用c编了个新程序实现了想要的功能,但还是非常感谢你,看了你博客中很多给解决的答案,能看出你是个既有才能,又十分热心的人,很值得钦佩。刚开始我也想到了这个问题,但想想中断程序没用到寄存器(c思想作祟,把延时理解成子函数了,随便调用就行不用管别的,忽略了延时也用到了寄存器),所以也没换工作寄存器组,现在看到答案,终于明白我错在哪里了,我以后一定认真学习,希望成为像你一样软硬件都精通的强人。

一进入中断总是27秒后才恢复运行,...
----
中断程序 和 主程序,共用了同一个延时程序,互相干扰,造成混乱。
可以换一个工作区,方法如下:
JQ:
PUSH PSW
SETB RS1 ;换区.
MOV P2,#24H
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
POP PSW ;恢复原区
RETI
温馨提示:答案为网友推荐,仅供参考