⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 基于51的圈圈操作系统(51_00_OS)出来拉…… 来这里下载整个程序包: http://blog.21ic.com/more.asp?name=computer00&id=9501
💻 LST
📖 第 1 页 / 共 2 页
字号:
 276   3                     send_a_byte('0'+hour%10);
 277   3                     prints("",1);
 278   3                     give_up_printer();
 279   3                     break;
 280   3      
 281   3           case 'S':                 //收到大写的S,秒值增加1
 282   3                     get_printer();
 283   3                     prints("Second:",0);
 284   3                     second++;
 285   3                     if(second>=60)second-=60;
 286   3                     send_a_byte('0'+second/10);
 287   3                     send_a_byte('0'+second%10);
 288   3                     prints("",1);
 289   3                     give_up_printer();
 290   3                     break;
 291   3      
 292   3           case 'M':                 //收到大写的M,分值增加1
 293   3                     get_printer();
 294   3                     prints("Minute:",0);
 295   3                     minute++;
 296   3                     if(minute>=60)minute-=60;
 297   3                     send_a_byte('0'+minute/10);
 298   3                     send_a_byte('0'+minute%10);
 299   3                     prints("",1);
 300   3                     give_up_printer();
 301   3                     break;
 302   3           case 'H':                 //收到大写的H,小时值增加1
 303   3                     get_printer();
