你的晶振为6MH,所以机器周期则为2us.即500MS(0.5秒的时间如下)
DELAY500Ms:
MOV R7,#0x0F
loop3:MOV R6,#0xCA
loop2:MOV R5,#0xA2
loop1:DJNZ R5,loop1
DJNZ R6,loop2
DJNZ R7,loop3
RET
延时总时间 = 三层循环 +子程序调用 2us + 子程序返回 2us = 499996+4 = 500000us =500ms
这个延时程序比较准确,你可以用示波器看下。
ORG 0000H
AJMP MIAN
ORG 0100H
MIAN:
NEXT:CPL P3.0
ACALL DELAY500Ms
SJMP NEXT
这个程序你可以直接编译后下载到单片机里去运行。
但我建议你不要用这种方法,因为它太占用系统时间,效率很差,你可以用定时做,这样不但非常准确而且不占用时间,系统还可以处理其它很多事情。
楼上的写的是10S的延时程序,而且不是很精准,用push和pop也占用了很多资源。
DELAY:
MOV R7,#250
DELAY1:
MOV R6,#248
DJNZ R6,$
DJNZ R7,DELAY1
RET
这个程序只有6个us的误差
输出脉冲程序:
TT:CPL P3.0
ACALL DELAY
SJMP TT
这个是死循环,就是一直输出脉冲,除非来中断,如果你只是调用这个程序,然后做别的事情,之需要设置一个寄存器,做了几次就结束就ok。
ORG 0000H
AJMP START
ORG 0050H
START: ACALL KS0 ; 停止0.5S
CLR P1.0 ;输出
ACALL KSA ; 输出 0.5S
AJMP START
KS0: MOV R0,#008H
KS1: MOV R1,#0FFH
KS2: MOV R2,#03CH
DJNZ R2,$
DJNZ R1,KS2
DJNZ R0,KS1
RET
KSA: MOV R0,#008H
KSB: MOV R1,#0FFH
KSC: MOV R2,#03CH
DJNZ R2,$
CPL P1.0
DJNZ R1,KSC
DJNZ R0,KSB
RET
END
仿真调试一下具体参数
程序就 是这样
_DELAY:
PUSH 0
PUSH 1
PUSH 2
MOV R0,#50
_D1:
MOV R1,#200
_D2:
MOV R2,#250
DJNZ R2,$
DJNZ R1, _D2
DJNZ R0, _D1
POP 2
POP 1
POP 0
RET