📄 main.lst
字号:
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 + -