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

如题·····

第1个回答  2013-10-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   

第2个回答  2013-10-18
延时4~5S,用循环方式的延时函数没什么实用性。单片机不做其它事在这里一直循环是不现实的。
还是用定时器中断吧本回答被提问者采纳
第3个回答  2013-10-16
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追问

....可以写为C语言么!

追答

C的很不准确,大概齐如下吧
delay() //延时时间4000ms(一般可能稍微大于一点)
{
unsigned int i,j;
for(i=0;i<4000;i++)
for(j=0;j<240;j++); //大概延时1ms
}

追问

可以改为有参数的吗? 1s 为基本···· delay(1)就是延时1s~

追答

delay(int a) //延时时间约1s
{
unsigned int i,j;
for(i=0;i<a*1000;i++)
for(j=0;j<240;j++); //大概延时1ms
}

本回答被网友采纳
第4个回答  2013-10-22
C语言代码:
void delay5s(void) //误差 0us
{
unsigned char a,b,c;
for(c=191;c>0;c--)
for(b=189;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,#89H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
NOP
RET
相似回答