51单片机在 外部中断服务程序中调用 延迟程序,出现死循环

大虾好,最近在用单片机做毕业设计,下面程序的意思是,外部中断一旦被触发,p1.3上连的小灯就亮下,然后就灭。 程序如下ORG 00H
LJMP MAIN
ORG 03H
LJMP E_0;外部中断0
ORG 0030H
MAIN: SETB P1.3
SETB EA; 打开中断允许
SETB EX0; 打开外部中断允许位
HERE: AJMP HERE
E_0:
CLR P1.3
CALL DELAY
SETB P1.3
RETI

DELAY: MOV R3,#240;
D1: MOV R4,#20
D2: MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
RET
END
可是为什么在中断服务程序中加入 CALL DELAY 就会出现死循环。 去掉这段代码就正常了? 如果要改,该怎么改呢。 谢谢啦!

首先我要告诉你,你的程序没有死循环,而且程序思路没有多少问题。
我把你的代码原封不动的试验了一遍,你的延时程序是对的,过了一定时间它能返回。

1.你用的是多少频率的晶振?如果是11.0592MHz,就是2.6秒,;如果是32.768KHz(注意K和M的区别),就是878秒。延时程序循环多少遍跟晶振频率很有关系的。

2.你是用实际电路测试的吗?如果你用电路测试的话,你有没有按着外中断上的按钮不放?按着按钮不放的话,则你的程序中断返回后,又立刻被触发了中断,看上去就跟没灭过一样。
解决方法:中断初始化部分加入SETB IT0(下降沿触发模式),可以让中断只响应一次。

3.你用软件测试过吗?延时程序用软件测试很方便。
方法(我用的是Keil Uv3):右键左侧的树状图最上面的Target文件夹,然后选“为目标...设置选项”(Options for...)。在页面上方设置晶振频率(注意单位MHz)。然后点击“调试(Debug)”选项卡,选左边的调试器,注意去掉“根据真实时间控制速度(Limit speed to realtime)”的勾。(为什么?你总不想等一年才知道这个程序要运行一年吧!)
设置完毕,点击菜单中的调试→启动/停止调试。这个菜单栏有很多功能,但有一个功能不在这里。当你进入延时程序时,右键延时程序末端,有一个“运行到光标行(Run to cursor line)”,点击后就直接运行到你点的这一行,右下的状态栏里会显示延时的时间。

我要讲的就这些了,希望能够帮到你。如果程序还有问题,你可以描述得更清楚些继续问。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-24
DELAY: MOV R3,#240;
D1: MOV R4,#20
D2: MOV R5,#248
D3: DJNZ R5,D3
DJNZ R4,D2
DJNZ R3,D1
RET
END本回答被网友采纳
第2个回答  2011-02-27
强势围观
相似回答