对于51单片机由于其内部资源的限制,运行一个打操作系统是比较困难的,但是我们可以使用一个状态机来运行不同的任务,这样可以大减轻51单片机内部资源的负担,也实现了多任务的架构。
单片机源程序如下:
- #include< reg52.h>
- #include< stdio.h>
- #include< stdlib.h>
- #include "delay.h"
- #include "timer0.h"
- #include "usart1.h"
- #define Task_Size 8
- unsigned char Event_List[8];
- unsigned char Task_PQH;
-
void (*Task_List[Task_Size])(void);
- void Task0()
- {
-
Uart1_SendString("Task0\r\n");
- delay_ms(250);
- }
- void Task1()
- {
-
Uart1_SendString("Task1\r\n");
- delay_ms(250);
- }
- void Task2()
- {
-
Uart1_SendString("Task2\r\n");
- delay_ms(250);
- }
- void Task3()
- {
-
Uart1_SendString("Task3\r\n");
- delay_ms(250);
- }
- void Task4()
- {
-
Uart1_SendString("Task4\r\n");
- delay_ms(250);
- }
- void Task5()
- {
-
Uart1_SendString("Task5\r\n");
- delay_ms(250);
- }
- void Task6()
- {
-
Uart1_SendString("Task6\r\n");
- delay_ms(250);
- }
- void Task7() //空闲任务
- {
-
Uart1_SendString("Task7\r\n");
- delay_ms(250);
- }
- void main()
- {
- Uart1_Init();//串口初始化
- Init_timer0(); //定时器0初始化
- Task_List[0]=Task0; //初步化任务表
- Task_List[1]=Task1;
- Task_List[2]=Task2;
- Task_List[3]=Task3;
- Task_List[4]=Task4;
- Task_List[5]=Task5;
- Task_List[6]=Task6;
- Task_List[7]=Task7;
-
-
for(Task_PQH=0;Task_PQH<Task_Size;Task_PQH++) //初始化事件
- {
- Event_List[Task_PQH]=0;
- }
- while(1)
- {
-
for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++) //查找最高优先级任务
- {
-
if(Event_List[Task_PQH]>0) //有事件发生
- break;
- }
- Task_List[Task_PQH](); //执行任务
- }
- }
复制代码
原理图: 无
仿真: 无
代码:
状态机.7z(19.26 KB, 下载次数: 33)