一个简单的51实时操作系统程序,内含电路可用
Easy51RTOS仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序(主程序)如下:
- #include <reg51.h>
- #include "os_cfg.h"
- #define TASK_DELAY0 TIME_PER_SEC/50 //任务0的执行频度
- #define TASK_DELAY1 TIME_PER_SEC/150 //任务1的执行频度
- #define TASK_DELAY2 TIME_PER_SEC/160 //任务2的执行频度
- #define TASK_DELAY3 TIME_PER_SEC/2 //任务3的执行频度
-
- #define uchar unsigned char
- #define uint unsigned int
- void (*(task[]))()={task0,task1,task2,task3};//函数指针数组
- /*主函数*/
- void main()
- {
- uchar i;
- os_timer0_init();
- while(1)
- {
- for(i=0;i<MAX_TASK;i++)
- {
- if(task_delay[i]==0)
- {
- run(task[i]);break;
- }
- }
- }
- }
- /*任务体0*/
- void task0(void)
- {
- //添加任务内容
- task_delay[0]=TASK_DELAY0;
- }
- /*任务体1*/
- void task1(void)
- {
- //添加任务内容
- task_delay[1]=TASK_DELAY1;
- }
- /*任务体2*/
- void task2(void)
- {
- //添加任务内容
- task_delay[2]=TASK_DELAY2;
- }
- /*任务体3*/
- void task3(void)
- {
- //添加任务内容
- task_delay[3]=TASK_DELAY3;
- }
复制代码 os_c.c
- #include "os_cfg.h"
- unsigned char task_delay[MAX_TASK];
- //定时器0初始化
- void os_timer0_init(void)
- {
- unsigned char i;
- for(i=0;i<MAX_TASK;i++)
- {
- task_delay[i]=0;
- }
- TMOD = (TMOD & 0XF0) | 0X01; //定时器0工作在模式1,16Bit定时器模式
- TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256; //CRY_OSC,TIME_PER_SEC在easycfg.h中配置
- TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;
- TR0 =1;
- ET0 =1; //开启定时器和中断
- }
- // 系统OS定时中断服务
- void os_timer0(void) interrupt 1
- {
- unsigned char i;
- TH0 = (65536-CLOCK/TIME_PER_SEC/12) / 256; //CRY_OSC,TIME_PER_SEC在easycfg.h中配置
- TL0 = (65536-CLOCK/TIME_PER_SEC/12) % 256;
- for(i=0;i<MAX_TASK;i++)
- {
- if(task_delay[i])
- {
- task_delay[i]--;//每节拍对任务延时变量减1,减至0后,任务就绪。
- }
- }
- }
- void run(void (*ptask)())
- {
- (*ptask)();
- }
-
复制代码
所有资料51hei提供下载:
44915610Easy51RTOS.rar
(88.76 KB, 下载次数: 78)
|