在本节中,我们将看到如何使用8085程序生成时间延迟。该延迟将在不同的地方使用,以模拟时钟,计数器或其他区域。
当执行延迟子例程时,微处理器不执行其他任务。对于延迟,我们使用指令执行时间。在循环中执行一些指令,会产生延迟。有一些产生延迟的方法。这些方法如下。
使用NOP指令
使用8位寄存器作为计数器
使用16位寄存器对作为计数器。
使用NOT指令:
NOP指令的主要用途之一是在延迟生成中。NOP指令需要四个时钟脉冲来进行读取,解码和执行。如果8085 MPU以6MHz时钟频率工作,则内部时钟频率为3MHz。因此,我们可以轻松地确定每个时钟周期为1/3微秒。因此,NOP将在1/3 * 4 = 1.333µs内执行。如果我们将整个存储器与NOP指令一起使用,则将执行64K NOP指令。这样,总的延迟将是2 16 * 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位寄存器对作为计数器:
除了使用8位计数器,我们还可以使用16位寄存器对来完成此类任务。使用这种方法可以产生更多的时间延迟。此方法可用于获取超过0.5秒的延迟。让我们来看一个例子。
程序 | 时间(T-状态) |
---|---|
LXI B,FFFFH 循环:DCX B MOV A,B ORA C JNZ循环 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.5s的延迟。
在不同的程序中,我们需要1s的延迟。在这种情况下,该程序可以执行两次。我们可以调用Delay子例程两次,也可以使用另一个外部循环执行两次。