void
delay1ms(void)
{
unsigned
char
i,j
for(i=0i<10i++)
for(j=0j<33j++)
}
具体算法是//(3j+2)*i=(3×33+2)×10=1010(us),但精确度不高,如果想准确点可以调节相应的参数用示波器来实
现,上面的函数适用于程序简单,对时间性要求不高,如:点led灯,单个按键 *** 作等等。
2,就是用定时器中断里面设定标志位来产生延时的方法,比如你可以把定时器设定洞扒为每1ms进一次中断,在中断里面
把一个标志位(如flag)置一
当你需要1ms延时的时候你可以先初始化定时器,然乎颤乎后查询标志位是否置一,置一则执行if后面的语句,即if(fla{}
当你需要10ms延时时,你可以把flag设置为uchar,中断里面flag++外面查询用if(10==flag){}
以此类推,上面的岁悉方法精确度高适用地方。
LOOP实现延时与CUP主频有关,这样写的程序到别的机稿弊子上运行很可能不正确,因为腊谨每个机子的主频很可能就不一样,写个与CPU无关的延迟程序,希望对你有帮助:WAITP PROC
PUSH AX
XOR AX,AX
LOOP1: IN AL,61H
AND AL,10H
CMP AL,AH
JE LOOP1
MOV AH,AL
LOOP LOOP1
POP AX
RET
WAITP ENDP
这个程序有一个参数cx,调用之前须将它设置成15.08微秒的倍数,轮敬基假如要延迟0.5秒,那么cx就应该是33144(0.5s/15.08us=33144)如果要延迟2秒呢,很简单可以连续调用4次延迟0.5秒的程序,如:
mov bl,4
loop2:mov cx,33144
call WAITP
dec bl
jnz loop2
其它延迟时间可以照上面例子类推
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)