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
如果是用汇编语言的话,是可以做到精准延时的。当然首先要有一个精准的时钟,也即是晶振要准确,比如使用精准的12M晶振12T模式的51单片机延时1毫秒,程序如下:DELAY1MS:
MOV R3,#249 1
DJNZ R3,$ 2*249
MOV R3,#249 1
DJNZ R3,$ 2*249
RET 2
延时时间为:1+2*249+1+2*249+2=1000T,这里使用12M晶振,T=1微秒,所以总共延时1000微秒也即是1毫秒。如果要延时更多时间,可以采用循环方式来实现。当然在计算延时时间时要考虑到使用的单片机类型和型号,比如STC89C51是6T,DS80320是4T,STC12C5A60S2是12T,这些因数一定要考虑进去才行。
首先明确机器执行一条指令耗时大概是1us那么延时10ms的程序如下:MOV AX,50L1:MOV BX,100L2:DEC BX JNZ L2DEC AXJNZ L1执行完之后时间大约为10ms多一点
根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。
具体步骤如下:/导致这种情况的原因主要是……
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)