在手机或嵌入式系统中,定时器是一种非常实用的功能,它可以帮助我们实现精确的时间控制。本文将介绍如何在C语言中实现一个简单的定时器,并使用回调函数来处理定时事件。

定时器原理

定时器的基本原理是利用硬件计数器(如计时器/计数器)来记录时间。当计数器达到预设的值时,会触发一个中断,然后执行相应的回调函数。

硬件定时器

大多数微控制器都内置了硬件定时器。以下是一个使用8051微控制器的示例:

#include <reg51.h>

// 初始化定时器
void Timer0_Init() {
    TMOD &= 0xF0; // 设置定时器模式
    TMOD |= 0x01; // 定时器0工作在模式1
    TH0 = 0xFC;   // 设置定时器初值
    TL0 = 0x18;   // 定时器初值
    ET0 = 1;      // 开启定时器0中断
    EA = 1;       // 开启全局中断
    TR0 = 1;      // 启动定时器0
}

// 定时器0中断服务程序
void Timer0_ISR(void) interrupt 1 {
    TH0 = 0xFC;   // 重新加载定时器初值
    TL0 = 0x18;
    // 执行回调函数
    Timer0_Callback();
}

// 回调函数
void Timer0_Callback() {
    // 用户自定义的定时器回调函数
}

软件定时器

如果硬件定时器不满足需求,可以使用软件定时器。以下是一个使用C语言实现的软件定时器示例:

#include <stdio.h>
#include <time.h>

// 软件定时器结构体
typedef struct {
    unsigned long interval; // 定时器间隔(毫秒)
    void (*callback)(void); // 回调函数
} Timer;

// 软件定时器数组
#define TIMER_COUNT 10
Timer timers[TIMER_COUNT];
int timer_count = 0;

// 软件定时器初始化
void Timer_Init() {
    timer_count = 0;
}

// 创建软件定时器
void Timer_Create(unsigned long interval, void (*callback)(void)) {
    if (timer_count < TIMER_COUNT) {
        timers[timer_count].interval = interval;
        timers[timer_count].callback = callback;
        timer_count++;
    }
}

// 定时器中断服务程序
void Timer_ISR(void) {
    static unsigned long timer_tick = 0;
    timer_tick++;
    for (int i = 0; i < timer_count; i++) {
        if (timer_tick >= timers[i].interval) {
            timers[i].callback();
            timer_tick -= timers[i].interval;
        }
    }
}

// 回调函数
void Timer_Callback() {
    // 用户自定义的定时器回调函数
    printf("Timer callback called!\n");
}

总结

本文介绍了如何在C语言中实现定时器功能,包括硬件定时器和软件定时器。通过使用回调函数,我们可以方便地处理定时事件。在实际应用中,可以根据具体需求选择合适的定时器实现方式。