
怎样用单片机的汇编语言编写一个50ms的延时程序。(晶振频率为12MHz)ps51单片机
书上给出的是DEL:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2DJNZR7,DEL1RET总延时为1μs+(1+250+2)μs*...
书上给出的是
DEL: MOV R7,#200
DEL1: MOV R6,#125
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
RET
总延时为1μs+(1+250+2)μs*200+2μs=50.603ms
求大神给出一个精确的编程,使之得到一个准确的50ms的延时。 展开
DEL: MOV R7,#200
DEL1: MOV R6,#125
DEL2: DJNZ R6,DEL2
DJNZ R7,DEL1
RET
总延时为1μs+(1+250+2)μs*200+2μs=50.603ms
求大神给出一个精确的编程,使之得到一个准确的50ms的延时。 展开
3个回答
展开全部
DEL: MOV R7,#210
DEL1: MOV R6,#117
DEL2: DJNZ R6,DEL2
NOP
DJNZ R7,DEL1
NOP ;此处17个NOP
NOP
....
NOP
RET
1μs+(1+234+1+2)μs*210+2μs+17=50000μs
其实考虑到LCALL调用这个函数的时间,末尾应该再减少2个NOP。
另外,实际使用中需要精确延时的话应该使用定时器中断,一方面是精确,另一方面延时函数执行时,如果有中断发生,那么延时就不正确了。
DEL1: MOV R6,#117
DEL2: DJNZ R6,DEL2
NOP
DJNZ R7,DEL1
NOP ;此处17个NOP
NOP
....
NOP
RET
1μs+(1+234+1+2)μs*210+2μs+17=50000μs
其实考虑到LCALL调用这个函数的时间,末尾应该再减少2个NOP。
另外,实际使用中需要精确延时的话应该使用定时器中断,一方面是精确,另一方面延时函数执行时,如果有中断发生,那么延时就不正确了。
追问
神,请告诉我用计数器怎么编吧。
展开全部
DELAY50MS:
MOV R6,#0ADH
DL0:
MOV R5,#8FH
DJNZ R5,$
DJNZ R6,DL0
RET
MOV R6,#0ADH
DL0:
MOV R5,#8FH
DJNZ R5,$
DJNZ R6,DL0
RET
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
DELAY50MS: ;@12.000MHz
PUSH 30H
PUSH 31H
MOV 30H,#98
MOV 31H,#62
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
PUSH 30H
PUSH 31H
MOV 30H,#98
MOV 31H,#62
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询