编码程序的一种变式。
CPU在执行语句的时候也是需要耗时的,只是CPU运行速度太快,我们没办法看清楚,所以如果CPU执行语句越多,所需要的时间就越多,根据这个原理,就可以通过让CPU随便执行语句,起到延时的效果,这被称为“软件延时”,CPU执行一条指令耗时近似1us,就可以通过这种办法加上循环就可以实现延时效果。
程序在不同主频下延时不一样,但这里面一定是个比例关系。打个比方,你的代码是在主频为1GHz下的延时,这个参数你延时是5S。但换到2GHZ下,程序不改动的话,延时是2.5秒。
在汇编代码中获取到当前的主频,那么就可以做成自适应的效果,自动按比例改变延时程序内部的计数量。
若是高级语言,比如VS,就能用GetTickCount()来精确延时5s了。其实只要能读出当前时间的精确值,比如直接读BIOS时间,那么就能实现比较精确的5s延时了。不同的CPU在读精确时间的函数上是一样的。
用定时器T0来完成那么我令T0的溢出时间为200us
那么T0的初值为56
1(s)=200*250*2(us)
下面是程序
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP CTC0
ORG 100H
MIAN:
MOV SP,#5FH
MOV R7,#250软件计数第一级
MOV R6,#2软件计数第二级
MOV TL0,#56送初值
MOV TH0,#56
ANL TOMD,#0F0HTOMD高4位不变,T1工作方式不
变
ORL TMOD,#02H定义T0工作方式
SETB ET0
SETB TR0
SJMP $
CTC0:
PUSH PSW保护PSW
DJNZ R7, EXIT软件计数
MOV R7,#250 重装初值,下同
DJNZ R6,EXIT
MOV R6,#2
EXIT:
POP PSW
RETI
延时1s计算方法是将所有指令执行时间相加得出的。比如:dly1s:
mov
r2,#10
1
dly1:
mov
r3,#200
1*10
dly2:
mov
r4,#248
1*200*10
djnz
r4,$
2*248*200*10
djnz
r3,dly2
2*200*10
djnz
r2,dly1
2*10
ret
2
total=1+10+2000+992000+4000+20+2=998033
如果使用12m晶振,那么延时时间为0.998秒。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)