找回密码
 注册会员
搜索附件  

rtx51tiny.rar

 

RTX 51 TINY的工程,附有proteus仿真,keil c51编写完成:
一个应用了RTX 51 TINY的工程,附有proteus仿真,keil c51编写完成,RTX51是运行在51单片机上的微型实时操作系统,比较简单,便于初学者学习。-
以下是部分源代码 完整程序见附件

  1. /*------------------------------------------------------------------------
  2. 本实例使用12MHZ晶振,采用at89x5x系列单片机,故时间片为10ms
  3. 另附proteus仿真工程
  4. 制作者:周乾伟
  5. 2008年3月31日编写完成
  6. email:huntstart@163.com
  7. -------------------------------------------------------------------------*/
  8. #include <rtx51tny.h>
  9. #include <at89x51.h>
  10. #include <lcd.h>
  11. const seven_seg[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,
  12. 0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳0123456789,后十位带点。
  13. unsigned char i=0,j=0,hour=0,minute=0,sec=0,t,a=0;
  14. unsigned int count=0;
  15. unsigned char key_v1[17]={'i','l','o','v','\0'};
  16. unsigned char key_v2[17]={'i','l','o','v','\0'};

  17. bit b=1,signal_p1=0;
  18. void job0 (void) _task_ 0
  19. {
  20. init_LCD();
  21. os_create_task(1);//键盘扫描任务
  22. os_create_task(2);//键值显示任务
  23. os_create_task(3);//计时任务
  24. os_create_task(4);//时间显示任务
  25. os_create_task(5);
  26. os_delete_task(0);//任务0相当于一个父进程,它的任务是创建子进程,完成使命后就可以取消了,免得暂用cpu资源
  27. }
  28. void job1 (void) _task_ 1
  29. {
  30. while(1)
  31. {//每一个任务都必须是一个死循环
  32. if(b==1)
  33. os_send_signal (4);//当无按键动作时,发送信号量给任务4,半秒刷时,有动作发生后,若连续10s无动作,返回刷时状态
  34. else if(a>100)
  35. {
  36. os_send_signal (4);
  37. a=0;
  38. b=1;
  39. }
  40. i=scan(key_v1);//启动按键扫描

  41. if(i==100) //如果返回i!=100说明有按键,发送信号量给任务2
  42. {
  43. if(VS_key_V(key_v1,key_v2)==0)//如果于前次按键不一样,怎显示
  44. {
  45. StrToStr( key_v1, key_v2);

  46. os_send_signal (2);
  47. b=0;


  48. // os_wait(K_TMO,1,0);

  49. }
  50. else a++;
  51. }
  52. if((a==15)&&(i==100))
  53. {
  54. count++;
  55. a=0;
  56. }
  57. if(i!=100) a++;
  58. os_wait(K_TMO,10,0);//修改tick,可以改变扫描频率
  59. }
  60. }
  61. void job2 (void) _task_ 2
  62. {

  63. while(1)
  64. {
  65. os_wait1(K_SIG);//等待信号量,若信号量没到,则任务2处于挂起状态
  66. clear_LCD();
  67. //clear_LCD();

  68. gotoxy(1,0);
  69. display_LCD_string(key_v1);
  70. //StrToStr( key_v1, key_v2);
  71. // gotoxy(1,0);
  72. //display_LCD_string(key_v2);

  73. a=0;
  74. count=0;
  75. os_clear_signal (2);//释放信号量
  76. // os_wait(K_TMO,1000,0);
  77. }
  78. }
  79. void job3 (void) _task_ 3
  80. {
  81. while(1)
  82. {
  83. sec++;//计秒
  84. if(sec==60){minute++;sec=0;}
  85. if(minute==60){hour++;minute=0;}
  86. os_wait(K_IVL,100,0);//等待时间片中断,没100个时间片发生一次中断,也就是1s钟,任务3运行一次
  87. }
  88. }
  89. void job4 (void) _task_ 4
  90. {

  91. while(1)
  92. {


  93. os_wait1(K_SIG);//等待信号量
  94. //os_wait(K_TMO+K_SIG,50,0);
  95. if(signal_p1!=0) os_wait(K_TMO,1,0);
  96. signal_p1=1;
  97. P2|=0x0f;
  98. clear_LCD();
  99. t=hour/10+48;
  100. gotoxy(1,4);
  101. write_LCD_data(t);
  102. t=hour%10+48;
  103. write_LCD_data(t);
  104. write_LCD_data(':');
  105. t=minute/10+48;
  106. write_LCD_data(t);
  107. t=minute%10+48;
  108. write_LCD_data(t);
  109. write_LCD_data(':');
  110. t=sec/10+48;
  111. write_LCD_data(t);
  112. t=sec%10+48;
  113. write_LCD_data(t);
  114. gotoxy(1,0);
  115. signal_p1=0;
  116. os_wait(K_TMO,50,0);
  117. os_clear_signal(4);//释放信号量
  118. }

  119. }
  120. void job5 (void) _task_ 5
  121. {
  122. while(1)
  123. {
  124. //os_wait(K_TMO,5,0);

  125. if(signal_p1!=0) os_wait(K_TMO,1,0);
  126. signal_p1=1;
  127. P2|=0x0f;
  128. P1=seven_seg[count%10];
  129. P2&=0xfe;
  130. delay100us(24);
  131. P2|=0x0f;
  132. P1=seven_seg[(count/10)%10];
  133. P2&=0xfd;
  134. delay100us(24);
  135. P2|=0x0f;
  136. P1=seven_seg[(count/100)%10];
  137. P2&=0xfb;
  138. delay100us(24);
  139. P2|=0x0f;
  140. P1=seven_seg[(count/1000)%10];
  141. P2&=0xf7;
  142. delay100us(24);
  143. // up++;
  144. if(count>=10000) count=0;
  145. P2|=0x0f;
  146. signal_p1=0;
  147. os_wait(K_TMO,1,0);
  148. }
  149. }

复制代码


回复 1# admin

很好,比较简单的操作系统。
回复 1# admin


   刚刚看一下,这个系统的移植是很方便的。
很好的程序结构,学习啦~
很好的程序结构,学习啦~
中道找到了!!!!!!!!!!!!!!!
谢谢楼主分享!但是程序中有很多错误的地方。不知楼主……
回复 7# zhiyix


    抽空我会测试一下
ThanksThanksThanksThanksThanksThanksThanks
顶DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
非常好,我下了;非常好,我下了
新会员报道,谢谢发帖。
我下了,研究学习;我下了,研究学习
编译不通过???不通过啊
不错,很实用,非常感谢
谢谢楼主。向楼主学习。。
谢谢楼主,好好学习

本文内容摘录自:MCU资讯论坛(http://www.mcuzx.net)
详细文章请参考:http://www.mcuzx.net/thread-203-1-1.html
顶DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
admin 在么 为什么我用你的程序仿真LCD屏 没有数字显示呢  
谢谢分享!楼主辛苦了!
{:soso_e183:}{:soso_e183:}{:soso_e157:}

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 17:35 , Processed in 0.039735 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部