这是调用一个延时10毫秒的延时子程序 当然,子程序的名字可以自己定 DELY1MS: 这个名字一定要与调用中出现的名字一样,否则的话,调用的就不是这个子程序了
DELAY10MS:
MOV R2,#20
DELAY10MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY10MS1
RET
这是调用一个延时20毫秒的延时子程序 当然,子程序的名字可以自己定 DELY1MS: 这个名字一定要与调用中出现的名字一样,否则的话,调用的就不是这个子程序了
DELAY20MS:
MOV R2,#40
DELAY20MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY20MS1
RET
RETRET的作用是子程序返回。调用一个子程序,当单片机执行到RET语句的时候,单片机就会返回到调用的地方并继续向下执行。
下面给你一个例程:
闪烁灯
ORG 00H
AJMP START
ORG 30H
START:
MOV P0,#00H
LCALL DELY;调用延时子程序
MOV P0,#0FFH
LCALL DELY;调用延时子程序
AJMP START
DELY:
MOV R7,#250
DL1:MOV R6,#250
DJNZ R6,$
DJNZ R7,DL1
RET
MOV AX,5FFFH ;可修改0000~0FFFFH之内 越大延时越高
REP2:
MOV CX,5FFFH
REP10MS:
LOOP REP10MS
DEC AX ;AX-1->AX
CMP AX,0H ;比较AX和0的大小
JNE REP2 ;AX不等于0则跳转到 REP2
就是机器没执行一条指令要170ns,数字仅供参考
让循环重复执行5FFF5FFF次,达到秒级 具体的要自己调试
设主频12MHz的51单片机,编一个100ms二重循环的延时程序如下,供参考。其它汇编可以类似编程。
SSSS:MOV R0,#99;本指令是单周期指令,用时1us
KKKK0:DJNZ R0,KKKKK;2us
MOV R1,#125;1us
LLLL0:DJNZ R1,LLLLL;2us
NOP;1us
NOP;1us
NOP;1us
NOP;1us
LLLLL:SJMP LLLL0;2us
NOP;1us
NOP;1us
NOP;1us
NOP;1us
NOP;1us
KKKKK:SJMP KKKK0;2us
NOP;1us
NOP;1us
NOP;1us
NOP;1us
NOP;1us
RET;2us
这段程序延时时间是
1+99[2+1+125(2+1+1+1+1+2)+1+1+1+1+1+2]+1+1+1+1+2=100000us=100ms
可以适当调整循环常数99、125以求减小NOP(空 *** 作指令),使程序更加精练。
dshxxf程序不错,但延时时间是50301us,计算如下1+100(1+2250+3)
汇编程序的延时可以直接根据指令计算
在12M晶振的条件下,1个机器周期的指令为1微妙
单片机的指令分为单字节、双字节、三字节三种,其机器周期分别为1us、2us、3us [12M晶振]
对上述程序,分三部分计算:
push 06h ;1周期 1us
push 07h ;1周期 1us
MOV R6,#14H ;2周期 2us
;下面做一个整体计算 (2+192+2)14 us
DL1:MOV R7,#19H ;2周期
DL2:DJNZ R7,DL2 ;2周期
DJNZ R6,DL1 ;2周期
pop 07h;1周期 1us
pop 06h;1周期 1us
RET;1周期 1us
然后累加即可得答案
^_^ 希望对你有帮助~
用delay来产生延时在要求较高的场合不大合适。
可调用系统时间来产生准确的延时,并且可控制延迟时间
TEMP: MOV AH,2CH
INT 21H
ADD DH,5 ;获得时间DH为 当前的秒数,5秒可以自己选择
PUSH DX
WAIT:
POP DX
MOV AL,DH
PUSH DX
MOV AH,2CH ;新的时间
INT 21H
CMP DH,AL
JB WAIT ;小于5秒的话继续查询
欢迎讨论
以上就是关于如何利用单片机汇编指令编程实现延时10ms利用汇编指令设计多重循环编程实现20ms延时全部的内容,包括:如何利用单片机汇编指令编程实现延时10ms利用汇编指令设计多重循环编程实现20ms延时、8086下求汇编语言延时3秒的代码、求做个汇编编程,用双层循环实现100ms的延时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)