单片机中使用延时函数,特别是在流水灯中,下面两个延时函数:
1)
void delay(int i)
{
while( i--);
}
2)
int m;
m = 1000*i;
while(m--);
为什么在使用中发现,当使用两个函数:1)延时i=3000和 2) 延时i=3时候,发现延时并不是一样的时间,
其中1)中值越大延时越长,正常;
其中2)中值越大延时似乎越短
想请教大家,这个什么情况?(在流水灯中使用)
这叫累计误差,这种延时函数延时就是依靠执行空语句和无用的语句实现。
第一个函数是靠执行while循环和循环里的空语句延时,第二个除了这些还要执行乘法和赋值语句,每次执行基本都会浪费一个或者几个机器周期,对于51单片机来说就是每次累计误差都有1us或者几us,那么3000次下来估计就是3ms左右了。
可以考虑溢出了,
你定义的 i 是个 int 类型的变量
你得 m = 1000 * i 还是个 int 类型的变量,请你自己考虑合适不。
比如 i=0xffffffff,m 理论等于多少,m 实际最大又是多少呢?
i 比较小的话,不准确是因为两个函数的开销不一样,因为要不停的调用子函数。
i 比较大的话,不准确是因为 m 溢出,并且这个时候差异很大
上面一个是短延时用的,下面一个是长延时用的,但是你的m定义int是错误的,应该为long int就够了
在执行
m = 1000*i
的时候也是需要消耗时间的