单片机延时1ms问题

/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
上面的计算公式是怎么得到的?请高手相信给说明一下

首先,不知道你的晶振频率是多少,然后不知道你使用的是哪种类型的单片机。
我根据KEILC的测试:for循环这个语句是双周期指令2个机器周期,j=0;j<33;j++。这有三步单周期指令,每次三个机器周期。。。所以时间是(3j+2) 乘以循环次数i。就是时间微秒
上述指令在12MHZ的晶振频率,AT89S52的单片机测试情况下为0.0001060秒。也就是1MS追问

12M晶振,89s52单片机
void delay1ms(unsigned int i)
{ unsigned char j;
while(i--)
{
for(j=0;j<113;j++)
{
;
}
}
}
这个延时函数也是1ms。我不明白为什么这个循环了113次是1ms,而上面的循环了330次也是1ms?

追答

   

而且比较请都使用相同的语句比较。。while语句是9个机器周期的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-25
第一个for执行10次 每执行一次下面的那个for就执行33次 这个还要看 你的晶振是多大的 才能得出具体的准确时间 11.0592和12MHZ的 得出的时间是不一样的追问

12M晶振

追答

void delay1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}

你要使用的话 就是用这个吧 这个相对精确

相似回答