ORG 1000H
DEL: MOV R7,#20; 单周期1s ①这里没有循环,1T
DEL1:MOV R6,#125; 单周期1s ②这里循环20次,20T
DEL2:DJNZ R6,DEL2; 双周期2s ③这里循环20*125次,1000T
DJNZ R7,DEL1; 双周期2s ④这里循环20次,40T
RET; 单周期1s ⑤这里没有循环,1T
总共延时周期数=①+②+③+④+⑤=1062T
12M晶振时1T=1us,所以总延时时间=1062微妙=1.062毫秒
给楼上的推荐答案修正一下:
ORG 1000H
DEL: MOV R7,#20; 单周期1uS ( 晶振为12MHz)
DEL1:MOV R6,#125; 单周期1uS
DEL2:DJNZ R6,DEL2; 双周期2uS*125=250uS
DJNZ R7,DEL1; 双周期(2us+250+1)*20=5060uS
RET; 不是单周期指令 应该是 双周期2uS
延时时间t=1uS +(1us+250uS)×20+20×2uS+2uS=5063uS=5.063ms
ORG 1000H
DEL: MOV R7,#20; 单周期1uS ( 晶振为12MHz)
DEL1:MOV R6,#125; 单周期1uS
DEL2:DJNZ R6,DEL2; 双周期2uS*125=250uS
DJNZ R7,DEL1; 双周期(2us+250+1)*20=5060uS
RET; 单周期1s = 5.06 mS
DEL: MOV R7, #20 ;1T
DEL1: MOV R6, #125 ;1T
DEL2: DJNZ R6, DEL2 ;2T 125 * 2 = 250
DJNZ R7, DEL1 ;2T 20 * (1 + 250 + 2) = 5060
RET ;2T 1 + 5060 + 2 = 5063
加上调用指令,共用 5065 T。
20*125*2=5000 us=5 ms
如果精确的话应该是 5.022 ms ,其中2us是执行org 和del的时间,20us是执行20次del1的时间。