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--);
}

第1个回答  2014-05-03
郭老师上面讲的很详细。
第2个回答  2014-05-03
跟晶振有关
第3个回答  2014-05-03
你仿真一下执行 for(c=1;c>0;c--) 要多久就知道了追问

我想要的是计算方法。。。

追答

执行c--那条程序,c不等于0.
执行b--那条程序,b也不等于0.
就执行a--那程序。a也不等于0
就退出,到了b--那程序,执行后b也不等于0.就执行a--那程序。c也不等于0
就退出,到了b--那程序,执行后b也不等于0.就执行a--那程序。c也不等于0
就退出,到了b--那程序,执行后b也不等于0.就执行a--那程序。c也不等于0
就退出,到了b--那程序,执行后b也不等于0.就执行a--那程序。c也不等于0
执行很久后a和b等于0
就返回到c--那程序。这个时候c等于0.
就退出延时
更好理解的延时程序写法:
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--);
}

}
}

追问

你没理解我的意思。。我这边找了资料发现,延时是由机器周期决定的、机器周期又由时钟周期决定。像我这个延时函数,里面每一条语句都会耗损一定的机器周期,利用这一点,可以通过执行一定量的带码来实现对时间的积累也就是延时。而具体怎么做可以通过反汇编通过查看一次循环会有多少汇编代码、每个汇编代码需要耗损多少机械周期然后换算成时间乘以循环次数就知道了。