|
我这儿有一种方法,来和大家共享一下
C语言的精确延时
以下所有测试若作为子函数,则调用时还要加上调用的2us和返回的2us,再加上赋值的时间。
long 4us(赋值)+2us(清零),int 2us,char 1us,3for 则不用.
即作为子函数调用全部要加的时间为long +10us,int +6us,char +5us,3for +0us.
*/
#include
void delay(void)
{
unsigned long i;
i=135;
while(--i);
}
void main(void)
{
/*unsigned long i;
i=113;
while(--i);
//此种形式定时时间为i*480/M us。最大误差不会超过1us,此1us主要是由某些特殊晶振不能被整除引起.
//i最大值为4294967295.M=12MHz下,Tmax=171798691800us约=17万秒
//大概生成代码是74
*/
/*unsigned int i;
i=113;
while(--i);
//此种形式定时时间为i*96/M us。最大误差不会超过1us,此1us主要是由某些特殊晶振不能被整除引起.
//i最大值为65535.M=12MHz下,Tmax=524280us约=0.5秒(500ms)
//大概生成代码是32
*/
/*unsigned char i;
i=150;
while(--i);
//此种形式定时时间为i*24/M us。最大误差不会超过1us,此1us主要是由某些特殊晶振不能被整除引起.
//i最大值为255.M=12MHz下,Tmax=510us约=0.5ms(500us)
//大概生成代码是23
*/
/*unsigned char i,j,k;
for(i=10;i>0;i--)
for(j=10;j>0;j--)
for(k=10;k>0;k--)
;
//此种形式定时时间为(((2*i+3)*j+3)*k+1)*12/M us。最大误差不会超过1us,
//此1us主要是由某些特殊晶振不能被整除引起.
//一层循环n:R5*2 DJNZ 2us
// 二层循环m:R6*(n+3) DJNZ 2us + R5賦值 1us = 3us
// 三层循环: R7*(m+3) DJNZ 2us + R6賦值 1us = 3us
//循环外:R7赋值 1us
//i最大值为255.M=12MHz下,Tmax=33.358591s
//大概生成代码是31。不过计算挺麻烦,要用软件计算,而且不是每1us都能算得到。
*/
delay();//子函数调用才用此行
P1_1=0;
while(1);
}
|
|