#
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,
&regs,
&regs)
}
上例通过DOS中断15H的86H功能来实现延时,延迟时间以微秒为单位,因此,上述延时程序认为你可能要使用一个非常大的数字,于是它分别用CX和DX寄存器来接受延时值的高16位和低16位。上述延时程序最多可以延时49.亿微妙---大约等于1.2小时。
上例假设延时值以微秒为单位,它把延时值乘以一百万,因此在命令行中可以输入以秒为单位的延时值。例如埋汪悄,“delay
10”命令将产生10秒的延时。
在单片机中,要延时程序尽量准确,可以:-延时循环尽量简单,尽量少开变量比如:
Delay(unsigned int uDelay) { while ( uDelay-- )}
-在主程序中用一个GPIO测试,如:
SetGPIOHigh()Delay(1000)SetGPIOLOW()
-用示波器测量该GPIO波形及频率
-调整Delay函数的调用值,大迹基可滚谨以用变量,在调试时实时修改变量值,找到延时1毫秒的值,把Delay函数改名为Delay1ms,之后调用这个函数完成精确延时
-其他的延时州慧函数也可以类似上述方法完成,但记住在调试和实际使用时要用同样的CPU主频。
-最精确的还是用定时器中断程序计时
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)