找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3918|回复: 6
打印 上一主题 下一主题
收起左侧

RTX51-tny之按键点LED灯

[复制链接]
跳转到指定楼层
楼主
ID:105206 发表于 2018-6-13 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于公共电脑不方便发实物演示图。
程序如下:

//功能:RTX51_TNY开关点灯

/*******************************************************


    task1 : LED0每  1s改变一次状态
    task2 :LED1每0.7s改变一次状态
    task3 :LED2每0.4s改变一次状态
    task4 :LED3每0.2s改变一次状态
*******************************************************/  
#include <rtx51tny.h>  
#include <reg52.h>  

#define uchar unsigned char
#define uint unsigned int
//typedef unsigned char uchar;  
//typedef unsigned int  uint;  

sbit LED0 = P0^0;  
sbit LED1 = P0^1;  
sbit LED2 = P0^2;  
sbit LED3 = P0^3;  

sbit KEY0 = P1^0;
sbit KEY1=P1^1;

void job0(void) _task_ 0   
{  
    LED0 = 1;  
    LED1 = 1;  
    LED2 = 1;  
    LED3 = 1;           //关闭四个LED  

    os_create_task(1);  //创建任务1  
    os_create_task(2);  //创建任务2  

    os_delete_task(0);  //删除自己(task0),使task0退出任务链表  
}   

void job1(void) _task_ 1 //按键开启任务
{  
        while(1)
        {  
        if(KEY1==0)
                {           //判断按键是否按下  
                       
                                while(!KEY1);
                                   
                                os_create_task (4);   //按键开启LED3,
                                os_create_task (3);
                                os_create_task (5);
                                os_create_task (6);
                                               
        }  
    }  
}

void job2(void) _task_ 2 //按键关闭任务
{  
        while(1)
        {  
        if(KEY0==0)
                {           //判断按键是否按下  
                       
                                while(!KEY0);//等待取反
                                LED0 = 1;LED1 = 1;LED2 = 1;LED3 = 1;            
                                os_delete_task(4);   //按键关闭任务3。4。5。6。
                                os_delete_task(3);
                                os_delete_task(5);
                                os_delete_task(6);
                       
                       
        }  
    }  
}



//以下是各任务

void job3(void) _task_ 3   
{   
    while(1){               
        LED0 = !LED0;  
        os_wait(K_TMO, 100, 0);  //等待100个时钟滴答(ticks),即1s  
                     //配置文件ConfTny.A51中INT_CLOCK EQU 10000; default is 10000 cycles  
                     //意思是时钟滴答为10000个机器周期,即10000*1uS=10ms   
    }   
}   

void job4(void) _task_ 4   
{   
    while(1){               
        LED1 = !LED1;  
        os_wait(K_TMO, 70, 0);   //等待(延时)0.7s   
    }  
}  

void job5(void) _task_ 5  
{  
    while(1){  
        LED2 = !LED2;  
        os_wait(K_TMO, 40, 0);   //等待(延时)0.4s  
    }  
}  

void job6(void) _task_ 6  
{  
    while(1){  
        LED3 = !LED3;  
        os_wait(K_TMO, 20, 0);   //等待(延时)0.2s  
    }  
}  

望大家共同探讨。谢谢!

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82419 发表于 2018-10-9 13:28 来自手机 | 只看该作者
这个不需要主函数吗!
回复

使用道具 举报

板凳
ID:409055 发表于 2018-10-13 15:23 | 只看该作者
请问怎么能让灯一直闪烁
回复

使用道具 举报

地板
ID:730009 发表于 2022-3-26 18:20 | 只看该作者
583703056A 发表于 2018-10-9 13:28
这个不需要主函数吗!

_task_ 0  至 _task_ 6都是主函数
回复

使用道具 举报

5#
ID:670608 发表于 2022-7-26 15:23 | 只看该作者
RTX51 Tiny是时间轮片 所有任务优先级都是一样的 不支持抢占
有没有 RTX51 FULL 的
回复

使用道具 举报

6#
ID:1045827 发表于 2022-9-25 17:36 | 只看该作者
非常感谢您的无私奉献!我用了您的例子,稍作改动,就在我的STC8A8K64S4A12单片机上实现了;这是我第一次在单片机上接触RTOS。以后还请不吝指教
回复

使用道具 举报

7#
ID:1045827 发表于 2022-9-25 17:43 | 只看该作者
小呀嘛小菜鸟 发表于 2018-10-13 15:23
请问怎么能让灯一直闪烁

按照楼主的程序,只要按下KEY1,程序就一直运行,4只LED交替点亮;我已实现了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表