单片机子程序只能调用一次

来源:百度知道 编辑:UC知道 时间:2024/06/04 14:47:26
如题,我用的是at89s52,子程序只能调用一次,不能调用第二次了,子程序末尾也加了ret,我写的也不是中断子序,只是一般的延时子程序,只用了几个djnz和行号,行号之间没有冲突,编译链接全都正常没有错误,但是烧进单片机后就只能调用一次,单片机没有问题,换了好几片都是一样。,请问为什么只能调用一次,再调用的时候就不行了?
我的程序是这样写的:在第一段延时调用中设置一个接在p2.2处的led亮一秒左右,即子程序延时一秒,p2.2亮一秒,用来测试程序是否调用了;第二段没设p2.2处的led亮,led灭;第三段使led亮,一次这样下去。最后执行结果是led只亮了一秒,后面就不亮了。后来在每段延时中用clr获setb其他的p2口,用万用表侧电压发现第二段延时程序根本没执行。就是这样确定的,我觉得这样应该能确定程序执行到什么地方卡住了,但是结果很奇怪,请教高手是我的测试方法不对还是单片机其他的什么问题。

setb和clr之间是否留有足够的时间?单片机运行是很快的,除非用示波器,一般的万用表很难测出那么快的时间变化,所以接个LED更明显。
如果方便的话还是把程序贴上来吧,光说不是很直观。

把你的程序写上来看看

你的程序结构应该如下
MOV SP,#60H ;将SP推向高地址
LOOP:
SETB P2.2
LCALL DELAY1S
CLR P2.2
LCALL DELAY1S
AJMP LOOP

DELAY1S:
.........
RET
注意堆栈的初始化,MOV SP,#60H

用用单步调试,先用软件仿真,程序不是一次烧录就行的。