• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

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

不懂我就问 2015-01-13 浏览量:1653

第一个:

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 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 100*12us   + 0.14 ms*100  约等于 14ms  而1000次 就是12ms了 
    • 发布于 2015-01-13
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:12
  • 一个是循环100次0.14ms   一个是循环1000次 --
    • 发布于2015-01-14
    • 举报
    • 评论 0
    • 0
    • 0

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

    • 发布于2015-01-14
    • 举报
    • 评论 0
    • 0
    • 0

  • 1000次那个,while执行一次是12us,1000次刚好是12ms啊。。。
    • 发布于2015-01-14
    • 举报
    • 评论 0
    • 0
    • 0

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

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

    • 发布于2015-01-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 我要求的延时只要10ms以上就可以了。可是1000次那个写入单片机后却没有延时效果。。
    • 发布于2015-01-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 我就是在keil调试的。我要求的延时只要10ms以上就可以了,所以谁长谁短无所谓,只要到10ms就可以。可是第二个写入单片机后却没有延时效果。。。。
    • 发布于2015-01-15
    • 举报
    • 评论 0
    • 0
    • 0

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

     

    • 发布于2015-01-15
    • 举报
    • 评论 0
    • 0
    • 0

  • while((sgn==0)&&(dlynum--)){};
    • 发布于2015-01-15
    • 举报
    • 评论 0
    • 0
    • 0

  • 用DEbug模式断点单步执行一次就明白啦
    • 发布于2015-01-16
    • 举报
    • 评论 0
    • 0
    • 0

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

    • 发布于2015-04-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 你第二个程序dlynum和第一个程序dlynum的数据类型是不是一样的,如果你第一个程序的dlynum是CHAR类型,第二个是long int 类型,也就是说一个是8位,一个是16位。51是8位的,那C语言汇编时,WHILE语句生成的代码是不一样的,很显然第二个WHILE执行时间比第一个长很多。如果你两个都是CHAR类型,那第二个数据实际上dlynum=1000%256,烧到单片机里,延时时间就很短了,几乎没有延时。如果如果你两个都是long int 类型,你第一个程序延时绝对不止14ms
    • 发布于2015-07-06
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

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