汇编语言延时程序问题

汇编语言延时程序问题,第1张

延时方法很多,用定时/计数比较方便也比较精确。如果用软件延时,则可以用循环(多重、嵌套都行)。根据时间长短确定循环次数,力求精确。时间计算以机器的晶振频率为基准,算出各指令的运行时间(每条指令运行时间乘所循环的次数就是该指令的全部运行时间),所有指令运行时间的和就是延时的时间。

比如:设晶振频率为12MHz 则每机器周期为1us

513us延时程序为

DL513: MOV R7,#0FFH ;1us

DJNZ R7,$;2us *255=510us

RET ;2us

延时时间为1+510+2=513us

延时时间较长则可以用多重循环(以四重循环为例),如:

KKKK0:MOV R2,#XX ;1us

KKKK1:MOV R3,#LL ;1us*XX

KKKK2:MOV R4,#NN ;1us*XX*LL

KKKK3:MOV R5,#MM ;1us*XX*LL*NN

DJNZ R5,$ ;2us *XX*LL*NN*MM

DJNZ R4,KKKK3 ;2us *XX*LL*NN

DJNZ R3,KKKK2 ;2us *XX*LL

DJNZ R2,KKKK1 ;2us *XX

RET ;2us

延时时间为1us+1us*XX+1us*XX*LL+1us*XX*LL*NN+2us *XX*LL*NN*MM+2us *XX*LL*NN+2us *XX*LL+2us *XX+2us

适当确定四个循环次数XX、LL、NN、MM就能得到准确的延时时间。

在单片机中,要延时程序尽量准确,可以:

-延时循环尽量简单,尽量少开变量比如:

Delay(unsigned int uDelay) { while ( uDelay-- )}

-在主程序中用一个GPIO测试,如:

SetGPIOHigh()Delay(1000)SetGPIOLOW()

-用示波器测量该GPIO波形及频率

-调整Delay函数的调用值,可以用变量,在调试时实时修改变量值,找到延时1毫秒的值,把Delay函数改名为Delay1ms,之后调用这个函数完成精确延时

-其他的延时函数也可以类似上述方法完成,但记住在调试和实际使用时要用同样的CPU主频。

-最精确的还是用定时器中断程序计时

Java中主要有两种方法来实现延迟,即:Thread和Timer

1、普通延时用Thread.sleep(int)方法,这很简单。它将当前线程挂起指定的毫秒数。如

try

{

Thread.currentThread().sleep(1000)//毫秒

}

catch(Exception e){}

在这里需要解释一下线程沉睡的时间。sleep()方法并不能够让程序"严格"的沉睡指定的时间。例如当使用5000作为sleep()方法的参数时,线 程可能在实际被挂起5000.001毫秒后才会继续运行。当然,对于一般的应用程序来说,sleep()方法对时间控制的精度足够了。

2、但是如果要使用精确延时,最好使用Timer类:

Timer timer=new Timer()//实例化Timer类

timer.schedule(new TimerTask(){

public void run(){

System.out.println("退出")

this.cancel()}},500)//五百毫秒

这种延时比sleep精确。上述延时方法只运行一次,如果需要运行多次, 使用timer.schedule(new MyTask(), 1000, 2000)则每间隔2秒执行MyTask()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7854926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存