第一个:
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,可是运行在单片机里却没有延时作用,我调试的时候晶振频率已经改成开发板的晶振了。。。
现在我很不理解啊,第一个在执行while等语句的时候难道不耗时间吗?如果说while等语句执行的时间很少,可以忽略,那为什么第二个在调试的时候sec长达12ms?望高人指点
首先我们来说说这两个延时函数吧,第一个延时函数里面DelayMs(1); //一个延时0.14ms的子函数,这个延时函数的主体没有看到,所以也不能完全确定他就是0.14ms,再说,同样的延时函数在不同的单片机里,不同的晶振,也会有差异,所以这个时间差异不好评估;至于第二个函数吧,dlynum--其实也就是dlynum = dlynum - 1;实际上他也是分两部来做的,首先是dlynum - 1,然后再是将dlynum - 1赋值给dlynum,相当于执行了两句,本身也会消耗2个CPU周期,对一般单片机来说,一个CPU周期差不多就是1us,但是这个不是死的;建议如果要实现这么短时间的精确定时的话,可以用定时器中断去实现,那样误差会相对小些!
你这个是C语言哦,C语言的时间要通过keil来哦
很明显第一个运行的时间比第二个长。
这么短的延时要用示波器才能看的到,呵呵
可以用for语句 嵌套
如下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--); }