问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

单片机C语言延时函数的三种实现方式

创作时间:
作者:
@小白创作中心

单片机C语言延时函数的三种实现方式

引用
1
来源
1.
https://docs.pingcode.com/baike/1281675

在单片机编程中,延时函数是实现各种控制逻辑的基础。本文将详细介绍三种常见的延时实现方式:循环延时、定时器延时和硬件延时,并通过具体代码示例帮助读者理解其原理和应用场景。

循环延时

循环延时是最简单的一种延时方式,它通过执行一个无意义的空循环来达到延时的目的。这种方法的优点是实现简单,不需要额外硬件资源,易于理解和调试。但缺点是精度较低,容易受编译器优化影响,且会占用CPU资源,无法执行其他任务。

下面是一个典型的循环延时函数示例:

void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 120; j++) {
            // 空循环,具体次数根据单片机主频调整
        }
    }
}

定时器延时

定时器延时通过设置单片机的定时器来实现更精确的延时。这种方法的优点是高精度,受编译器影响较小,CPU可以执行其他任务,提高系统效率。但缺点是需要占用定时器资源,代码复杂度较高,硬件相关性强。

初始化定时器

首先,需要初始化定时器,这一步通常在主函数或初始化函数中完成。

void timer_init() {
    // 假设使用的是STM32单片机的TIM2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟
    TIM_TimeBaseInitTypeDef timerInitStructure;
    timerInitStructure.TIM_Prescaler = 8399; // 预分频器
    timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    timerInitStructure.TIM_Period = 9999; // 自动重装载值
    timerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    timerInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &timerInitStructure);
    TIM_Cmd(TIM2, ENABLE);
}

延时函数

基于定时器的延时函数可以利用定时器计数来实现。

void delay_ms(unsigned int ms) {
    TIM_SetCounter(TIM2, 0); // 计数器清零
    TIM_Cmd(TIM2, ENABLE);   // 启动定时器
    while (TIM_GetCounter(TIM2) < ms); // 等待定时器计数达到目标值
    TIM_Cmd(TIM2, DISABLE);  // 关闭定时器
}

硬件延时

某些单片机自带硬件延时功能或专用延时芯片,可以利用这些硬件资源实现延时。这种方法的优点是高精度、低CPU占用,但需要额外硬件支持。

SysTick延时函数

以下是一个基于ARM Cortex-M系列单片机的SysTick延时函数示例:

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

void delay_ms(unsigned int ms) {
    TimingDelay = ms;
    while (TimingDelay != 0);
}

void init_systick() {
    if (SysTick_Config(SystemCoreClock / 1000)) {
        // 配置失败处理
    }
}

结合具体应用选择合适的延时方法

在实际应用中,我们需要根据具体情况选择合适的延时方法。

  • 简单控制应用:如果仅仅是实现一些简单的控制,例如LED闪烁、按键扫描等,可以选择循环延时。它实现简单,不需要额外的硬件资源。
  • 实时控制系统:在需要高精度和实时性的控制系统中,例如电机控制、数据采集等,定时器延时或硬件延时是更好的选择。它们能够提供更高的精度,并且不会占用CPU资源。
  • 多任务系统:在多任务系统中,例如基于RTOS的应用,建议使用定时器延时或硬件延时,以便在延时期间CPU可以执行其他任务,提高系统效率。

延时函数优化技巧

在实现延时函数时,可以采用一些优化技巧来提高性能和精度:

  • 避免过多的空循环:在循环延时函数中,尽量减少空循环次数,以提高执行效率。可以通过调整循环次数和嵌套层数来优化。
  • 使用硬件定时器:尽量使用硬件定时器来实现延时,以提高精度和减少CPU占用。硬件定时器能够提供更高的精度,并且不会占用CPU资源。
  • 考虑编译器优化:在编写延时函数时,需要考虑编译器优化的影响。可以通过使用volatile关键字或禁止优化来确保延时函数的精度。
volatile unsigned int delay_count;

void delay_ms(unsigned int ms) {
    delay_count = ms;
    while (delay_count != 0);
}

总结

单片机延时函数的实现有多种方式,包括循环延时、定时器延时和硬件延时。每种方法都有其优缺点,需要根据具体应用选择合适的方法。在实现延时函数时,可以采用一些优化技巧来提高性能和精度。通过合理选择延时方法和优化技巧,可以在单片机编程中实现高效、精确的延时功能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号