
R0,
LOOP指令后缺少一条令指令计数器PC不变的指令,如SJMP
$.
若不加该指令,会在程序循环5次(R0=5)后,即执行5次DJNZ
R0,
LOOP指令后,会再次进入延时程序(不是通过调用指令进入的),即此时SP的内容仍是07H;当延时程序执行RET时,会将07H单元的内容送到程序计数器PC中,SP的内容变为05H,此时程序将会从头开始执行,开始第2个5次循环。
在程序执行完第2个5次循环后,即执行10次DJNZ
R0,
LOOP指令后,会又次进入延时程序(不是通过调用指令进入的),即此时SP的内容仍是05H;当延时程序执行RET时,会将05H单元的内容送到程序计数器PC中,SP的内容变为03H,此时程序又会从头开始执行。
但此时从头开始执行的过程与前两个区别很大了。但执行第3条指令(调用指令)后进入延时程序,延时程序会把刚才压入堆栈中的断点覆盖掉,当执行完DJNZ
R3,
D1时,堆栈栈顶的内容变为0,执行完RET,程序又会从头开始执行,重环往复。从外观上看,P2一直为FFH,好像程序停止运行。
所以分析出现该现象,要注意堆栈。单步执行,好好观察。
哥实在不知道你说的是什么意思。我就按我想的写吧
好久都没有写51了,原谅里面的一些小错误,你自己再动动脑就行了!希望能帮到你,以后互相交流
#include<reg52.h>
void init()
{
TMOD=0x01
TH0=(65536-50000)/256
TL0=(65536-50000)%256
EA=1
ET0=1
TR0=1
}
void main()
{
Init()
while(1)
{
if(aa==20)//当延时一秒时,进入程序
{
P1^1=1 //自己随便接个灯,灯亮
aa=0 //清0
TR0=1 //重新打开定时器
}
}
}
void timer0() interrupt 1//这是中断程序,延时50毫秒,
{
TH0=(65536-50000)/256
TL0=(65536-50000)%256
aa++
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)