汇编语言延时程序怎么解释?

汇编语言延时程序怎么解释?,第1张

编码程序的一种变式。

CPU在执行语句的时候也是需要耗时的,只是CPU运行速度太快,我们没办法看清楚,所以如果CPU执行语句越多,所需要的时间就越多,根据这个原理,就可以通过让CPU随便执行语句,起到延时的效果,这被称为“软件延时”,CPU执行一条指令耗时近似1us,就可以通过这种办法加上循环就可以实现延时效果。

程序在不同主频下延时不一样,但这里面一定是个比例关系。打个比方,你的代码是在主频为1GHz下的延时,这个参数你延时是5S。但换到2GHZ下,程序不改动的话,延时是2.5秒。

在汇编代码中获取到当前的主频,那么就可以做成自适应的效果,自动按比例改变延时程序内部的计数量。

若是高级语言,比如VS,就能用GetTickCount()来精确延时5s了。其实只要能读出当前时间的精确值,比如直接读BIOS时间,那么就能实现比较精确的5s延时了。不同的CPU在读精确时间的函数上是一样的。

DELAY:MOV

R7,#200

;1us

DELAY1:DJNC

R7,DELAY1

;2us

RET

;2us

T=1+200*2+2=4003us,如果200改为199会更接近些,调整循环次数就能调整延时精度。

DEL:MOV

R7,#10;1us

DEL1:MOV

R6,#104

;1us

DEL2:DJNC

R6,DEL2

;2us

DJNC

R7,DEL1

;2us

RET

;2us

T=1+10*1+10*104*2+10*2+2=2113us,如果104改为99会更接近些。

(1)你的两个延时程序都对。

(2)延时不超过513us的延时程序这应该是最简单的方法了。

(3)其中#200,#10,#104不是随便设的,不能大过255,同时也要尽可能满足精度要求。

你的时间算法是对的。

还想请问一下2113和2200是否允许要看你的系统精度来定,一般不说,你这里将近10%的误差是比较大的。

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

比如:设晶振频率为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就能得到准确的延时时间。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存