在手机或嵌入式系统中,定时器是一种非常实用的功能,它可以帮助我们实现精确的时间控制。本文将介绍如何在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语言中实现定时器功能,包括硬件定时器和软件定时器。通过使用回调函数,我们可以方便地处理定时事件。在实际应用中,可以根据具体需求选择合适的定时器实现方式。