C51 COMPILER V7.06   MAIN                                                                  02/25/2006 14:24:56 PAGE 6   

 304   3                     prints("Hour:",0);
 305   3                     hour++;
 306   3                     if(hour>=24)hour-=24;
 307   3                     send_a_byte('0'+hour/10);
 308   3                     send_a_byte('0'+hour%10);
 309   3                     prints("",1);
 310   3                     give_up_printer();
 311   3                     break;
 312   3      
 313   3           case '+':                //收到"+",加快转动速度
 314   3           case '=':                //因为主键盘上"="跟"+"在同一个键
 315   3                     if(refresh_time>1)refresh_time/=2;   //缩短刷新时间
 316   3                     get_printer();
 317   3                     prints("refresh_time=",0);
 318   3                     send_a_byte('0'+refresh_time/10);
 319   3                     send_a_byte('0'+refresh_time%10);
 320   3                     prints("",1);
 321   3                     give_up_printer();
 322   3                     break;
 323   3      
 324   3           case '-':                //收到"-",减慢转动速度
 325   3                     if(refresh_time<30)refresh_time*=2;   //增加刷新时间
 326   3                     get_printer();
 327   3                     prints("",1);
 328   3                     prints("refresh_time=",0);
 329   3                     send_a_byte('0'+refresh_time/10);
 330   3                     send_a_byte('0'+refresh_time%10);
 331   3                     prints("",1);
 332   3                     give_up_printer();
 333   3                     break;
 334   3      
 335   3           case 'k':
 336   3           case 'K':                //要删除一个任务时,先按下K键。然后再输入要删除的任务号
 337   3                                    //注意:这个任务号是在创建任务时由OS自动分配的,请在创建任务时记下
 338   3                     prints("",1);  //换行
 339   3                     prints("",1);
 340   3                     prints("Ready for kill.....",1);
 341   3                     prints("Please input number of task:",1);  //显示一些提示信息
 342   3                     prints("",1);
 343   3                     buf=get_a_byte();    //从串口接收一字节数据
 344   3                     if((buf>='0')&&(buf<'9'))   //如果在数字范围内
 345   3                      {
 346   4                       temp=OS_Task_Kill(buf-'0');  //根据接收到数据删除一个任务
 347   4                       if((temp&0xff00)==OS_Successful)  //如果成功删除
 348   4                        {
 349   5                         get_printer();          //则显示信息
 350   5                         prints("",1);
 351   5                         prints("",1);
 352   5                         prints("Task ",0);
 353   5                         send_a_byte((temp&0xff)+'0');   //显示被删除的任务ID
 354   5                         prints(" has been killed!",1);                 
 355   5                         prints("Task kill successful!",1);
 356   5                         prints("",1);
 357   5                         give_up_printer();
 358   5                        }
 359   4                       else        //如果删除不成功
 360   4                        {
 361   5                         get_printer();
 362   5                         prints("",1);
 363   5                         prints("",1);
 364   5                         if((temp&0xff00)==OS_Task_Not_Exist)   //如果是因为任务不存在
 365   5                          {
C51 COMPILER V7.06   MAIN                                                                  02/25/2006 14:24:56 PAGE 7   

 366   6                           prints("Task not exist!",1);  //返回信息
 367   6                          }
 368   5                         if((temp&0xff00)==OS_Task_Cannot_Be_Killed)  //如果是因为任务不允许删除
 369   5                          {
 370   6                           prints("Task cannot be killed!",1);  //返回信息
 371   6                          }
 372   5                         prints("Task kill failed!",1);  //返回删除失败的信息
 373   5                         prints("",1);
 374   5                         give_up_printer();
 375   5                        }
 376   4                      }
 377   3                     else    //如果没有输入合适的数字
 378   3                      {
 379   4                       get_printer();
 380   4                       prints("",1);
 381   4                       prints("",1);
 382   4                       prints("Input error!",1);  //返回错误信息
 383   4                       prints("",1);
 384   4                       give_up_printer();
 385   4                      }
 386   3                     break;
 387   3      
 388   3           case 'c': 
 389   3           case 'C':
 390   3                                    //创建任务时,先按下C键
 391   3                                    //输入要创建的任务号。注意:这个号相当于函数名
 392   3                                    //任务创建时,其分配到的ID,跟这个号并不一定一致,
 393   3                                    //而是由OS自动分配的一个ID号
 394   3                     prints("",1);
 395   3                     prints("",1);
 396   3                     prints("Ready for create.....",1);
 397   3                     prints("Please input number of task:",1);
 398   3                     prints("",1);
 399   3                     buf=get_a_byte();
 400   3                     if((buf>='1')&&(buf<='4'))   //本演示程序只能创建1-4号任务
 401   3                      {
 402   4                       if(buf=='1')
 403   4                        {
 404   5                         temp=OS_Task_Create(3,(unsigned int)(&task_1),0);
 405   5                                         //优先级为3,任务为task_1,无消息
 406   5                        }
 407   4      
 408   4                       if(buf=='2')
 409   4                        {
 410   5                         temp=OS_Task_Create(2,(unsigned int)(&task_2),0);
 411   5                                         //优先级为2,任务为task_2,无消息
 412   5                        }
 413   4      
 414   4                       if(buf=='3')
 415   4                        {
 416   5                         temp=OS_Task_Create(1,(unsigned int)(&task_3),0);
 417   5                                         //优先级为1,任务为task_3,无消息
 418   5                        }
 419   4      
 420   4                       if(buf=='4')
 421   4                        {
 422   5                         temp=OS_Task_Create(0,(unsigned int)(&task_4),(unsigned char)&msg);
 423   5                                         //优先级为0(即最高),任务为task_4,消息指针指向msg
 424   5                        }
 425   4      
 426   4                       if((temp&0xFF00)==OS_Successful)   //如果创建成功
 427   4                        {
C51 COMPILER V7.06   MAIN                                                                  02/25/2006 14:24:56 PAGE 8   

 428   5                         get_printer();
 429   5                         prints("",1);
 430   5                         prints("",1);
 431   5                         prints("Task ",0);
 432   5                         send_a_byte((temp&0xff)+'0');
 433   5                         prints(" has been created!",1);
 434   5                         prints("Task create successful!",1);  //显示信息
 435   5                         prints("",1);
 436   5                         give_up_printer();
 437   5                        }
 438   4                       else         //如果创建失败
 439   4                        {
 440   5                         get_printer();
 441   5                         prints("",1);
 442   5                         prints("",1);
 443   5                         if((temp&0xff00)==OS_Resource_Lack)  //资源不足,无法创建
 444   5                          {
 445   6                           prints("Resource lack!",1);   //返回错误信息
 446   6                          }
 447   5                         prints("Task create failed!",1);
 448   5                         prints("",1);
 449   5                         give_up_printer();
 450   5                        }
 451   4                      }
 452   3                     else              //如果输入数据不合适
 453   3                      {
 454   4                       get_printer();
 455   4                       prints("",1);
 456   4                       prints("",1);
 457   4                       prints("Input error!",1);
 458   4                       prints("",1);
 459   4                       give_up_printer();
 460   4                      }
 461   3                     break;
 462   3                     
 463   3           default:  break;
 464   3          }   
 465   2        }
 466   1      }
 467          ////////////////////////////////////////////////////////////////////////////////////////////////
 468          
 469          unsigned char msg;   //保存消息用的一个变量,也可以使用一个结构体来处理更多的信息
 470          
 471          /////////////////////////////////////    任务4 //////////////////////////////////////////////////
 472          void task_4(void)
 473          {
 474   1       static unsigned char temp;   //使用static申明局部变量,避免变量被分配到相同的地址
 475   1       
 476   1       OS_Enter_Critical();
 477   1       Msg_1_Receiver=OS_Current_ID;   //表示本任务需要接收消息1
 478   1       OS_Exit_Critical();
 479   1      
 480   1       get_printer();
 481   1       prints("CPU used ratio: 99%",1);   //显示信息
 482   1       give_up_printer();
 483   1       while(1)
 484   1        {
 485   2         LED3=~LED3;              //LED3闪烁
 486   2         if(OS_Wait_Msg(120))    //等待消息,超时时间设置为1.2秒
 487   2          {
 488   3           temp=*(unsigned char idata*)(OS_pcb[OS_Current_ID].MSG);   //将消息取出
 489   3           if(temp>=100)temp=99;          //为了简化程序,限定最大显示99
C51 COMPILER V7.06   MAIN                                                                  02/25/2006 14:24:56 PAGE 9   

 490   3          }
 491   2         else     //如果任务等待超时,即等了1.2秒还没收到统计任务发回的CPU使用率
 492   2          {
 493   3           temp=99;  //则CPU太繁忙,使用率强制设置为99%
 494   3          }
 495   2         get_printer();
 496   2         prints("CPU used ratio: ",0);
 497   2         send_a_byte('0'+temp/10);      //显示高位
 498   2         send_a_byte('0'+temp%10);      //显示低位
 499   2         send_a_byte('%');              //显示%
 500   2         prints("",1);
 501   2         give_up_printer();
 502   2        }
 503   1      }
 504          ////////////////////////////////////////////////////////////////////////////////////////////////
 505          
 506          
 507          ///////////////////////////////////主函数//////////////////////////////////////////////////////
 508          void main(void)
 509          {
 510   1       EA=0;                    //关中
 511   1       ET2=1;                   //定时器2开中断
 512   1      
 513   1       T2CON=0x00;              //定时器自动重装模式
 514   1       T2MOD=0x00;              //如果提示这里编译通不过,可将本行删除;或自己将定义添上
 515   1                                //因为keil自带的at89x52.h中没有T2MOD的定义
 516   1       RCAP2H=0xB1;
 517   1       RCAP2L=0xE0;             //定时时间为10ms
 518   1      
 519   1      
 520   1       UART_init();           //初始化串口为9600波特率
 521   1       send_a_byte(0x0c);
 522   1       send_a_byte(0x0c);     //如果使用wiindows的超级终端,发这两个可以可靠清屏
 523   1      
 524   1      
 525   1       
 526   1       OS_Init();           //OS初始化
 527   1      
 528   1      
 529   1      //参数意义    优先级      任务入口地址     消息指针
 530   1       OS_Task_Create(255,(unsigned int)(&task_idle),0);   //任务0初始化
 531   1       OS_Task_Create(3,(unsigned int)(&task_1),0);      //任务1初始化
 532   1       OS_Task_Create(2,(unsigned int)(&task_2),0);      //任务2初始化
 533   1       OS_Task_Create(1,(unsigned int)(&task_3),0);      //任务3初始化
 534   1       OS_Task_Create(0,(unsigned int)(&task_4),(unsigned char)&msg); //任务4初始化
 535   1      
 536   1       OS_Start();      //OS开始调度
 537   1      
 538   1      }
 539          
 540          
 541          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1920    ----
   CONSTANT SIZE    =    446    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
C51 COMPILER V7.06   MAIN                                                                  02/25/2006 14:24:56 PAGE 10  

END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -