编码程序的一种变式。
CPU在执行语句的时候也是需要耗时的,只是CPU运行速度太快,我们没办法看清楚,所以如果CPU执行语句越多,所需要的时间就越多,根据这个原理,就可以通过让CPU随便执行语句,起到延时的效果,这被称为“软件延时”,CPU执行一条指令耗时近似1us,就可以通过这种办法加上循环就可以实现延时效果。
程序在不同主频下延时不一样,但这里面一定是个比例关系。打个比方,你的代码是在主频为1GHz下的延时,这个参数你延时是5S。但换到2GHZ下,程序不改动的话,延时是2.5秒。
在汇编代码中获取到当前的主频,那么就可以做成自适应的效果,自动按比例改变延时程序内部的计数量。
若是高级语言,比如VS,就能用GetTickCount()来精确延时5s了。其实只要能读出当前时间的精确值,比如直接读BIOS时间,那么就能实现比较精确的5s延时了。不同的CPU在读精确时间的函数上是一样的。
DELAY:MOVR7,#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%的误差是比较大的。
1.循环延时的方法DELAY: 误差 0us
MOV R7,#25H
DL1:
MOV R6,#9AH
DL0:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
不过这不实用。40MS时间单片机都 在这里循环,不作能它事。
1.可以用定时中断的方法:
ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt
START:
MOV SP,#60H
LCALL InitTimer0
LOOP:
add your code here!
LJMP LOOP
InitTimer0:
MOV TMOD,#01H
MOV TH0,#63H
MOV TL0,#0C0H
SETB EA
SETB ET0
SETB TR0
RET
Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#63H
MOV TL0,#0C0H
========================
add your code here!
========================
POP ACC
POP DPL
POP DPH
RETI
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)