
你可以粗略这样看,在上面的指令中,执行次数最多的是DJNZ rn,那么可以延时就是DJNZ指令执行时间。这里运用了嵌套,所以要×。
它的顺序是先执行DJNZ R5,L3 ;10次,执行DJNZ R6,L2 250次
但是当R6减1那么就赋予R5初值10,所以R5又得运行10次,而每减一次1都要重复10次。同理,执行R7减一要重复前面的DJNZ指令10×250次,所以就有了
10×250×200×2us=1s
delay子程序就是让单片机不做什么事情,在等待子程序完成条件
void delay(n) //延时子程序
{
while(n--) //这里把传入的参数当作次数来用
{
for(i=120;i>0;i--); // 等待i减完
}
}
D5MS:
MOV R7,#25
MOV R6,#100
DJNZ R6,$
DJNZ R7,$-4
RET
void delay_ms(unsigned int ms )
{
unsigned char i;
while(ms--)
for(i=0;i<123,i++); //这是1ms的子函数
}
delay_ms(5) ; // 就是5ms延时了
#include<AT89X51>
unsigned char sx[]={
oxfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
oxfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x01},
ml[]={0xff,0x00, 0xff,0x00, 0xff,0x00,
0xff,0x00, 0xff,0x00, 0x01};
unsigned int a=0,b=0;
del1ms(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<100;j++);
}
main()
{
while(1)
{
if(sx[]!=0x01)
{
P0=sx[a];
del1ms(20);
a++;
}
else
a=0;
if(lm[]!=0x01)
{
P0=lm[b];
del1ms(30);
b++;
}
else
b=0;
}
}
说明一下: 这样延时太短了,基本上看不出
对于定义来说:变量只是一个标识符而已,随便设,当变量多 的时候最好用带意思如:sec stu 等
通用办法,可以类推:
DELAY1s:MOV R5,#08H ; ∵ 1s=1000000us
MOV R6,#0A2H ; ∴ 1000000/2=500000
MOV R7,#20H ; 500000用16进制表示为: 07A120
; 所以 R5=07H+1=08H
; R6=0A1H+1=0A2H
; R7=20H
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参与运算
RET
以上就是关于单片机延时子程序全部的内容,包括:单片机延时子程序、新人单片机做时钟时候延时子程序延时方式没懂,求dalao解答,程序如下、若晶振为12MHZ,试编写一个延时5MS的子程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)