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

关于延时函数的问题,大侠们

wanyanfei1984 2018-08-09 浏览量:1219

大侠们,在使用51单片时候,使用的12M的晶振,使用延时函数

void delay(int i)

{

    while(i--);

}

这个函数实例中当i=1时提示延时大概为10μs。


使用定时器:

void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
其中实际上​定时为1ms。


定时器可以理解,但上面的延时函数说i=1时延时10us,对么?

一个指令周期不是1us么?延时函数有几个指令周期?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 首先,指令周期,不是指 c 函数语句周期,是指汇编指令周期。

    要把程序编译出来再反汇编,看 汇编 指令是几条,然后再查 51指令 看每条指令是几个指令周期,再算每个指令周期是几个时钟周期,再算一个时钟周期是多长时间,然后相乘,这样算的才是真实值。

    51 比较特殊,大多不是单周期指令,指令周期和时钟周期不一样。

    不想算就在线调试,看那个时间也准

    • 发布于 2018-08-09
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:19
  • i=1时延时10us是不确定的,指令周期是指执行一条指令(汇编)需要的时间,不同的指令,周期时间不同,可以查单片机对应的指令周期表。
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 一个指令周期,只是执行单个指令,这里指的是汇编指令,比如MOV,INT等。

    在我们用C语言写一个FOR().WHILE()要经过编译器进行编译,编译出来的肯定就不是一个语言,可能要操作很多部。

    而且编译的时候,根据优化的等级,程序的执行效率是不一样的。

    所以,通过while(i--)延时不是很精确。

    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 因为你用的c语言,这个延时调用其实还涉及了调用函数跳转、返回等等,这些再加上本身处理,所以设为1时可能需要具体执行10条标准指令时间了,特别是值比较小时,相应的占用比较多,其实其延时大概是 T+t0*N ,其中T可以算作是调用、返回之类的指令时间,t0是一个循环中减法指令、比较等等的时间。
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 首先你用的12M的晶振,51是12T的运行  就是1/12/12  = 1us   i = 1.     。我也做了STC官方的提供的延时函数  分为不同的指令集  ,分别为STC-Y1 延时差不多是10us左右  如果不同的指令集,那么延时消耗的时间是不一定的

    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 你应该看延时函数最后的反汇编代码,然后根据汇编代码才能得到准确的延时
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • C语言延时是不准的,娶个大概,定时器则是高精度的
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 对i是不是等于0的判断也是一条指令,也是要用时间的
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 如果只对这个变量i自减这个操作,那应该算是单周期指令,1us;但是你调用了while这个函数进行延时,有函数调用、出栈、入栈的时间消耗,所以应该是综合看这个过程是10us
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 如果只对这个变量i自减这个操作,那应该算是单周期指令,1us;但是你调用了while这个函数进行延时,有函数调用、出栈、入栈的时间消耗,所以应该是综合看这个过程是10us
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • C语言的延时是不准确的,应该是其他的对其综合影响导致10US
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个10us不准确的,因为涉及到函数的跳转
    • 发布于2018-08-09
    • 举报
    • 评论 0
    • 0
    • 0

  • 1us是指仅仅针对i--这个操作,你要进入while这个函数,然后自减操作后还要跳转到其他地方,这都需要时间,应该这些都算在里面10us
    • 发布于2018-08-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个就涉及到编译器了要看编译器编译出来的汇编代码是怎么样的.再具体分析.
    • 发布于2018-08-10
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个要看的延时是怎么处理的,最好是使用定时器来进行精确的定时操作
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 指令周期是指汇编指引周期,而且这种延时并不是很准确的
    • 发布于2018-08-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 指令周期的定时并不是很精致,你可以使用定时器来计时
    • 发布于2018-08-17
    • 举报
    • 评论 0
    • 0
    • 0

  • C语言中不好看出延时的时间 的,要看看汇编程序
    • 发布于2018-08-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 51是12个时钟周期执行一个指令,并且c语言你i自身减一的时间也不一定是一个机器周期,还跟你开发和运行环境的优化有关系。
    • 发布于2018-08-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 上面的说法是对的

    汇编指令是1US

    但是你跳转到子函数

    然后子函数是一个循环

    循环里还有判断

    然后才是加减

    这样算怎么也有10US了

    • 发布于2018-09-09
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

关于延时函数的问题,大侠们