timer.h
/**************************** 文件说明 ******************************** @文件名:timer.h @文件类型:库文件 @模块功能描述:定义和声明了一些关于定时器相关的数据类型和方法 @作者:丁立鑫 @时间:3/3/2019 7:11:59 PM @版本:TimerV1.0 *************************************************************/ #ifndef _TIMER #define _TIMER /*************************** 包含头文件 *********************************/ #ifndef _STDBOOL #include<stdbool.h> #endif /**************************** 宏定义 ********************************/ #define TIMER0_DELAY 3000 #define TIMER1_DELAY 2000 #define TIMER2_DELAY 2000 #define TIMER3_DELAY 2000 #define TIMER4_DELAY 2000 /**************************** 结构体定义 ********************************/ typedef struct{ bool flag; unsigned long delay; char des[250]; }Timer; /**************************** 变量定义 ********************************/ extern Timer timer[]; /**************************** 方法声明 ********************************/ /* @方法名:timerHandler @brief 对定时器的开关进行判断,当定时器时间溢出时开启定时器的开关 补充:这里的定时器是递减型的 @param: 1. timerP 表示传入的定时器数组名 2. timerNum 表示定时器数组的元素个数 @retval void @date 3/3/2019 7:30:38 PM */ void timerFlagHandler(); /* @brief 对定时器的计时值进行递减操作 @param timer_change 计时值每次递减的值 **/ void timerDec(unsigned int timer_change); /************************************************************/ #endif
timer.c
#include"timer.h" /*
说明:只将需要使用的定时器的flag置为false
*/ Timer timer[] = { {false,TIMER0_DELAY,"计数器0"}, {true,TIMER1_DELAY,"计数器1"}, {true,TIMER2_DELAY,"计数器2"}, {true,TIMER3_DELAY,"计数器3"}, {true,TIMER4_DELAY,"计数器4"} }; static int timerNum = sizeof(timer) / sizeof(Timer);//求timer数组的元素个数 /* @brief 对定时器的开关进行判断,当定时器时间溢出时开启定时器的开关 补充:这里的定时器是递减型的 @param: 1. timerP 表示传入的定时器数组名 2. timerNum 表示定时器数组的元素个数 @retval void @date 3/3/2019 7:30:38 PM */ void timerFlagHandler() { int i; for(i=0;i<timerNum;i++){ timer[i].flag = timer[i].delay <= 0?true:false;
} } void timerDec(unsigned int timer_change) { int i_loop; for (i_loop = 0; i_loop < timerNum; i_loop++) { if (timer[i_loop].delay > 0) {//当falg为false时,计数值开始递减 timer[i_loop].delay -= timer_change; } } }
说明:
这样做的效果是:定时器每隔一段时间会触发一次,特点是如下图所示:
他会存在首次触发之前也会延时一段时间,那么当我们不需要这段时间的时候应该怎么做呢?
以timer[0]为例:
第一步:将TIMER0_DELAY设置为0
第二步:将判断语句
if(timer[0].flag){ timer[0].flag = false; tiemr[0].delay = TIMER0_DELAY; } 改成: if(timer[0].flag){ timer[0].flag = false; tiemr[0].delay = 你想延时的时间(如:1000); }
建议:
在判断定时器开关的时候可以直接这样判断:
if(timer[0].delay <= 0){ //... } 而不要: if(timer[0].flag){ //... }
这样做的好处就是定时器中不必再写方法timerFlagWork();
这样可以减小定时器的负担