精华内容
下载资源
问答
  • 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

    展开全文
  • 延时函数

    千次阅读 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烧录软件延时函数

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

    展开全文
  • 延时函数介绍

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


    在操作系统中和单片机处理延时方式就完全不一样了,不可能是使用for循环浪费系统资源。而是有专门的接口函数。

    基本介绍

    Linux 中常用的函数有以下函数 sleep、usleep、ndelay、udelay、mdelay 等

    Linux 系统编程下用到的延时函数在头文件“#include <unistd.h>”中,包括函数 sleep、
    usleep。
    Linux 内核中用到的延时函数在“#include <linux/delay.h>”中,包括函数 ndelay、
    udelay、mdelay。

    sleep系列是在系统编程中使用

    一、sleep

    函数 sleep 是秒延时。函数原型如下:

    unsigned int sleep(unsigned int seconds);
    例如:sleep(1),即延时一秒。
    返回无符号的整形数值,如果延时成功则返回 0,如果延时过程中被打断,则返回剩余的
    秒数。例如 sleep(5),返回值为 3,那么实际延时就是 5-3=2 秒。
    

    二、usleep

    函数 usleep 是微妙延时。函数原型如下:

    int usleep(useconds_t usec);
    Useconds 需要小于 1000000
    例如:usleep(10),表示延时 10 微秒。
    延时成功则返回 0,失败则返回-1
    

    函数 delay 系列是在 Linux 内核中用的,也就是在 linux 驱动中,会用到。

    三、mdelay

    函数 mdelay 是毫秒延时,函数原型如下:

    void mdelay(unsigned long msecs);
    例如:mdelay(10),表示延时 10 毫秒。
    

    四、udelay

    函数 udelay 是微秒延时,函数原型如下:

    void udelay(unsigned long usecs);
    例如:udelay(5),表示延时 5 微秒。
    

    五、ndelay

    函数 ndelay 是纳秒延时,函数原型如下:

    void ndelay(unsigned long nsecs);
    例如:ndelay(3),表示延时 3 纳秒。
    
    展开全文
  • 本博文讨论的是芯片不运行操作系统的情况下完成1s的延时功能; 如有不足之处还请多多指教; SysTick—系统滴答定时器是什么? 是一个24位的硬件倒计数定时器; SysTick的功能是什么?(分两种情况) 芯片...

    前言

    1. 博文基于STM32F103ZET6和标准固件库V3.5.0在MDK5环境下开发;
    2. 本博文讨论的是芯片不运行操作系统的情况下完成1s的延时功能;
    3. 如有不足之处还请多多指教;

    SysTick—系统滴答定时器是什么?

    是一个24位的硬件倒计数定时器;

    SysTick的功能是什么?(分两种情况)

    1. 芯片运行操作系统(UCOS)情况下做:为操作系统(例如UCOS)提供硬件上的定时中断(滴答中断),作为整个系统的时基,为多个任务分配不同的时间片,确保不会出现一个任务霸占系统的情况;或者把每个定时器周期的某个时间范围赐予特定的任务等;还有操作系统提供的各种定时功能;
    2. 不运行操作系统,单纯做定时器:提供精准的定时功能;

    SysTick的特点

    1. 和以往的外设定时器不同,SysTick这个定时器以及相关寄存器在CM3内核里。《STM32使用手册》里对并没有涉及SysTick的内容,只能去《Cortex-M3权威指南》看(PDF的133页);寄存的可寻址,且寄存器被定义在程序包中的core_m3.c 中,涉及相关的编程时一定要注意;
    2. 可以工作在芯片的睡眠状态下;
    3. SysTick被捆绑在NVIC(中断向量控制器)中,可以产生异常(异常号:15),这是在操作系统下为系统提供时间基准的必要条件;
    4. 每个CM3内核都含有一个SysTick,这样方便程序移植;
    5. SysTick时钟源的选择可以来自于外部,也可以来自于内部;使用来自外部的时钟源的时候要根据具体芯片生产厂商的手册;(本博文采用外部时钟源)

    SysTick的四个相关寄存器(图片摘取《Cortex-M3权威指南》)

    CTRL控制及状态寄存器

    在这里插入图片描述
    描述中解释的都很清楚,这里强调两个重要的点:

    1. 位[16]:只能读,不能写,算是一个状态位;如果计数器达到0,则读入为1;当读取或清除当前计数器值时,将自动清除为0;
    2. 地址:0xE000E010 ,这是本寄存器地址,一会编程的时候要用到;
    LOAD重装载数值寄存器

    在这里插入图片描述

    VAL当前值寄存器

    在这里插入图片描述

    CALIB校准数值寄存器(这个寄存器在本博客中用不到)

    在这里插入图片描述

    SysTick时钟源的选择(两个)

    在这里插入图片描述
    在红框处,其实我是有疑问的:红框处提供的有3个时钟源HCLK,HCLK/8,FCLK;从名字上来看,FCLK似乎就是上面提到的SysTick的CTRL寄存器中时钟源可选择的内核时钟;但是从标准库函数提供的函数名上来看,提供内核时钟的是HCLK时钟源,提供外部时钟的是HCLK/8时钟源;看如下代码:

    /*此段为我自己写的,为初始化SysTick*/
    void delay_Init(void)
    {
    	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置SysTick时钟源为外部时钟源--HCLK/8;
    	fac_us=SystemCoreClock/8000000;     //系统内核时钟,即CM3的时钟;
    	fac_ms=(u16)fac_us*1000;					
    }
    
    /*此段代码为库文件 misc.c中关于配置SysTick时钟源的函数*/
    void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
    {
      /* Check the parameters */
      assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
      if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
      {
        SysTick->CTRL |= SysTick_CLKSource_HCLK;   //0x00000004  选择时钟源为内部时钟源
      }
      else
      {
        SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;  //0xFFFFFFFB  选择时钟源为外部时钟源
      }
    }
    
    /*此段代码是misc.h文件中的关于时钟源的选项*/
    #define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)
    #define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)
    #define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \
                                           ((SOURCE) == SysTick_CLKSource_HCLK_Div8))
    
    

    从以上三段代码来看: SysTick_CLKSource_HCLK_Div8SysTick_CLKSource_HCLK是配置CTRL时钟源选择的值,由于这两个符号里都包含HCLK,所以我认为,SysTick的时钟源就来自于上面时钟框图中的HCLK和HCLK/8(先这么理解着,即使理解的不对,并不影响这个程序的进行,因为HCLK和FCLK的时钟频率是一样的,只是名字不同而已)

    好了,关系都捋清了,只差代码了;

    SysTick的配置和1s延时

    配置步骤:(这一个函数的执行从头到尾就是1s)

    1. 配置SysTick时钟源;
    2. 获取SysTick计数器递减周期(每个周期计数器减一),这个需要计算;
    3. 根据上面的递减周期配置重载寄存器LOAD;
    4. 清零当前值寄存器VAL;
    5. 使能定时器(使能CTRL寄存器使能位);
    6. 等待VAL递减到0,从而CTRL寄存器的计数标志位COUNTFLAG被置1;
    7. 延时完成,函数的最后关闭定时器(关闭CTRL寄存器使能位);
    8. 函数结束;

    所以综合叙述一下就是,先配置时钟源,有了时钟源就能确定当前值寄存器VAL递减周期,然后根据递减周期与1s之间的算数关系配置重载寄存器,然后使能寄存器后只需检测CTRL寄存器的计数标志位即可,

    1s延时代码:

    #include <stm32f10x.h>
    
    u32 fac_us;
    u32 fac_ms;
    
    void delay_Init(void)
    {	/*
    	配置时钟源为外部HCLK/8,经标准库初始化后的HCLK = 72MHz,
    	即SysTick计数器的时钟源频率为72MHz/8 = 9MHz,即每9M个方波就是1s(秒基准),
    	每9000个脉冲1ms(毫秒基准),每9个秒冲就是1us(微妙基准);
    	所以我们可以认为当前值寄存器VAL的递减周期就是:每(1/9)us就减1;即每经过1us,经过了9个方波;
    	*/
    	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 
    	fac_us=SystemCoreClock/8000000;     //最终fac_us=9;
    	fac_ms=fac_us*1000;							//fac_ms = 9000;			
    }
    
    void delay_us(u32 nus)  
    {																						//注意这里的SysTick变量是结构体指针变量;
    	SysTick->LOAD=nus*fac_us;   									//将要定时的时间(nus*fac_us)装载重载寄存器;
    	SysTick->VAL =0x00;         											//清零当前值寄存器;
    	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; 	//使能控制寄存器(CTRL),开启定时器;
    	while((SysTick->CTRL) >> 16 != 1);				          //等待被重新转载后的当前值寄存器递减到0,从而使得控制寄存器的计数标志位被置1;
    
    	SysTick->CTRL |= SysTick_CTRL_ENABLE_Pos;  //关闭计数器(注意运算符是|=,这一点一定要特别注意,因为此处配置的是CTRL寄存器,小心把其他位也给配置了,下面的程序也是一样)
    }
    
    void delay_ms(u32 nms)   //含义和上面一样;  当nms=1000是即可获得1s延时;
    {		
    	SysTick->LOAD=nms*fac_ms;
    	SysTick->VAL =0x00;
    	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
    	while((SysTick->CTRL) >> 16 != 1);
    
    	SysTick->CTRL |= SysTick_CTRL_ENABLE_Pos;       	
    } 
    
    展开全文
  • vxWorks延时函数

    千次阅读 2019-07-11 14:14:17
    在应用编程的时候,通常会碰到需要一个任务在特定的延时之后执行一个指定的动作,如等待外设以确保数据可靠,控制扬声器发声时间以及串口通信超时重发等。这就需要利用定时器机制来计量特定长度的时间段。 vxWorks...
  • FreeRTOS延时函数

    2020-08-06 20:17:08
    vTaskDelay() 相对延时函数 vTaskDelay()延时固定数量的tick中断,将调用任务置于阻塞状态。(vTaskDelay() 函数只有在宏 INCLUDE_vTaskDelay 置1时才可用) void vTaskDelay( TickType_t xTicksToDelay ); **参数...
  • QT的延时函数

    万次阅读 2019-07-20 20:31:08
    延时函数在收发数据的时候用处很大,在其他方面也有用处 这里提供四种方法: 1、多线程程序 使用QThread::sleep()或者QThread::msleep()或QThread::usleep()或QThread::wait()进行延时处理。Sleep不会释放对象锁,...
  • stm32粗延时和精准延时函数

    千次阅读 2019-05-02 16:03:46
    1.stm32粗延时函数 粗延时的意思就是延时时间不太准确,一般用在对延时时间要求不严格的场合。这种延时方式是采用软件延时,但因为编译器会在编译的时候加上一些其他辅助指令,所以不能确定C程序的准确运行时间。...
  • Qt 延时函数

    千次阅读 2019-06-19 14:50:57
    Qt延时函数分为两大类,一类是阻塞当前线程,另一类是不阻塞当前线程。 一,阻塞当前线程 1,使用QElapsedTimer 头文件:#include <QElapsedTimer> void Widget::delay_3(int msec) { QElapsedTimer t; t...
  • 延时函数编写

    千次阅读 2018-04-23 17:25:42
    简单的延时函数:函数声明:void Delay(_IO u32 nCount) { for(;nCount!=0;i--)}函数调用:while(1) { ...; LED1(ON); Delay(0XFFFEF); }2.C语言函数使用规范:return_type/*类型*/ function_name/*函数名*/( ...
  • ESP8266 01S延时函数

    2019-12-29 10:19:11
    文章目录学习记录延时函数API利用us函数定义ms函数每500ms输出字符串效果后记 学习记录 ESP8266 01S延时函数 延时函数API 最大值 65535 μs 利用us函数定义ms函数 void ICACHE_FLASH_ATTR delay_ms(u32 C_time) { ...
  • STM32 HAL库方式的微秒延时函数

    万次阅读 多人点赞 2019-11-06 10:22:15
    STM32CUBEMX系列教程之HAL库方式的微秒延时函数 标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库官方使用SysTick的地方非常多,改代码容易引起错乱。网上的代码使用定时器进行微秒级别延时(不知道该...
  • 在裸机(以stm32为例)编程中,常用的延时方法如下: 1.循环法 void delay_us(u16 time) { u16 i=0; while(time–) { i=10; //自己定义 while(i–) ; } } //毫秒级的延时 void delay_ms(u16 time) { u16 i=0; while...
  • Linux延时函数

    万次阅读 2013-08-28 20:19:19
    代码编写经常会涉及到延时处理,而Linux环境下系统最常用的延时函数不过如下几个sleep/usleep/nanosleep,分别提供秒级、微秒级、纳秒级延时功能,这几个函数我们几乎天天都在使用,但我们是否准确安全的使用了他们...
  • c语言编写的延时函数

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

    千次阅读 2020-07-15 09:59:17
    在实现单片机功能的时候,经常会用到延时函数,那么延时函数的原理也是非常有必要了解的。一般我们写延时函数的时候,默认的晶振频率fosc=12MHZ,而机器周期T=12/fosc=1us。 这里我们来写一个10ms的延时函数: void ...
  • 自定义js 延时函数调用延时函sleep(); //调用延时函数 2秒后,程序往下执行; sleep(2000); //自定义js 延时 var t = Date.now(); function sleep(d){ while((Date.now() - t) &lt;=parseInt( d)){ }; ...
  • STM32中通过普通延时函数来精确延时

    万次阅读 多人点赞 2017-03-05 15:13:17
    在STM32中处处会用到延时函数,一般而言,对于普通的控制延时,并不会要求特别精确,所以可以使用普通的延时函数,例如 void delay(u32 time) { while(time--); } 但是在某些情况下,例如读取传感器数据,就需要...
  • 单片机中的延时函数

    千次阅读 2017-06-12 21:50:43
    在单片机的设计中延时函数最是常见,比如流水灯的时间控制等都需对时间进行控制,因此博主贴出一个简单的延时函数供参考./************************************************************/ // 通过延时函数实现数码管...
  • 51单片机延时函数

    万次阅读 2017-10-15 17:23:52
    #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned long u32; typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; /*定义变量及数组*/ u16 j=0;u...
  • C语言 | 延时函数(Delay)

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

    2020-04-06 21:26:35
    sleep 在Linux下,sleep(2000); windows下,_sleep(2000); 另外, 在windows下,system(“pause”); 也可以达到终端停留的效果,这种做法下 终端不会主动退出。 ...
  • 延时函数delay_us

    2021-04-20 13:21:31
    定义:微秒延时函数 参数; //udelay--输入--微秒 */ void delay_us(uint32_t udelay) { uint32_t startval,tickn,delays,wait; startval = SysTick->VAL; tickn = HAL_GetTick(); delays =udelay * 48; //...
  • 定时器与延时函数

    万次阅读 2018-05-05 09:29:12
    STM32定时器包含基本定时器、通用定时器和高级定时器,其中TIM6和TIM7是STM32当中的基本定时器,作为初学者,先从最基本的学起最容易,下面我们用这个定时器实现毫秒延时函数来入门STM32定时器的应用。学习单片机,...
  • Linux内核的延时函数

    千次阅读 2018-08-01 08:51:10
    第一类延时函数原型是:(忙等) ( 头文件是 #include
  • C++之延时函数的研究

    2014-12-23 15:45:37
    从论坛上转来的: (—)使用_sleep()函数  #include using namespace std;...//延时5秒  (二)使用Delay(int time)函数  #include void Delay(int time)//time*1000为秒数  {  clock_t
  • 内核延时函数

    千次阅读 2015-03-12 23:09:13
    1) msleep:实现毫秒级的延时,该延时保证至少延时所设置的延时时间,不会提前超时返回,会让出CPU void msleep(unsigned int msecs) { unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout) ...
  • HAL 库有提供延时函数,只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时。 下面我们列出HAL 库实现延时相关的函数。首先是功能配置函数: //调用 HAL_SYSTICK_Config 函数配置每隔 1ms 中断一次 __weak ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,236
精华内容 34,494
关键字:

怎么定义延时函数