- 打卡等级:初来乍到
- 打卡总天数:8
- 最近打卡:2025-03-18 20:40:21
中级会员
- 积分
- 345
|
发表于 2023-9-24 04:23:13
|
显示全部楼层
《USB型 1T 8051 单片机原理及应用-STC8H8K64U》--2023/9/20 --通过定时器方式多个任务调度
使用Timer0的16位自动重装来产生1ms节拍,程序使用这个节拍进行任务调度
主函数程序: void main (void) { SYS_Init(); while(1){ Task_Pro_Handler_Callback();}}
void SYS_Init(void){
P_SW2 |= 0x80; //扩展寄存器使能,开发调试把扩展存储都开起来
void GPIO_config(void)//IO口初始化,准双向 ,P1.0 P1.3为ADC 输入(高阻输入)
{P0M1 = 0x00; P0M0 = 0x00; P1M1 = 0x09; P1M0 = 0x00; P2M1 = 0x00; P2M0 = 0x00; P3M1 = 0x00; P3M0 = 0x00; P4M1 = 0x00; P4M0 = 0x00; P5M1 = 0x00; P5M0 = 0x00; P7M1 = 0x00; P7M0 = 0x00;}
Timer_config(); //用定时器0进行惹味调度,定时器0初始化
AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload, Auto模式
TH0 = (u8)(Timer0_Reload / 256); //宏定义设置时间参数
TL0 = (u8)(Timer0_Reload % 256);
#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0
#define MAIN_Fosc 24000000L
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
ADC_config(); //通过ADC去采样温度,对应通道ADC相关寄存器进行配置
{ADCTIM = 0x3f;
ADCCFG = 0x2f;
ADC_CONTR = 0x80; }
EA = 1;
APP_config(); //每个任务功能进行初始化
Display_init();
void Display_init(void) 数码管显示缓冲区初始化
RTC_init();
void RTC_init(void) 初始化相关变量,数码管显示0
void adcKey_init(void) ADCA按键初始化
while (1)
{
Task_Pro_Handler_Callback(); //初始化结束后主任务开始执行
}
void Task_Pro_Handler_Callback(void)
{
u8 i;
for(i=0; i<Tasks_Max; i++)//一条一条进行
{
if(Task_Comps.Run) /* If task can be run */
{
Task_Comps.Run = 0; /* Flag clear 0 */
Task_Comps.TaskHook(); /* Run task */
}
}
}
typedef struct
{
u8 Run;
u16 TIMCount;
u16 TRITime;
void (*TaskHook) (void); //函数指针
} TASK_COMPONENTS;
static TASK_COMPONENTS Task_Comps[]= //定义数组显示任务
{0, 1, 1, Sample_Display}, /* task 1 Period£º 1ms */
{0, 10, 10, Sample_MatrixKey}, /* task 2 Period£º 10ms */
{0, 10, 10, Sample_adcKey}, /* task 3 Period£º 10ms */
{0, 300, 300, Sample_NTC}, /* task 4 Period£º 300ms */
{0, 500, 500, Sample_RTC}, /* task 5 Period£º 500ms */
/* Add new task here */
OS(每个任务都是死循环,运行、准备、挂起、等待) > 任务调度系统 (基于时间片的(分时))
|
|