精华内容
下载资源
问答
  • C语言延时函数

    2012-04-26 17:41:35
    用于C单片机的延时,是学单片机延时的必备呀
  • c语言延时函数的理解

    万次阅读 2018-05-22 19:41:10
    for循环实现C语言精确延时(晶振12MHz,一个机器周期1us.)一. 500ms延时子程序程序: void delay500ms(void){ unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--);}...
    for循环实现C语言精确延时
    (晶振12MHz,一个机器周期1us.)
    一. 500ms延时子程序
    程序:
    void delay500ms(void){
    unsigned char i,j,k;
    for(i=15;i>0;i--)
    for(j=202;j>0;j--)
    for(k=81;k>0;k--);
    }
    产生的汇编:
    C:0x0800 7F0F MOV R7,#0x0F
    C:0x0802 7ECA MOV R6,#0xCA
    C:0x0804 7D51 MOV R5,#0x51
    C:0x0806 DDFE DJNZ R5,C:0806
    C:0x0808 DEFA DJNZ R6,C:0804
    C:0x080A DFF6 DJNZ R7,C:0802
    C:0x080C 22 RET
    计算分析:
    程序共有三层循环
    一层循环n:R5*2 = 81*2 = 162us DJNZ 2us
    二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us
    三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us
    循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
    延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
    计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5

    二. 200ms延时子程序
    程序:
    void delay200ms(void){
    unsigned char i,j,k;
    for(i=5;i>0;i--)
    for(j=132;j>0;j--)
    for(k=150;k>0;k--);
    }
    产生的汇编
    C:0x0800 7F05 MOV R7,#0x05
    C:0x0802 7E84 MOV R6,#0x84
    C:0x0804 7D96 MOV R5,#0x96
    C:0x0806 DDFE DJNZ R5,C:0806
    C:0x0808 DEFA DJNZ R6,C:0804
    C:0x080A DFF6 DJNZ R7,C:0802
    C:0x080C 22 RET

    三. 10ms延时子程序
    程序:
    void delay10ms(void){
    unsigned char i,j,k;
    for(i=5;i>0;i--)
    for(j=4;j>0;j--)
    for(k=248;k>0;k--);
    }
    产生的汇编
    C:0x0800 7F05 MOV R7,#0x05
    C:0x0802 7E04 MOV R6,#0x04
    C:0x0804 7DF8 MOV R5,#0xF8
    C:0x0806 DDFE DJNZ R5,C:0806
    C:0x0808 DEFA DJNZ R6,C:0804
    C:0x080A DFF6 DJNZ R7,C:0802
    C:0x080C 22 RET

    四. 1s延时子程序
    程序:
    void delay1s(void){
    unsigned char h,i,j,k;
    for(h=5;h>0;h--)
    for(i=4;i>0;i--)
    for(j=116;j>0;j--)
    for(k=214;k>0;k--);
    }
    产生的汇编
    C:0x0800 7F05 MOV R7,#0x05
    C:0x0802 7E04 MOV R6,#0x04
    C:0x0804 7D74 MOV R5,#0x74
    C:0x0806 7CD6 MOV R4,#0xD6
    C:0x0808 DCFE DJNZ R4,C:0808
    C:0x080A DDFA DJNZ R5,C:0806
    C:0x080C DEF6 DJNZ R6,C:0804
    C:0x080E DFF2 DJNZ R7,C:0802
    C:0x0810 22 RET

    在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响.
    展开全文
  • 51单片机C语言延时函数怎么定义和使用

    万次阅读 多人点赞 2019-01-06 17:38:04
    C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为...

    C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。
      以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。现在定义一个延时xms毫秒的延时函数。

     void delay(unsigned int xms) // xms代表需要延时的毫秒
          {
          unsigned int x,y;
          for(x=xms;x>=0;x--)
          for(y=110;y>=0;y--);
          }
    

    1.51单片机C语言延时函数的使用
    下面给出一些经典的延时函数,(1)500ms延时子程序如下:

    void delay500ms(void)
    {
      unsigned char i,j,k;
      for(i=15;i>=0;i--)
      for(j=202;j>=0;j--)
      for(k=81;k>=0;k--);
    }
    

    计算分析:程序共有三层循环,一层循环n:R52 = 812 = 162us DJNZ 2us;二层循环m:R6*(n+3) = 202165 = 33330us DJNZ 2us + R5赋值 1us = 3us;三层循环: R7(m+3) = 1533333 = 499995us DJNZ 2us + R6赋值 1us = 3us
    循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
    延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
    计算公式:延时时间=[(2
    R5+3)*R6+3]*R7+5
    (2)200ms延时子程序:

    void delay200ms(void)
    {
      unsigned char i,j,k;
      for(i=5;i》0;i--)
      for(j=132;j》0;j--)
      for(k=150;k》0;k--);
    }
    

    (3)10ms延时子程序:

    void delay10ms(void)
    {
      unsigned char i,j,k;
      for(i=5;i》0;i--)
      for(j=4;j》0;j--)
      for(k=248;k》0;k--);
    }
    

    (4)1s延时子程序:

    void delay1s(void)
    {
      unsigned char h,i,j,k;
      for(h=5;h》0;h--)
      for(i=4;i》0;i--)
      for(j=116;j》0;j--)
      for(k=214;k》0;k--);
    }
    

    关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
    共有三条延时函数说明如下:
      函数调用分两级:一级是小于10US的延时,二级是大于10US的延时

    //小于10US的【用1US级延时】

    //----------微秒级延时---------

    for(i=X;i》X;i–) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)

    //======大于10US《小于21.9955Ms的可用【10US级延时函数】=

    void Delay10us(uchar Ms)
    {
      uchar data i;
      for(;Ms》0;Ms--)
      for(i=26;i》0;i--);
    }
    

    i=[(延时值-1.75)*12/Ms-15]/4
      如想延时60US则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i》X;i–) 共延时64US
      关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

    共有三条延时函数说明如下:

    函数调用分两级:一级是小于10US的延时,二级是大于10US的延时

    //小于10US的【用1US级延时】

    //----------微秒级延时---------

    for(i=X;i》X;i–) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)

    //======大于10US《小于21.9955Ms的可用【10US级延时函数】=

    void Delay10us(uchar Ms)
    {
      uchar data i;
      for(;Ms》0;Ms--)
      for(i=26;i》0;i--);
    }
    

    i=[(延时值-1.75)*12/Ms-15]/4
      如想延时60US则 i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;
      如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i》X;i–) 共延时64US
    2.下面给出有关在C51中延时子程序设计时要注意的问题(一些经验之谈)

    (1)、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。
     (2)、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。
     (3)、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。

    一. 500ms延时子程序产生的汇编:

    C:0x0800 7F0F MOV R7,#0x0F
    
      C:0x0802 7ECA MOV R6,#0xCA
    
      C:0x0804 7D51 MOV R5,#0x51
    
      C:0x0806 DDFE DJNZ R5,C:0806
    
      C:0x0808 DEFA DJNZ R6,C:0804
    
      C:0x080A DFF6 DJNZ R7,C:0802
    
      C:0x080C 22 RET
    

    二.200ms延时子程序产生的汇编

    C:0x0800 7F05 MOV R7,#0x05
    
      C:0x0802 7E84 MOV R6,#0x84
    
      C:0x0804 7D96 MOV R5,#0x96
    
      C:0x0806 DDFE DJNZ R5,C:0806
    
      C:0x0808 DEFA DJNZ R6,C:0804
    
      C:0x080A DFF6 DJNZ R7,C:0802
    
      C:0x080C 22 RET
    

    三.10ms延时子程序产生的汇编:

    C:0x0800 7F05 MOV R7,#0x05
    
      C:0x0802 7E04 MOV R6,#0x04
    
      C:0x0804 7DF8 MOV R5,#0xF8
    
      C:0x0806 DDFE DJNZ R5,C:0806
    
      C:0x0808 DEFA DJNZ R6,C:0804
    
      C:0x080A DFF6 DJNZ R7,C:0802
    
      C:0x080C 22 RET
    

    四.1s延时子程序产生的汇编

    C:0x0800 7F05 MOV R7,#0x05
    
      C:0x0802 7E04 MOV R6,#0x04
    
      C:0x0804 7D74 MOV R5,#0x74
    
      C:0x0806 7CD6 MOV R4,#0xD6
    
      C:0x0808 DCFE DJNZ R4,C:0808
    
      C:0x080A DDFA DJNZ R5,C:0806
    
      C:0x080C DEF6 DJNZ R6,C:0804
    
      C:0x080E DFF2 DJNZ R7,C:0802
    
      C:0x0810 22 RET
    

    3.另外一些关于延时的例子
    http://www.ceet.hbnu.edu.cn/bbs/viewthread.php?TId=3749,作者:小秋

    晶振:12MHz

    1:5~500us

    void delay(unsigned char i)
    {
      while(--i) ;
    }
    

    计算方法:ix2+5 可完成5~515us的延时

    2:10us~2ms

    void delay(unsigned char i)
    {
      for( ;i》0 ;i--) ;
    }
    

    计算方法:ix8+10 可完成10us~2.050ms的延时

    3:2ms~130ms

    void delay(unsigned char i,unsigned char j)
    {
      for( ;j》0 ;j--)
      for( ;i》0 ;i--) ;
    }
    

    计算方法:(ix2+3)xj+5 u


    转载自:http://www.elecfans.com/emb/580729_a.html

    展开全文
  • 本期教大家将编写一个小脚本用树莓派来捕获多个图像,然后可以将这些图像组合成动画GIF,使用延时摄影功能,可以在几秒钟内查看非常慢的事情。我们需要用到ImageMagick,这是一个用于图像处理的命令行程序。要安装...

    ca3bf55ff829105e3917f8085a501a56.png

    本期教大家将编写一个小脚本用树莓派来捕获多个图像,然后可以将这些图像组合成动画GIF,使用延时摄影功能,可以在几秒钟内查看非常慢的事情。

    我们需要用到ImageMagick,这是一个用于图像处理的命令行程序。要安装ImageMagick,请在终端窗口中运行以下命令:

    sudo apt-get update
    
    sudo apt-get install imagemagick -y

    使用树莓派的延时动画。延时摄影使用长时间拍摄的多个图像,然后将这些图像拼接在一起以产生动画的图像序列。如果以前从未见过延时,我给大家找到一张GIF图可以直观的看到。

    bd75f0e59f70e7f8ed749742783dae15.gif

    使用拍照功能,需要脚本的支持,我们先编写一个脚本。

    #/home/pi/timelapse.py
    
    from picamera import PiCamera
    
    
    camera = PiCamera()
    camera.capture('/home/pi/Desktop/image.jpg')

    保存代码,命令行运行,python /home/pi/timelapse.py

    就可看看桌面有一张名叫image.jpg的图片了。

    保存代码,命令行运行,python /home/pi/timelapse.py

    就可看看桌面有一张名叫image.jpg的图片了。

    拍摄多张图片

    可以使用相机模块拍摄多个图像,方法是使用循环捕获图像。修改您的代码文件以包含for循环。在此示例中,Pi Camera将捕获10个图像:

    from picamera import PiCamera
    
    camera = PiCamera()
    
    for i in range(10):
        camera.capture('image.jpg')

    再次保存脚本并运行(F5)程序。然后查看文件管理器,查看已创建的内容,如果你看到只有一张图片,这是拍摄的最后一张图片。这是因为每个图像具有相同的文件名,所以它被下一个拍摄的图像覆盖了。稍微修改脚本来解决问题:

    from picamera import PiCamera
    
    camera = PiCamera()
    
    for i in range(10):
        camera.capture('image{0:04d}.jpg'.format(i))

    保存运行,这时再查看,就可以看到10张图片了。

    制作GIF图

    我们看看如何将之前拍摄的连续的图片转换为动画GIF。这时我们就需要ImageMagick。ImageMagick是一个命令行程序,可用于处理图像。首先,打开终端(Ctrl+Alt+t)并输入以下内容:

    convert -delay 10 -loop 0 image*.jpg animation.gif
    

    命令 -delay选项 设置帧之间的时间量(以百分之一秒为单位)。-loop选项设置GIF循环的次数。在这里0告诉它永远循环。需要一些时间来运行,等待完成,应该可以在文件管理器中看到 animation.gif 文件,双击它并在图像查看器中观看动画。这可能是一个相当大的文件。与所有命令行程序一样,可以在Python中调用ImageMagick。只需要使用os库,如下所示:

    from picamera import PiCamera
    from os import system
    
    camera = PiCamera()
    
    for i in range(10):
        camera.capture('image{0:04d}.jpg'.format(i))
    
    system('convert -delay 10 -loop 0 image*.jpg animation.gif')
    print('done')

    这里生成的文件将是非常大的文件,下面教大家如何压缩减小文件大小。重新打开之前的代码文件,我们做如下修改:

    from picamera import PiCamera
    from os import system
    
    camera = PiCamera()
    camera.resolution = (1024, 768)
    
    for i in range(10):
        camera.capture('image{0:04d}.jpg'.format(i))
    
    system('convert -delay 10 -loop 0 image*.jpg animation.gif')

    重新设置了图像的分辨率。

    我们在添加延时,来拍摄间隔的照片。我们重新修改代码如下:

    from picamera import PiCamera
    from os import system
    from time import sleep
    
    camera = PiCamera()
    camera.resolution = (1024, 768)
    
    for i in range(10):
        camera.capture('image{0:04d}.jpg'.format(i))
        sleep(60)
    
    system('convert -delay 10 -loop 0 image*.jpg animation.gif')
    from picamera import PiCamera
    from os import system
    from time import sleep
    
    camera = PiCamera()
    camera.resolution = (1024, 768)
    
    for i in range(10):
        camera.capture('image{0:04d}.jpg'.format(i))
        sleep(60)
    
    system('convert -delay 10 -loop 0 image*.jpg animation.gif')

    我们设置成每60秒拍摄一次照片,总共拍摄10张照片。现在可以将range()和sleep()函数的值修改为适合你自己的值。如果想捕捉一朵花的开放,那么一分钟或几分钟的图片就足够了。如果想拍下水果腐烂的图片则需要时间久一点。只需运行脚本,然后坐下来等待创建GIF。

    关注一下,更多精彩,不容错过!

    dd521ce27fa00fc7f9e15e1b9ab365eb.png
    展开全文
  • C语言 | 延时函数(Delay)

    千次阅读 2020-10-26 18:51:29
    对于延时很短,要求在us级的,采用“nop”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1us。 延时一个机器周期1.08us #include<...

    github:https://github.com/MichaelBeechan
    CSDN:https://blog.csdn.net/u011344545

    nop”函数

    对于延时很短,要求在us级的,采用“nop”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1us。 延时一个机器周期1.08us
    #include<intrins.h>
    _nop_();
    

    延时10us

    void 
    展开全文
  • C语言 头文件 函数

    2018-11-24 08:38:01
    C语言函数 头文件 函数库 。
  • c语言的单片机delay延时函数详解

    万次阅读 多人点赞 2021-04-07 11:32:15
    c语言及单片机delay延时函数延时函数1、是什么2、为什么3、用在哪里?4、怎么做1、循环延时 延时函数 延时函数,作为一种常用函数,在不同的领域有不同的用处。而在嵌入式以及C语言的编写中,我们常常遇到需要自己来...
  • 51单片机C语言延时函数

    万次阅读 多人点赞 2014-04-26 23:34:21
    关键字:51单片机 C语言 延时函数    C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某...
  • C语言里的延时函数

    万次阅读 2016-07-18 10:32:01
    C语言延时 悬赏分:0 - 解决时间:2007-2-18 14:48s级的时间延时杂写啊?大侠们帮哈忙啊 最佳答案 在Windows下最简单的办法是调用系统函数Sleep(time),单位是ms,在windows.h中声明,注意大小写;不然就用中的...
  • c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题 weixin_395593332020-11-29 09:07:4439收藏 文章标签:c语言延时函数c语言延时函数delayc语言延时函数delay延时一秒中断函数中调用延时会影响其他中断? ...
  • 常用的延时函数delay()

    2010-04-29 11:30:44
    这是一个常用的延时功能模块,编程有一 定的用处。
  • 很多网友在C语言延时函数的延时时间方面,做出了很大的努力。 在网上找到的一篇文章,其中给出了一些经验数据,摘录一些主要内容如下。
  • Linux系统编程——延时函数

    千次阅读 2021-01-26 16:43:56
    1. 延时函数简介 Linux 中常用的延时函数有 sleep,usleep,ndelay,udelay,mdelay等。 Linux 系统编程下用到的延时函数在头文件 #include <unistd.h> 包括 sleep,usleep; Linux 内核中用到的延时函数...
  • C语言sleep函数与usleep函数

    千次阅读 2019-07-10 12:17:11
    函数名: sleep 头文件:#include <unistd.h> 功 能: 执行挂起指定的秒数 语 法: unsigned sleep(unsigned seconds); 举例: void father() { int i; for(i = 0 ;i < 3;i++) { printf("father\n")...
  • C语言等待一秒,延时函数sleep()

    万次阅读 多人点赞 2017-12-21 20:31:08
    使用sleep()函数将程序阻塞,头文件在windows系统和linux系统下是不一样的 windows Sleep() #include <windows.h> 函数原型 void Sleep(DWORD dwMilliseconds); 参数为毫秒 linux sleep() 函数原型 #...
  • c语言延迟函数sleepThere are times when you want your program to run immediately. But there are also some times when you want to delay the execution of certain pieces of code. 有时您希望程序立即运行。 ...
  • c 语言延时函数

    千次阅读 2019-06-17 00:39:00
    /*--- 等待x毫秒 ---*/ int sleep(unsigned long x) { clock_t c1 = clock(), c2; do { if ((c2 = clock()) == (clock_t)-1) /* 错误 */ return 0; } while (1000.0 * (...
  • c语言中,关于延迟函数的理解

    万次阅读 多人点赞 2017-06-05 00:18:34
    对于fflush( )函数这里就不多说了,这里主要想和大家分享的是关于Linux下c 中sleep( )函数的使用。  以上就是我对它的简单理解,希望可以帮到有需要的人。 转载自(http://blog.csdn .NET /Crazy_Tengt/...
  • c语言编写的延时函数

    2010-03-05 21:33:00
    几种简单的延时函数,有兴趣的可以看看的。虽然简单,不过使用起来不容易出错
  • 单片机中C语言延时函数

    千次阅读 2010-05-15 16:02:00
    单片机C语言延时程序计算2009-11-02 22:15单片机C语言延时程序用C语言写出来程序非常的简练,它是一种模块化的语言,一种比汇编更高级的语言,但是就是这样一种语言也还是有它不足之处:它的延时很不好控制,我们...
  • 单片机常用延时函数

    2015-08-26 17:02:54
    单片机常用的C语言延时函数,精确延时,有14种延时时间可供选择
  • 单片机C语言延时1MS子程序 void delay(unsigned int m) { unsigned int i; unsigned int j; for(i=0;i;i++) for(j=0;j;j++); }
  • 单片机C语言精确延时计算器,延时精度误差。可设置不同单片机和晶振频率。
  • C\C++中计时、延时函数

    万次阅读 多人点赞 2016-11-06 18:25:13
    C\C++标准库中提供了两种计时函数clock()和time()。其用法如下: (1)clock()函数用法 void timeConsume() { double start,stop,durationTime; start = clock(); /* ...代码片段 */ stop = clock(); ...
  • c语言:sleep函数

    千次阅读 2017-11-13 16:02:02
    sleep函数让进程进入TASK_INTERRUPTIBLE状态,可以使用SIGUSR1信号终止TASK_INTERRUPTIBLE状态; #include #include #include void handle() { printf ( "recevice sigusr1\n" ); } int main( ...
  • (基于51核的STC12C5A60S2,keil uvision5 mdk 5.25 编译) #include <STC12C5A60S2.h> //选择对应的代码进行测试 1——运行,0——不运行 sbit LED1 = P2 ^ 4; sbit LED2 = P2 ^ 5;...sbit...
  • c语言中delay的用法。

    千次阅读 多人点赞 2020-10-24 14:49:45
     假设一个延时函数如下:  void delay()  {  uint i;  for(i=0;i<20000;i++);  }  我们怎么来算呢,先将20000转成16进制,得到4E20,然后将高字节4E乘以6得到468D,再将468+2=470,然后将470D*20HEX...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,328
精华内容 5,731
关键字:

c语言延时函数

c语言 订阅