C语言delay函数延时计算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言delay函数延时计算相关的知识,希望对你有一定的参考价值。

参考技术A

C语言delay函数延时计算源代码如下:

#include "stdlib.h"

void delay()

time_t start,end;

start=time(null);

unchar i;

while(z--)

for(i=0;i<121;i++);

end=time(null);

printf("%f",difftime(end,start));

扩展资料

1、对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。

对于循环语句同样可以采用for,do?while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。

常用延时(睡眠)函数

琐碎代码1——延时函数

ARM:

delay:
    ldr r3, =100000
    ldr r4, =0x0
delay_loop:    
    sub r3, r3, #1                //r3 = r3 -1
    cmp r3, r4                    // cmp会影响Z标志位,如果r4等于r3则Z=1,下一句中eq就会成立
    bne delay_loop
    mov pc, lr                    // 函数调用返回

C/C++:

void delay(unsigned int t)
{
    unsigned int step = 0;
    int tick = 10000;
    for(step = 0; step < t ; step ++)
    {
        while(tick)
            tick--;
    }
}

Qt:

void CANThread::sleep(unsigned int msec)
{
   QTime dieTime = QTime::currentTime().addMSecs(static_cast<int>(msec));
   while( QTime::currentTime() < dieTime )
       QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}

stm32中断型:

volatile uint32_t time_delay; // 延时时间,注意定义为全局变量
//延时n_ms
void delay_ms(volatile uint32_t  nms)
{
    //SYSTICK分频--1ms的系统时钟中断
    if (SysTick_Config(SystemFrequency/1000))
    {
        while (1);
    }
    time_delay=nms;//读取定时时间
    while(time_delay);
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}
//延时nus
void delay_us(volatile unsigned long nus)
{
 //SYSTICK分频--1us的系统时钟中断
    if (SysTick_Config(SystemFrequency/1000000))
    {
   
        while (1);
    }
    time_delay=nus;//读取定时时间
    while(time_delay);
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}
 
    //在中断中将time_delay递减。实现延时
 
void SysTick_Handler(void)
{
    if(time_delay)
        time_delay--;
}

  使用时注意传参的范围(uint32_t)。

 

stm32非中断(使用cortex System timer)

  技术图片

 

 

 

void delay_us(uint32_t nus)
{
    uint32_t temp;
    SysTick->LOAD = 9*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 = 9000*nms;  //此处结合自己系统的时钟
    SysTick->VAL=0X00;//清空计数器
    SysTick->CTRL=0X01;//使能,
    do
    {
        temp=SysTick->CTRL;//读取当前倒计数值
    }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}        

  注意:延时有最大事件限制,具体使用根据实际系统

以上是关于C语言delay函数延时计算的主要内容,如果未能解决你的问题,请参考以下文章

51单片机C语言程序中延时函数delay的原理是啥?

C语言怎么写延时函数,精确到毫秒

在C语言程序中,延时函数的时间是怎么算的?

51单片机C语言中delay函数是怎么定义和使用的?

C语言中 delay 函数如何运用?

delay500延迟了多少秒