在C51单片机中延时子程序的延时时间是怎么算的?

如题所述

比如说:
void delay ()
{
int x;
char y;
for(x=1000;x>0;x--)
{ for(y=100;y>0;y--)};

x每减一次,y减100次,x一共减少1000次
这个子程序的延时时间是:
1000*100=100ms(默认时间是us)
如果想更精确的话,可以用软件进行调试
for语句下面的{}还可以省略
有不清的可以多交流
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-19
按每一个指令所占有的机器周期。。再根据晶振频率来算。。追问

能否说的具体一点,谢谢啦

追答

DELAY: MOV R4,#60
D0: MOV R5,#125
D1: MOV R6,#200
D2: MOV R6,D2
DJNZ R5,D1
DJNZ R4,D0
RET
就以这个为例:MOV指令是1周期的指令,第一条的话就是执行了60次,就是60*1*机器周期的时间
第二条指令也是1周期的,但是执行了125*200次,所以是125*200*1*机器周期的时间
以此类推。。
而DJNZ是2周期指令。。。所以是循环次数*2*机器周期
最后加起来就好。。

本回答被提问者采纳
第2个回答  2011-12-19
C语言不可能精确计算,只能用示波器看。汇编可以精确计算,书上有公式的,随便一个讲单片机的书上都有的。
第3个回答  2011-12-19
知道每一步运行的时间,然后计算总共有多少步。一乘就出来了。每步的时间根据晶振不同而不同。
第4个回答  2011-12-19
void delay (unsigned int i)
{
unsigned char j;
for(i;i>0;i--)
for(j=500;j>0;j--);
}追问

这个好像是用C语言做的,用汇编程序怎么算啊,我急于知道延时子程序中延时时间的计算公式

追答

DELAY: MOV R4,#60
D0: MOV R5,#125
D1: MOV R6,#200
D2: MOV R6,D2
DJNZ R5,D1
DJNZ R4,D0
RET
是间参数可由自己需要更改。