51单片机,晶振为24.0,延时函数怎么写,延时4~5s

发布网友 发布时间: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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com