51单片机,晶振为6M请帮忙写一个10ms的延时程序,能有详细解释的。因为我还不知道这个延时的时间是怎么算

如题所述

延时有很多种方法,有一种是让单片机去做无聊的循环,
还有一种是用定时器。
我本身也是菜鸟所以只能粗略的讲一下。
第一种的算法是
晶振的周期T1=1/f; 这里f=6MHz 所以T1=1/6 us;(微秒)
单片机花12个T1去执行一个指令,
所以一个机器周期等于12个晶振周期,
T2=12*T1=2us
10ms=1000 0us
所以你要得到10ms的延时就要想办法让机器去做5000条“无聊的指令”
所以
DEL: MOV R5,#05H
F1: MOV R6,#05H
F2: MOV R7,#32H
F3: DJNZ R7,F3
DJNZ R6,F2
DJNZ R5,F1
RET
这种方法是用于对时间要求不高的地方,我说的是其思想,程序中可能有错的地方
用定时器的方法我不太会就不误人了 (补充一下就是这个是用汇编写的,你在主程序中用ACALL DEL调用就延时了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-24
选取时钟源计算时钟周期,然后用定时器来自动从装方式等通过计算一次溢出是多少时钟周期死算出多少时间溢出一次,然后根据你需要的时间延时算出需要多少次循环溢出,具体操作自己去看相关寄存器等。最好找个例子,例子很多的
第2个回答  2010-11-24
您好:
void delay()
{
uchar i,j;
for(i=0;i<5;i++)
for(j=0;j<114;j++);
}
第3个回答  2012-03-23
DEL MOV R5#50
AA; MOV R6#20
BB; MOV R7#248
DJNZ R7$
DJNZ R6 D2
DJNZ R5 D2