精华内容
下载资源
问答
  • 在VC中使用带上头文件#include1注意:在VC中Sleep中的第一个英文字符为大写的”S”在标准C中是sleep, 不要大写.....其中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sl...

    在VC中使用带上头文件

    #include1

    注意:

    在VC中Sleep中的第一个英文字符为大写的”S”

    在标准C中是sleep, 不要大写.. 下面使用大写的来说明,, 具体用什么看你用什么编译器. 简单的说VC用Sleep, 别的一律使用sleep.

    Sleep函数的一般形式:

    Sleep(unisgned long);

    其中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000);

    例:

    #includeint main(){ int a; a=1000; Sleep(a); /* VC 使用Sleep */ return 0;}1

    2

    3

    4

    5

    6

    7

    8

    usleep功能:

    暂停执行。 语法: void usleep(int micro_seconds); 返回值: 无 函数种类: PHP 系统功能 内容说明:本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的毫秒数(微妙还是毫秒?)。 注意:这个函数不能工作在 Windows 操作系统中。参见:usleep() 与sleep()类似,用于延迟挂起进程。进程被挂起放到reday queue。

    只是一般情况下,延迟时间数量级是秒的时候,尽可能使用sleep()函数。

    且,此函数已被废除,可使用nanosleep。

    如果延迟时间为几十毫秒,或者更小,尽可能使用usleep()函数。这样才能最佳的利用CPU时间

    delay:

    函数名: delay

    功 能: 将程序的执行暂停一段时间(毫秒)

    用 法: void delay(unsigned milliseconds);

    程序例:

    /* Emits a 440-Hz tone for 500 milliseconds */ #include int main(void) { sound(440); delay(500); nosound(); return 0; }1

    2

    3

    4

    5

    6

    7

    8

    9

    delay()是循环等待,该进程还在运行,占用处理器。

    sleep()不同,它会被挂起,把处理器让给其他的进程。

    sleep()参数指定暂停时间,单位是ms

    delay()参数指定暂停时间,单位也是ms

    展开全文
  • 延时函数

    千次阅读 2020-03-08 21:53:40
    延时函数 什么是延时函数 所谓延时函数就是在函数中设置了几个空操作的动作,每次操作都需要消耗一定的时间,动作结束了,就会跳出延时函数继续做其他事情了。 为什么要延时 为了使CPU某些芯片的时序而采用的一些...

    延时函数

    什么是延时函数

    所谓延时函数就是在函数中设置了几个空操作的动作,每次操作都需要消耗一定的时间,动作结束了,就会跳出延时函数继续做其他事情了。

    为什么要延时

    为了使CPU某些芯片的时序而采用的一些机制,比如独立按键、LED灯闪烁等

    单片机时序

    单片机时序就是CPU在执行指令命令时所需控制信号的时间顺序,为了保证各部件间的同步工作,单片机内部电路在唯一的时钟信号下严格的控制时序进行工作。
    振荡周期:为单片机提供定时信号的振荡源的周期又称时钟周期
    状态周期:2个振荡周期为1个状态周期,
    机器周期:1个机器周期含6个状态周期,12个振荡周期。在一个机器周期内,CPU可以完成一个独立的操作。
    指令周期:它是指CPU完成一条操作的所需的全部时间。,它以机器周期为单位

    nop指令

    执行一个_nop_() ,就是一个空操作,占用一个机器周期,也就是12个时钟周期。
    一个机器周期=12/12MHz=1us
    #include<intrins.h>
    Void delay10us() //调用此函数需要执行LACLL指令耗时2个机器周期
    {
    nop();
    nop();
    nop();
    nop();
    nop();
    nop();
    } //结束执行一次RET指令耗时2个机器周期
    Delay10us( )函数中共用了6个NOP ( )语句,每个语句执行时间为1 us。主函数调用Delay10us( )时,先执行个LCALL指令 (2 us),然后执行6个NOP ()语句(6 μs),最后执行了一个RET指令(2μs),所以执行上述函数时共需要10 uS。 可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时,但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 us。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2μs) , 然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us(),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84μs) ,所以,实际延时时间为86 us。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 us。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

    分号“;”和nop指令

    1、两个语句的相同点是都不会有实质上的控制操作;
    2、两个语句的不同点是nop语句执行了就相当于延时一个机器周期(尽管一个机器周期很短),而;仅仅相当于一个格式上的字符,不会执行任何语句,也不会延时,和没有代码的作用一致。
    注:;含义意指在for和while循环中常用。

    Void delay(u16 i) void delay(u16 i)
    { {
    for(;i>0;i–) for(;i>0;i–)
    nop();
    } }

    keil4精确计算时间

    1.设置成开发板晶振,比如12MHz;
    在这里插 入图片描述
    2.设置断点,进入时间仿真,并把时间复位
    (设置断点时,要把你想仿真的语句的前后两个语句都设置成断点,这就好比,一段绳子,切成三段,而我取的是中间那一段,进入仿真按照截图标号依次点击)
    在这里插入 图片描述
    3.开始运行(断点上的箭头是蓝色时代表未开始运行,当变成黄色时代表已运行一次,黄色箭头所指语句代表还未执行此语句,只是执行了箭头上面的语句)
    在这里插入 图片描述4.再次运行,计算delay的运行时间
    在这里插入 图片描述
    注意:这种计算延时时间有一定的误差,因为每次调用延时函数时会浪费一定的时间,每次执行语句达到的延时效果,还要额外加上调用函数所延时的时间,所以与自己设置的延时时间误差值为调用函数所产生的时间,理想设置延时时间=执行两次延时语句-执行一次延时语句,调用函数时间=执行一次延时语句-理想设置延时时间。通过反汇编也可以计算时间,在前面的nop指令,有简单介绍。

    stc烧录软件延时函数

    可以根据自己的需求设置时间,优点:生成代码速度快精准,缺点:不能在代码上灵活的修改延时的时间。
    在这里插入图片描述

    展开全文
  • STM32延时函数的四种方法

    万次阅读 多人点赞 2020-06-12 10:01:15
    单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于STM32F207介绍4种不同方式实现的延时函数。 1、普通延时 这种延时方式应该是大家在51单片机时候,接触最早的...

    目录

    1、普通延时

    2、定时器中断

    3、查询定时器

    4、汇编指令


    单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()。本文基于STM32F207介绍4种不同方式实现的延时函数。

    1、普通延时

    这种延时方式应该是大家在51单片机时候,接触最早的延时函数。这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,在某些编译器下,代码会被优化,导致精度较低,用于一般的延时,对精度不敏感的应用场景中。

    //微秒级的延时
    void delay_us(uint32_t delay_us)
    {    
      volatile unsigned int num;
      volatile unsigned int t;
    
      
      for (num = 0; num < delay_us; num++)
      {
        t = 11;
        while (t != 0)
        {
          t--;
        }
      }
    }
    //毫秒级的延时
    void delay_ms(uint16_t delay_ms)
    {    
      volatile unsigned int num;
      for (num = 0; num < delay_ms; num++)
      {
        delay_us(1000);
      }
    }

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/02-Template

    2、定时器中断

    定时器具有很高的精度,我们可以配置定时器中断,比如配置1ms中断一次,然后间接判断进入中断的次数达到精确延时的目的。这种方式精度可以得到保证,但是系统一直在中断,不利于在其他中断中调用此延时函数,有些高精度的应用场景不适合,比如其他外设正在输出,不允许任何中断打断的情况。

    STM32任何定时器都可以实现,下面我们以SysTick 定时器为例介绍:

    初始化SysTick 定时器:

    /* 配置SysTick为1ms */
    RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);

    中断服务函数:

    void SysTick_Handler(void)
    {
      TimingDelay_Decrement();
    }
    void TimingDelay_Decrement(void)
    {
      if (TimingDelay != 0x00)
      { 
        TimingDelay--;
      }
    }

    延时函数:

    void Delay(__IO uint32_t nTime)
    {
      TimingDelay = nTime;
      while(TimingDelay != 0);
    }

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/02-Template

    3、查询定时器

    为了解决定时器频繁中断的问题,我们可以使用定时器,但是不使能中断,使用查询的方式去延时,这样既能解决频繁中断问题,又能保证精度。

    STM32任何定时器都可以实现,下面我们以SysTick 定时器为例介绍。

    STM32的CM3内核的处理器,内部包含了一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

    SYSTICK的时钟固定为HCLK时钟的1/8,在这里我们选用内部时钟源120M,所以SYSTICK的时钟为(120/8)M,即SYSTICK定时器以(120/8)M的频率递减。SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器。

                                           ▼CTRL:控制和状态寄存器

                                           ▼LOAD:自动重装载除值寄存器

                                            ▼VAL:当前值寄存器

                                     ▼CALIB:校准值寄存器

    使用不到,不再介绍

    示例代码

    void delay_us(uint32_t nus)
    {
      uint32_t temp;
      SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000000/8*nus;
      SysTick->VAL=0X00;//清空计数器
      SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
      do
      {
        temp=SysTick->CTRL;//读取当前倒计数值
      }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
      SysTick->CTRL=0x00; //关闭计数器
      SysTick->VAL =0X00; //清空计数器
    }
    void delay_ms(uint16_t nms)
    {
      uint32_t temp;
      SysTick->LOAD = RCC_Clocks.HCLK_Frequency/1000/8*nms;
      SysTick->VAL=0X00;//清空计数器
      SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
      do
      {
        temp=SysTick->CTRL;//读取当前倒计数值
      }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
      SysTick->CTRL=0x00; //关闭计数器
      SysTick->VAL =0X00; //清空计数器
    }

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/04-Delay

    4、汇编指令

    如果系统硬件资源紧张,或者没有额外的定时器提供,又不想方法1的普通延时,可以使用汇编指令的方式进行延时,不会被编译优化且延时准确。

    STM32F207在IAR环境下

    /*!
     *  @brief 	软件延时 
     *  @param	ulCount:延时时钟数
     *  @return none
     *	@note 	ulCount每增加1,该函数增加3个时钟
     */
    void SysCtlDelay(unsigned long ulCount)
    {
        __asm("    subs    r0, #1\n"
              "    bne.n   SysCtlDelay\n"
              "    bx      lr");
    }

    这3个时钟指的是CPU时钟,也就是系统时钟。120MHZ,也就是说1s有120M的时钟,一个时钟也就是1/120 us,也就是周期是1/120 us。3个时钟,因为执行了3条指令。

    使用这种方式整理ms和us接口,在Keil和IAR环境下都测试通过。

    /*120Mhz时钟时,当ulCount为1时,函数耗时3个时钟,延时=3*1/120us=1/40us*/
    /*
    SystemCoreClock=120000000
    
    us级延时,延时n微秒
    SysCtlDelay(n*(SystemCoreClock/3000000));
    
    ms级延时,延时n毫秒
    SysCtlDelay(n*(SystemCoreClock/3000));
    
    m级延时,延时n秒
    SysCtlDelay(n*(SystemCoreClock/3));
    */
    
    #if defined   (__CC_ARM) /*!< ARM Compiler */
    __asm void
    SysCtlDelay(unsigned long ulCount)
    {
        subs    r0, #1;
        bne     SysCtlDelay;
        bx      lr;
    }
    #elif defined ( __ICCARM__ ) /*!< IAR Compiler */
    void
    SysCtlDelay(unsigned long ulCount)
    {
        __asm("    subs    r0, #1\n"
           "    bne.n   SysCtlDelay\n"
           "    bx      lr");
    }
    
    #elif defined (__GNUC__) /*!< GNU Compiler */
    void __attribute__((naked))
    SysCtlDelay(unsigned long ulCount)
    {
        __asm("    subs    r0, #1\n"
           "    bne     SysCtlDelay\n"
           "    bx      lr");
    }
    
    #elif defined  (__TASKING__) /*!< TASKING Compiler */                           
    /*无*/
    #endif /* __CC_ARM */

    上述工程源码仓库:https://github.com/strongercjd/STM32F207VCT6/tree/master/03-ASM

     

    备注:

    理论上:汇编方式的延时也是不准确的,有可能被其他中断打断,最好使用us和ms级别的延时,采用for循环延时的函数也是如此。采用定时器延时理论上也可能不准确的,定时器延时是准确的,但是可能在判断语句的时候,比如if语句,判断延时是否到了的时候,就在判断的时候,被中断打断执行其他代码,返回时已经过了一小段时间。不过汇编方式和定时器方式,只是理论上不准确,在实际项目中,这两种方式的精度已经足够高了。

     

    点击查看本文所在的专辑,STM32F207教程

     

    关注公众号,第一时间收到文章更新。评论区不能及时看到,需要交流可以到公众号沟通

    展开全文
  • 430延时函数

    2011-10-30 10:25:01
    430延时函数,精确延时 430延时函数
  • M3延时函数

    2013-04-21 17:07:01
    M3延时函数
  • 间隔函数延迟函数

    2018-10-17 17:27:06
    间隔函数: setInterval(间隔多长事件要执行的...setTimeout(延迟要执行的函数,延迟时间) 只执行1次,也是异步 返回值,就是系统给延迟函数的ID,清除的时候要用 清除间隔函数: cleartimeout(延迟函数ID) clearInter...

    间隔函数:

    setInterval(间隔多长事件要执行的函数,间隔多少毫秒)
    间隔函数调用方式是异步的,间隔函数不会阻塞后面内容的执行
    返回值,就是系统给间隔函数的ID,清除的时候要用

    延迟函数:

    setTimeout(延迟要执行的函数,延迟时间)
    只执行1次,也是异步
    返回值,就是系统给延迟函数的ID,清除的时候要用

    清除间隔函数:

    cleartimeout(延迟函数ID)
    clearInterval(间隔函数id)

    顺便说一下同步与异步的区别:
    同步:
    同步的方式就是,一定会等待某个子程序执行,直到程序执行完毕之后再处理其他事情。

    异步:
    异步不会等待,而是直接去做其他事情,直到子程序结束之后,才会重新接手子程序事情。

    展开全文
  • 延时函数程序

    2014-05-14 16:10:25
    stm32的延时函数 /修正了中断中调用出现死循环的错误 //防止延时不准确,采用do while结构! ////////////////////////////////////////////////////////////////////////////////// static u8 fac_us=0;//us延时倍...
  • 在delphi中使用的延时函数。就像c语言、单片机中编写的延时函数那样使用。
  • 延时函数合集

    2015-05-26 16:17:48
    收集了各种网上关于延时函数的资料编写出来的,希望能分享给大家
  • 本文主要简单介绍了51单片机的延时函数
  • js延时函数 JS延时

    2013-08-01 12:13:02
    js延时函数 JS延时执行 JS延时执行代码
  • 1. c语言延时函数delay,怎么算延时下面是delay 函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为这个,在延迟函数里...
  • 延时函数介绍

    千次阅读 2021-02-05 16:47:03
    文章目录基本介绍一、sleep二、usleep三、mdelay四、udelay五、ndelay 在操作系统中和单片机处理延时方式就完全不一样了,不可能是使用for循环浪费系统资源。...Linux 内核中用到的延时函数在“#incl
  • C#延时函数

    2021-05-07 10:42:46
    C#延时函数——亲测有效 C#构建的一种延时函数,亲测有效。 //构建延时函数 public void Delay(double delayTime) { DateTime now = DateTime.Now; double s; do { TimeSpan spand = DateTime.Now - now;
  • 延时函数vbnet

    2015-05-19 15:12:08
    vbnet写的延时函数 Sub DelayTime(ByVal tms毫秒 As Integer) Dim st As Long = Now.Ticks Dim st1 As Long = Now.Ticks Dim st2 As Integer = 0 Do st2 = CInt((st1 - st) / 10000) Select Case st2 - tms...
  • FPGA 延时函数

    2014-06-30 22:32:44
    FPGA 延时函数模块,方便封装位模块,输入输出引脚,直接用于其他需呀延时的用途。
  • STM32延时函数

    2014-01-06 14:42:14
    STM32延时函数,包括毫秒级延时函数和微秒级延时函数两个函数,微妙延时函数延时误差为百分之一,即延时100微妙比实际值少1微妙。
  • 单片机常用延时函数

    2015-08-26 17:02:54
    单片机常用的C语言延时函数,精确延时,有14种延时时间可供选择
  • LInux驱动 延时函数

    2021-02-06 09:45:02
    本章文涉及到驱动中使用的延时函数以及延时函数的相关信息。分别举例说明了 应用中的延时函数 和 驱动程序中的延时函数。 包括说明了 驱动程序延时函数中的 阻塞延时函数 和非阻塞延时函数
  • 本文给大家分享了51单片机精确延时函数集锦。
  • Delphi延时函数

    2011-01-23 09:47:41
    Delphi延时函数,能够在延时的同时响应线程消息。
  • Linux 延时函数

    2020-05-26 11:04:10
    有一些延时函数写法非常占用CPU,比如while(gettime()>timeSet){},在Linux中应当尽量使用系统调用执行延时,在延时等待期间执行一次进程调度,降低延时函数的CPU占用率。 Linux中的延时函数有sleep,usleep和...
  • 万能延时函数

    2014-09-28 17:42:58
    很好用很全的延时函数 用的时候只需要改动下参数就可以了 非常好用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 440,561
精华内容 176,224
关键字:

延迟函数