一個簡單的51實時操作系統程序,內含電路可用
Easy51RTOS仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (31.03 KB, 下載次數: 69)
下載附件
2018-4-18 16:15 上傳
0.jpg (22.4 KB, 下載次數: 64)
下載附件
2018-4-18 16:16 上傳
單片機源程序(主程序)如下:
- #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)();
- }
-
復制代碼
0.png (41.62 KB, 下載次數: 69)
下載附件
2018-4-18 16:16 上傳
所有資料51hei提供下載:
44915610Easy51RTOS.rar
(88.76 KB, 下載次數: 78)
2018-4-18 09:20 上傳
點擊文件名下載附件
51實時操作系統 下載積分: 黑幣 -5
|