一个应用了RTX 51 TINY的工程,附有proteus仿真,keil c51编写完成,RTX51是运行在51单片机上的微型实时操作系统,比较简单,便于初学者学习。-
以下是部分源代码 完整程序见附件
- /*------------------------------------------------------------------------
- 本实例使用12MHZ晶振,采用at89x5x系列单片机,故时间片为10ms
- 另附proteus仿真工程
- 制作者:周乾伟
- 2008年3月31日编写完成
- email:huntstart@163.com
- -------------------------------------------------------------------------*/
- #include <rtx51tny.h>
- #include <at89x51.h>
- #include <lcd.h>
- const seven_seg[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,
- 0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳0123456789,后十位带点。
- unsigned char i=0,j=0,hour=0,minute=0,sec=0,t,a=0;
- unsigned int count=0;
- unsigned char key_v1[17]={'i','l','o','v','\0'};
- unsigned char key_v2[17]={'i','l','o','v','\0'};
- bit b=1,signal_p1=0;
- void job0 (void) _task_ 0
- {
- init_LCD();
- os_create_task(1);//键盘扫描任务
- os_create_task(2);//键值显示任务
- os_create_task(3);//计时任务
- os_create_task(4);//时间显示任务
- os_create_task(5);
- os_delete_task(0);//任务0相当于一个父进程,它的任务是创建子进程,完成使命后就可以取消了,免得暂用cpu资源
- }
- void job1 (void) _task_ 1
- {
- while(1)
- {//每一个任务都必须是一个死循环
- if(b==1)
- os_send_signal (4);//当无按键动作时,发送信号量给任务4,半秒刷时,有动作发生后,若连续10s无动作,返回刷时状态
- else if(a>100)
- {
- os_send_signal (4);
- a=0;
- b=1;
- }
- i=scan(key_v1);//启动按键扫描
- if(i==100) //如果返回i!=100说明有按键,发送信号量给任务2
- {
- if(VS_key_V(key_v1,key_v2)==0)//如果于前次按键不一样,怎显示
- {
- StrToStr( key_v1, key_v2);
- os_send_signal (2);
- b=0;
- // os_wait(K_TMO,1,0);
- }
- else a++;
- }
- if((a==15)&&(i==100))
- {
- count++;
- a=0;
- }
- if(i!=100) a++;
- os_wait(K_TMO,10,0);//修改tick,可以改变扫描频率
- }
- }
- void job2 (void) _task_ 2
- {
- while(1)
- {
- os_wait1(K_SIG);//等待信号量,若信号量没到,则任务2处于挂起状态
- clear_LCD();
- //clear_LCD();
- gotoxy(1,0);
- display_LCD_string(key_v1);
- //StrToStr( key_v1, key_v2);
- // gotoxy(1,0);
- //display_LCD_string(key_v2);
- a=0;
- count=0;
- os_clear_signal (2);//释放信号量
- // os_wait(K_TMO,1000,0);
- }
- }
- void job3 (void) _task_ 3
- {
- while(1)
- {
- sec++;//计秒
- if(sec==60){minute++;sec=0;}
- if(minute==60){hour++;minute=0;}
- os_wait(K_IVL,100,0);//等待时间片中断,没100个时间片发生一次中断,也就是1s钟,任务3运行一次
- }
- }
- void job4 (void) _task_ 4
- {
- while(1)
- {
- os_wait1(K_SIG);//等待信号量
- //os_wait(K_TMO+K_SIG,50,0);
- if(signal_p1!=0) os_wait(K_TMO,1,0);
- signal_p1=1;
- P2|=0x0f;
- clear_LCD();
- t=hour/10+48;
- gotoxy(1,4);
- write_LCD_data(t);
- t=hour%10+48;
- write_LCD_data(t);
- write_LCD_data(':');
- t=minute/10+48;
- write_LCD_data(t);
- t=minute%10+48;
- write_LCD_data(t);
- write_LCD_data(':');
- t=sec/10+48;
- write_LCD_data(t);
- t=sec%10+48;
- write_LCD_data(t);
- gotoxy(1,0);
- signal_p1=0;
- os_wait(K_TMO,50,0);
- os_clear_signal(4);//释放信号量
- }
- }
- void job5 (void) _task_ 5
- {
- while(1)
- {
- //os_wait(K_TMO,5,0);
- if(signal_p1!=0) os_wait(K_TMO,1,0);
- signal_p1=1;
- P2|=0x0f;
- P1=seven_seg[count%10];
- P2&=0xfe;
- delay100us(24);
- P2|=0x0f;
- P1=seven_seg[(count/10)%10];
- P2&=0xfd;
- delay100us(24);
- P2|=0x0f;
- P1=seven_seg[(count/100)%10];
- P2&=0xfb;
- delay100us(24);
- P2|=0x0f;
- P1=seven_seg[(count/1000)%10];
- P2&=0xf7;
- delay100us(24);
- // up++;
- if(count>=10000) count=0;
- P2|=0x0f;
- signal_p1=0;
- os_wait(K_TMO,1,0);
- }
- }
复制代码