我需要为 8051 编写延迟代码。我可以这样做,但我不知道如何计算延迟的频率。例如,这是我做的延迟:
DELAY: MOV R2, 0FFH
D2: NOP
NOP
DJNZ R2, DELAY
RET
但我不知道这个延迟会产生多少赫兹的频率。有什么方法可以计算吗?
我需要为 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 毫秒延迟。