
你先看下这段延时程序:
采用12M晶振,用51芯片处理。
DELAY: MOV R7,#250;
D1:MOV R6,#250;
D2:DJNZ R6 ,D2;
DJNZ R7,D1;
RET
以上是一段延时0125秒的程序。
它计算的原理是:
这段程序最终执行了250250次,而DJNZ指令执行需要2个机器周期,一个机器周期需要1微秒的时间,所以以上延时程序就是2502502=0125秒。
你的程序原理跟这个应该是一样的~
我们这些程序员很幸运,因为Microsoft公司的专家认为建立一个独立于硬件的延时器是一个好主意。显然,这样做的目的在于,无论程序运行在什么速度的计算机上,都可产生一段固定的延迟时间。下面的程序说明了如何在DOS中建立一个延时器:
#
include
<stdio
h>
#
include
%dos
h>
#
include
<stdlib
h>
void
main(int
argc,char
argv)
{
union
REGS
regs:
unsiged
long
delay;
delay
=
atoI(argv[1])
;
/
assume
that
there
is
an
argument
/
/
multiply
by
1
for
microsecond-granularity
delay
/
/
multiply
by
1000
for
millisecond-granularity
delay
/
/
multiply
by
1000000
for
second-granularity
delay
/
delay
=1000000;
regs
x
ax
=
0x8600
;
regs
x
cx=
(unsigned
int
)((delay
&
0xFFFF0000L)>>16)
;
regs
x
dx
=
(unsigned
int
)
(delay
&
0xFFFF)
int86
(0x15,
®s,
®s)
;
}
上例通过DOS中断15H的86H功能来实现延时,延迟时间以微秒为单位,因此,上述延时程序认为你可能要使用一个非常大的数字,于是它分别用CX和DX寄存器来接受延时值的高16位和低16位。上述延时程序最多可以延时49.亿微妙---大约等于12小时。
上例假设延时值以微秒为单位,它把延时值乘以一百万,因此在命令行中可以输入以秒为单位的延时值。例如,“delay
10”命令将产生10秒的延时。
delay函数转换为汇编后是这样的
MOV Rn,#data 为1个周期
DJNZ Rn,rel为2个周期
总共为401个周期
如果按照12MHz晶振来算就是401us(包括调用时间为403us)
只是普通的延时
一般是用于一些低速总线上,从设备的通讯速率较低才采用延时的方法。
以上就是关于汇编延时程序全部的内容,包括:汇编延时程序、怎样在DOS程序中建立一个延时器(delay timer)、C51单片机延时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)