请高手帮忙,51单片机执行定时器0的中断程序后,需要大约15秒才能返回主程序断点处继续运行? 太奇怪了?

请高手帮忙看看这段小程序,51单片机响应定时器0的中断程序后,需要大约15秒才能返回主程序断点处继续运行? 太奇怪了?这是什么原因? 用仿真器仿真也是这样的结果,肯定不是芯片的问题,我换了块新的芯片仍然有这种现象。请各位高手指点,谢谢大家。
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP D0
ORG 0030H
MAIN:
CLR P0.0;
MOV TMOD,#00000000B
MOV TH0,#0FFH
MOV TL0,#0FBH
SETB EA
SETB ET0
SETB TR0
LCALL DELAYTIME
CLR P1.0
LCALL DELAYTIME
SETB P1.0
LCALL DELAYTIME
CLR P1.0
LCALL DELAYTIME
SETB P1.0
CLR P1.3
SJMP $

D0:
CLR TR0
CLR P1.5
LCALL DELAYTIME
SETB P1.5
LCALL DELAYTIME
CLR P1.5
LCALL DELAYTIME
SETB P1.5
CLR P1.7
RETI

DELAYTIME:
MOV R0,#3
DELAYTIME1:
MOV R1,#0
DELAYTIME2:
MOV R2,#0
DJNZ R2,$
DJNZ R1,DELAYTIME2
DJNZ R0,DELAYTIME1
RET
END
又精确测试了一下,中断返回需要大约36秒才能返回到主程序继续运行,远远超出之前估计的15秒,我就是不理解,为什么中断返回需要这么长的时间,按理说应该很短暂的(应该就是几个机器周期而已啊)?

我懂了,经过我的仿真,当程序第一次进入DELAYTIME时,执行到R0=03,R0=00,R2=F0时,T0中断到了,这时中断程序调用了DELAYTIME,当执行完中断服务程序,这是R0变成了0,返回到之前的延时函数,此时R0=0,R1=0,R2=0,所以你的延时程序就变成了256*256*256=16秒了,所以成了你说的15秒后才执行完。 所以以后写中断程序注意断点的保护,把中断程序里有修改掉的寄存器先压栈保护,结束之前弹出来,这样就没事了。还有你在中断程序结束前没重新开启T0。还有在你的程序最好多点注释,这样看着不吃力。追问

非常感谢,朋友!

请问朋友,您使用的是什么仿真器?

我的仿真器是硕飞的,无法仿真到这种程度,感觉我的这个仿真器不怎么好用,跟踪仿真的时侯无法检测到定时器0中断。

追答

我用的是Proteus 仿真软件。要跟踪中断程序,你得在中断程序入口设一个断点,然后点全速运行,这样才会进入中断程序,否则单步执行是进不去中断的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-18
不是几个周期,你在服务程序中有3个延时子程序调用,每一个延时如果是12M晶振的话,大约390毫秒,所以返回时间理论上约1.2秒左右。本回答被网友采纳
第2个回答  2012-02-09
汇编我有好几年没看,看到生疏,或许看错了,
你的主程序运行完了就等待了,你怎么检测它返回主程序了,你在等待这里做异个信号出来(可以把中段中的P1.7置0以后延时一下,在主程序等待这里他把重新置1看看)
看P1.7下降沿,到上升沿的时候历时多久
第3个回答  2012-02-09
不明白定时中断子程序里为什么要关掉TR0,关掉下次就进不去了。
D0:
CLR TR0 ;????????????
...