51单片机中的延时应该怎么计算?

例如1ms的延时(如下)是怎么计算出来的?希望能具体说说。

void delay1ms(void) //12M晶振
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}

for(a=2;a>0;a--) // 2微秒, 执行2次(a+2)是4微秒;

for(b=142;b>0;b--) // 2微秒, 执行142次,for(a=2;a>0;a--)是4微秒,即2*(142*4);
for(c=1;c>0;c--) // 2微秒, 执行1次,即2*(142*4)=1136微秒;
b=125,1000/8=125,再减去其它调用时间,应该b取值不大于125。追问

这些时间是怎么得出来的?

追答

51单片机执行一条指令一般是1---3微秒(12MHz),执行一条减一-判断-跳转指令,就是2微秒,这是c语言翻译为机器语言后的指令,cjne或djnz(汇编语言),编译器用什么指令和方法,需要你自己试验,我说的只是一种。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-05-03
两种方法,精确的话用定时器,不精确的话用函数。追问

我只想要for延时的计算方法。。。不要延时方法。。。

追答

首先根据晶振算出单片机一条指令需要多长时间,然后for多少个就行了

第2个回答  2014-05-03
你看一下它编译出来的汇编代码是怎样的,然后按照汇编指令的执行时间计算就对了。

或者如果有示波器,在该段程序的开头处和结尾处让芯片引脚产生一个电平变化,然后用示波器观察,这是针对单片机来说的。追问

我只想要for延时的计算方法。。。不要测量方法。。。

第3个回答  2014-05-03
for循环延时是不精确地,一般用定时器。用循环的话可以跑一下用示波器看或者仿真看一下。追问

嗯,我想知道计算的方法方,毕竟很多时候都是用for循环做的延时。

追答

51单片机的机器周期是12个时钟周期,12M晶振就是一个时钟周期是1/12M秒,即机器周期是1/1M秒,那一个for循环延时时间就等于执行指令数乘以机器周期

第4个回答  2014-05-03
for延时可以用断点来看,把for那里作为断点,看运行完那程序花了多长时间。