第一个:
dlynum=100;
while((sgn==0)&&(dlynum>0))
{
dlynum--;
DelayMs(1); //一个延时0.14ms的子函数
}
第二个:
dlynum=1000;
while((sgn==0)&&(dlynum--));
目的是当sgn==0一直不变的话,超过10ms以上便跳出while语句,防止程序卡死。第一个可用,而且延时的效果就是0.14ms*100;而第二个,在keil调试的时候运行完这段需要12ms,可是运行在单片机里却没有延时作用,调试的时候晶振频率已经改成开发板的晶振了。其实用DEbug模式断点单步执行一次就明白啦。
一个是循环100次, 一个是循环1000次。100*12us + 0.14 ms*100 约等于 14ms 而1000次 就是12ms了 。
首先我们来说说这两个延时函数吧,第一个延时函数里面DelayMs(1); //一个延时0.14ms的子函数,这个延时函数的主体没有看到,所以也不能完全确定他就是0.14ms,再说,同样的延时函数在不同的单片机里,不同的晶振,也会有差异,所以这个时间差异不好评估;至于第二个函数吧,dlynum--其实也就是dlynum = dlynum - 1;实际上他也是分两部来做的,首先是dlynum - 1,然后再是将dlynum - 1赋值给dlynum,相当于执行了两句,本身也会消耗2个CPU周期,对一般单片机来说,一个CPU周期差不多就是1us,但是这个不是死的;建议如果要实现这么短时间的精确定时的话,可以用定时器中断去实现,那样误差会相对小些!