发布网友 发布时间:2022-04-24 09:16
共4个回答
热心网友 时间:2022-06-18 11:16
;晶振24M
DELAY1s: ;子程序
mov A,R4
jz enddelay
MOV R5,#10H ; ∵ 1s=2000000*0.5us
MOV R6,#43H ; ∴ 2000000/2=1000000
MOV R7,#40H ; 1000000用16进制表示为: 0f4240
; 所以 R5=0fH+1=10H
; R6=042H+1=043H
; R7=40H
loop: DJNZ R7,$ ; 延时时间≈2×[(R5-1)×256+R6-1]×256+R7
DJNZ R6,loop ; 当R5、R6等于0,相当于256参与运算
DJNZ R5,loop ; 当R5、R6等于0,相当于256参与运算
DJNZ R4,DELAY1s
enddelay: RET
上面是延时子程序,基础延时是1s,调用前给R4赋值,R4的值就是延时的秒数,比如:
mov R4,#3 ;表示延时3秒
lcall DELAY1s
热心网友 时间:2022-06-18 11:17
延时4~5S,用循环方式的延时函数没什么实用性。单片机不做其它事在这里一直循环是不现实的。
还是用定时器中断吧
热心网友 时间:2022-06-18 11:17
DELAY:
MOV R2,#100 ;1
DELAY1:
MOV R3,#200 ;1*100
DELAY2:
MOV R4,#249 ;1*100*200
DJNZ R4,$ ;2*100*200*248
DJNZ R3,DELAY2 ;2*100*200
DJNZ R2,DELAY1 ;2*100
RET ;2
以上数字之和即为延时的机器周期数,每个机器周期为0.5us
所以共延时4.99S
热心网友 时间:2022-06-18 11:18
C语言代码:
void delay5s(void) //误差 0us
{
unsigned char a,b,c;
for(c=191;c>0;c--)
for(b=1;b>0;b--)
for(a=137;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
汇编实现:
DELAY5S: ;误差 0us
MOV R7,#0BFH
DL1:
MOV R6,#0BDH
DL0:
MOV R5,#H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
NOP
RET