第八集 定时器周期性调度任务
数组
- 定义
类型 名称[长度] = {数值};
- 使用
赋值:名称[索引] = 数值;

文件的创建(.c和.h)
创建程序文件三步,把硬件需要的初始化弄到一个config.c
新建文件并保存
添加到工程
添加引用路径
一般一个.c和一个.h文件执行一个外设或者一个任务或功能。这样可以让代码看起来简洁明了
以下是通过定时器,实现LED0,LED1和LED2以0.5S 1S 2S的频率亮灭
task.h
#ifndef __TASK_H_
#define __TASK_H_
/* Includes ------------------------------------------------------------------*/
#include "type_def.h"
#include ".\led\led.h"
//========================================================================
// 本地变量声明
//========================================================================
typedef struct
{
u8 Run; //任务状态:Run/Stop
u16 TIMCount; //定时计数器
u16 TRITime; //重载计数器
void (*TaskHook) (void); //任务函数
} TASK_COMPONENTS;
//========================================================================
// 外部函数和变量声明
//========================================================================
void Task_Marks_Handler_Callback(void);
void Task_Pro_Handler_Callback(void);
#endif
task.c
#include "task.h"
//========================================================================
// 本地变量声明
//========================================================================
static TASK_COMPONENTS Task_Comps[]=
{
//状态 计数 周期 函数
{0, 500, 500, LED0_blink}, /* task 1 Period: 500ms */
{0, 1000, 1000, LED1_blink}, /* task 2 Period: 1000ms */
{0, 2000, 2000, LED2_blink} /* task 3 Period: 2000ms */
};
u8 Tasks_Max = sizeof(Task_Comps)/sizeof(Task_Comps[0]);
//========================================================================
// 函数: Task_Handler_Callback
// 描述: 任务标记回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0,
//========================================================================
void Task_Marks_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps[i].TIMCount) /* If the time is not 0 */
{
Task_Comps[i].TIMCount--; /* Time counter decrement */
if(Task_Comps[i].TIMCount == 0) /* If time arrives */
{
/*Resume the timer value and try again */
Task_Comps[i].TIMCount = Task_Comps[i].TRITime;
Task_Comps[i].Run = 1; /* The task can be run */
}
}
}
}
//========================================================================
// 函数: Task_Pro_Handler_Callback
// 描述: 任务处理回调函数.
// 参数: None.
// 返回: None.
// 版本: V1.0
//========================================================================
void Task_Pro_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++)
{
if(Task_Comps[i].Run) /* If task can be run */
{
Task_Comps[i].Run = 0; /* Flag clear 0 */
Task_Comps[i].TaskHook(); /* Run task */
}
}
}
timer.h
#ifndef __TiMER_H
#define __TIMER_H
#include "sys_config.h"
#include <AI8051U.h>
#include "type_def.h"
#include "task.h"
void timer_init(void);
#endif
timer.c
#include "timer.h"
/**
* @brief 定时器配置
* @param 无
* @retval 无
*/
void timer_init(void)
{
AUXR = 0x80; //Timer0 1T模式, 16位自动重装计时器,
TH0 = (u8)(Timer0_Reload / 256);
TL0 = (u8)(Timer0_Reload % 256);
ET0 = 1; //Timer0 中断使能
TR0 = 1; //Tiner0 运行
}
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR //进中断时已经清除标志
{
Task_Marks_Handler_Callback(); //任务标记回调函数
}
main.c
#include "sys_init.h"
//#include "sys_config.h"
#include "task.h"
void main()
{
SYS_Init();
while(1)
{
Task_Pro_Handler_Callback();
}
}
实现效果如图