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

延时函数区别

wanyanfei1984 2018-07-19 浏览量:1211

单片机中使用延时函数,特别是在流水灯中,下面两个延时函数:

1)

void delay(int i)

{

   while( i--);

}

2)

void delay(int i)

{

int m;

m = 1000*i;

while(m--);

}

为什么在使用中发现,当使用两个函数:1)延时i=3000和 2) 延时i=3时候,发现延时并不是一样的时间,

其中1)中值越大延时越长,正常;

其中2)中值越大延时似乎越短


想请教大家,这个什么情况?(在流水灯中使用)


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 第二个延时函数 多了一行计算公式,指令运行就多了一些时间, 这样 函数输入的参数不同 ,就造成 延时的结果不是线性的变化,你就用第一个函数吧
    • 发布于 2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:16
  • 这叫累计误差,这种延时函数延时就是依靠执行空语句和无用的语句实现。

    第一个函数是靠执行while循环和循环里的空语句延时,第二个除了这些还要执行乘法和赋值语句,每次执行基本都会浪费一个或者几个机器周期,对于51单片机来说就是每次累计误差都有1us或者几us,那么3000次下来估计就是3ms左右了。

    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 3
    • 0

  • 两个函数编译出来复杂度不一样.
    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 你用的额int型数据,数值大到一定变短是因为数据溢出了,第二个执行的语句多一条,时间肯定不一样呀,本来延时就不是精确的定时,只是大概差不多
    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 我以前也遇到过,变量m溢出了
    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 要看一下汇编的表达方式,只是看C语言,误差不应该那么大的
    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 常用的是第一种  延时比较准确, 或者使用定时器
    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 如果你分别用delay(3000)和delay(3)的话,误差应该不大,如果值太大的话,就要考虑数据溢出的问题,int类型的数据范围是-32768~+32767,所以要看两个函数中的值是否溢出了。
    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以考虑溢出了,

    你定义的 i 是个 int 类型的变量

    你得 m = 1000 * i 还是个 int 类型的变量,请你自己考虑合适不。

    比如 i=0xffffffff,m 理论等于多少,m 实际最大又是多少呢?

    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • i 比较小的话,不准确是因为两个函数的开销不一样,因为要不停的调用子函数。

    i 比较大的话,不准确是因为 m 溢出,并且这个时候差异很大

    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 上面一个是短延时用的,下面一个是长延时用的,但是你的m定义int是错误的,应该为long int就够了

    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 有可能是你的乘法使数据溢出了,所以溢出后的数值就会小很多
    • 发布于2018-07-19
    • 举报
    • 评论 0
    • 0
    • 0

  • 肯定啊,因为函数2涉及到while循环,程序中有while循环的就需要进行堆栈的进出,会间接影响程序执行效率。

    • 发布于2018-07-21
    • 举报
    • 评论 0
    • 0
    • 0

  • 在执行

    m = 1000*i

    的时候也是需要消耗时间的

    • 发布于2018-07-22
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个跟你的堆栈有关,你的在运行的时候要入栈和出栈,这个都是需要时间的
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 执行指令也是需要时间的,这个要考虑进去
    • 发布于2018-08-18
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

延时函数区别