我需要为8051编码一个延迟。我可以这么做,但我不知道如何计算延迟的频率。例如,我做了一个延迟:
DELAY: MOV R2, 0FFH
D2: NOP
NOP
DJNZ R2, DELAY
RET
但我不知道这个延迟会产生多少赫兹的频率。有什么计算方法吗?
您需要知道每条指令需要多少周期,以及处理器的速度。
一般来说,如果你的处理器是1MHz,NOP需要2个周期,DJNZ需要3个周期(把所有这些都加起来,不知道8051需要多少个周期),那么从D2开始的第一次循环将是7个周期(2+2+3=7),对于1MHz的处理器,每个周期是1微秒,因此需要7µs,冲洗并重复,直到达到你想要的延迟。
注意,您可能不希望DJNZ跳转到DELAY,但D2。对8051真的不熟悉,但这只是猜测。
另外,不要忘记将MOV和RET指令相加。
一个简单的延迟例程,带有用于理解的注释
delay_1_ms: ;calling this routine take 2 mc ;tmc=2
MOV R7,#250 ;mov rn,#data take 1 mc(machine cycle);tmc=2+1
DJNZ R7,$ ;djnz take 2mc for each time exicuted;tmc=3+(2*250)
MOV R7,#247 ;mov rn,#data take 1 mc ;tmc=503+1
DJNZ R7,$ ;djnz take 2mc for each time exicuted.;tmc=504+(247*2)
RET ;ret takes 2mc so total machine cycle=998+2=1000mc
如果12mhz晶体的一个机器周期是1微秒,那么这个程序需要1000×1微秒=1毫秒的延迟。