8085 中的时间延迟产生
在本节中,我们将学习如何使用 8085 程序生成时间延迟。延迟将用于模拟时钟、计数器或其他一些领域的不同位置。
当执行延迟子程序时,微处理器不会执行其他任务。对于延迟,我们使用指令执行时间。在循环中执行一些指令,从而产生延迟。有一些生成延迟的方法。这些方法如下所示。
使用 NOP 指令
使用 8 位寄存器作为计数器
使用 16 位寄存器对作为计数器。
使用 NOT 指令:
NOP 指令的主要用途之一是生成延迟。NOP 指令需要四个时钟脉冲来完成取指、解码和执行。如果 8085 MPU 工作在 6MHz 时钟频率下,则内部时钟频率为 3MHz。因此,我们可以很容易地确定每个时钟周期为 1/3 微秒。因此,NOP 将在 1/3 * 4 = 1.333µs 内执行。如果我们使用整个内存和 NOP 指令,则将执行 64K NOP 指令。然后总延迟将为 216 * 1.333µs = 87359.488µs,尽管时间并不大,但程序大小也很大。因此,这种类型的 NOP 指令可用于生成几毫秒的短时间延迟。
使用 8 位寄存器作为计数器:
计数器是另一种生成时间延迟的方法。在这种情况下,程序大小更小。因此,在这种方法中,我们可以在较小的空间内生成更多的时间延迟。以下程序将演示使用 8 位计数器的时间延迟。
MVI B,FFH LOOP: DCR B JNZ LOOP RET
这里,第一条指令将执行一次,它将花费 7 个 T 状态。DCR C 指令花费 4 个 T 状态。这将执行 255 (FF) 次。当 JNZ 指令跳转时,它将花费 10 个 T 状态(它跳转 254 次),否则它将花费 7 个 T 状态。RET 指令花费 10 个 T 状态。
7 + ((4*255) + (10*254)) + 7 + 10 = 3584。因此,时间延迟将为 3584 * 1/3µs = 1194.66µs。因此,当我们需要一些小的延迟时,我们可以使用此技术,并在 FF 的位置使用其他值。
此技术也可以使用一些嵌套循环来获得更大的延迟。以下代码显示了如何在一个循环中将一些延迟放入其他循环中。
MVI B,FFH L1: MVI C,FFH L2: DCR C JNZ L2 DCR B JNZ L1 RET
从此代码块中,如果我们计算延迟,它将大约为 305µs 延迟。它延长了延迟时间。
使用 16 位寄存器对作为计数器:
我们可以使用 16 位寄存器对来完成使用 8 位计数器的那种任务。使用这种方法可以生成更多的时间延迟。此方法可用于获得超过 0.5 秒的延迟。让我们来看一个例子。
程序 | 时间 (T 状态) |
---|---|
LXI B,FFFFH LOOP: DCX B MOV A,B ORA C JNZ LOOP RET | 10 6 4 4 10(跳转),7(跳过) 10 |
在上表中,我们放置了 T 状态。从该表中,如果我们计算时间延迟,它将是这样的
10 + (6 + 4 + 4 + 10) * 65535H – 3 + 10 = 17 + 24 * 65535H = 1572857。因此,时间延迟将为 1572857 * 1/3µs = 0.52428s。这里我们得到了大约 0.5 秒的延迟。
在不同的程序中,我们需要 1 秒的延迟。在这种情况下,此程序可以执行两次。我们可以调用 Delay 子程序两次,或者使用另一个外部循环来执行两次。