下列51单片机延时程序中的#250,这个250是怎么来的?哪位给详细解释下?

DELAY:MOV R7,#250;
D1:MOV R6,#250;
D2:DJNZ R6,D2;
DJNZ R7,D1;
RET ;

你好,这是一个延时程序,按这个程序来看是进行了两次循环。D2里面的是第一次循环,D1是第二次循环。整体的循环顺序如下:
先将R6里面的数减一,看是否为0,如果为0就顺序执行,如果不为0就继续减1看是否为0(也就是指令DJNZ的作用)。当R6中的数减为0以后,执行下一个DJNZ指令,这个就是一个大循环了。请仔细观察,当R7减1不为0时,程序又会给R6从新给250的数,那么就又会执行小循环。
也就是说,R7数每减少一次,就会完全的执行一次R6的循环。所以次数为255*255次。
关于时间的计算:如果晶振是12MHZ的话,那么没执行一条语句的时间就是1us,那么时间就是255*255us。其他不同晶振自然时间也就不一样。
最后的RET就用于返回主函数的,因为标准的程序是都要模块化的,主程序其实是很简单的。
不知道您听懂了没有,若是我说的话有错误的话请大家指出,谢谢!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-05
DELAY:MOV R7,#250;
D1:MOV R6,#250;
D2:DJNZ R6,D2; 250减1,直到等于0,执行下一条
DJNZ R7,D1; 250减1,直到等于0,转D1执行
RET

以16M晶振为例,每个机器周期为1us ,因为DJNZ Rx,rel 为2字节指令,执行时间2us 。
忽略MOV 指令的耗时, 这个延时循环为2*250*250=125000us=125ms本回答被提问者采纳
第2个回答  2011-07-05
这个参数纯粹是想当然。此延时程序无法得到非常准确的延时。
相似回答