这两个延时语句有什么区别?

  • 不懂我就问
  • LV0工程师
  • |      2015-01-13 22:37:55
  • 浏览量 1690
  • 回复:8

第一个:

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?望高人指点

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:8
爸比说你没用 2015-04-05

可以用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--);
}

0   回复
举报
发布
Eagleson 2015-01-16
用DEbug模式断点单步执行一次就明白啦
0   回复
举报
发布
xinwen 2015-01-15

这么短的延时要用示波器才能看的到,呵呵

 

0   回复
举报
发布
冰山一角 2015-01-15

你这个是C语言哦,C语言的时间要通过keil来哦

很明显第一个运行的时间比第二个长。

0   回复
举报
发布
不懂我就问 2015-01-14
1000次那个,while执行一次是12us,1000次刚好是12ms啊。。。
0   回复
举报
发布
SingleYork 2015-01-14

首先我们来说说这两个延时函数吧,第一个延时函数里面DelayMs(1); //一个延时0.14ms的子函数,这个延时函数的主体没有看到,所以也不能完全确定他就是0.14ms,再说,同样的延时函数在不同的单片机里,不同的晶振,也会有差异,所以这个时间差异不好评估;至于第二个函数吧,dlynum--其实也就是dlynum = dlynum - 1;实际上他也是分两部来做的,首先是dlynum - 1,然后再是将dlynum - 1赋值给dlynum,相当于执行了两句,本身也会消耗2个CPU周期,对一般单片机来说,一个CPU周期差不多就是1us,但是这个不是死的;建议如果要实现这么短时间的精确定时的话,可以用定时器中断去实现,那样误差会相对小些!

0   回复
举报
发布
Eagleson 2015-01-14
一个是循环100次0.14ms   一个是循环1000次 --
0   回复
举报
发布
Eagleson 2015-01-13
100*12us   + 0.14 ms*100  约等于 14ms  而1000次 就是12ms了 
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子