搜索
bottom↓
回复: 2

利用TX-1C试验板,嵌入实时操作系统Small RTOS实现LED跑马灯实验

[复制链接]

出0入0汤圆

发表于 2012-2-2 18:13:30 | 显示全部楼层 |阅读模式
本次实验硬件平台:TX-1C实验板

实时操作系统:Small RTOS51 版本号1.12.1

编译环境:Keil C51 V9.00

实验目的:用P1接到发光二极管,依次实现从P1^0~7每个二极管循环点亮1秒,晶振采用11.0592MHz,,我们需要自己修改一下TH0和TL0的值即可。

一、在OS_CPU.H

找到:#define  IDATA_RAM_SIZE  0x100 这句(256k RAM)

将其改变为#define  IDATA_RAM_SIZE  0x80  (128k RAM)

二,在 OS_CFG.H中做如下修改

#define OS_MAX_TASKS            1           /* 最大任务数1~16                                           */
#define OS_TICKS_PER_SEC        10          /* 声明1秒系统系统节拍数                                    */
#define EN_USER_TICK_TIMER      1           /* 禁止(0)或允许(1)系统定时中断调用用户函数UserTickTimer()  */
#define EN_OS_INT_ENTER         1           /* 禁止(0)或允许(1)中断嵌套管理                             */
#define EN_TIMER_SHARING        1           /* 禁止(0)或允许(1)定时器中断调用OSTimeTick()               */
#define TICK_TIMER_SHARING      1           /* 定义进入多少次硬件中断为一次系统定时器软中断             */


#define EN_OS_Q                 0           /* 禁止(0)或允许(1)消息队列                                 */
#define EN_OS_Q_CHK             0           /* 禁止(0)或允许(1)校验消息队列指针                         */
#define OS_Q_MEM_SEL            xdata       /* 消息队列存储空间选择,keil c51有用,必须为idata、xdata   */
                                            /* 不是keil c51时它必须为空格                               */
#define EN_OS_Q_PENT            0           /* 禁止(0)或允许(1)等待队列中的消息                         */
#define EN_OS_Q_ACCEPT          0           /* 禁止(0)或允许(1)无等待的从队列中取得消息                 */
#define EN_OS_Q_POST            0           /* 禁止(0)或允许(1)FIFO方式向对列发送消息                   */
#define EN_OS_Q_POST_FRONT      0           /* 禁止(0)或允许(1)LIFO方式向对列发送消息                   */
#define EN_OS_Q_INT_POST        0           /* 禁止(0)或允许(1)中断中FIFO方式相对列发送消息             */
#define EN_OS_Q_INT_POST_FRONT  0           /* 禁止(0)或允许(1)中断中LIFO方式相对列发送消息             */
#define EN_OS_Q_NMsgs           0           /* 禁止(0)或允许(1)取得队列中消息数                         */
#define EN_OS_Q_SIZE            0           /* 禁止(0)或允许(1)取得队列总容量                           */
#define EN_OS_Q_FLUSH           0           /* 禁止(0)或允许(1)清空队列                                 */

#define EN_OS_SEM               0           /* 禁止(0)或允许(1)信号量                                   */
#define EN_OS_SEM_CHK           0           /* 禁止(0)或允许(1)校验信号量索引                           */
#define OS_SEM_MEM_SEL          idata       /* 信号量储空间选择,keil c51有用,必须为idata、xdata       */
                                            /* 不是keil c51时它必须为空格                               */
#define OS_MAX_SEMS             0           /* 最大信号量数目                                           */
#define EN_OS_SEM_PENT          0           /* 禁止(0)或允许(1)等待信号量                               */
#define EN_OS_SEM_ACCEPT        0           /* 禁止(0)或允许(1)无等待请求信号量                         */
#define EN_OS_SEM_INT_POST      0           /* 禁止(0)或允许(1)中断中发送信号量                         */
#define EN_OS_SEM_POST          0           /* 禁止(0)或允许(1)中发送信号量                             */
#define EN_OS_SEM_QUERY         0           /* 禁止(0)或允许(1)查询信号量                               */

//#define data                                /* 非keil c51时必须加止这一句                               */


#if EN_TIMER_SHARING == 0
#define TIME_ISR_TASK_ID     SHOW_TASK_ID   /* 定义系统定时器软中断触发的任务ID                         */
#endif


#ifdef IN_OS_CPU_C
#if EN_USER_TICK_TIMER > 0
extern void UserTickTimer(void);            /* 系统定时中断中调用的用户函数                                */
#endif
#endif

三、在config.h中做如下改变

/********************************/
/*     "以下为系统配置"           */
/********************************/
#pragma REGPARMS
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define const code

#ifndef TRUE
#define TRUE  1
#endif

#ifndef FALSE
#define FALSE 0
#endif

/********************************/
/*     "操作系统定义"            */
/********************************/
#include "OS_CFG.H"
#include "OS_CPU.H"
#include "E:\Small RTOS51\单任务LED\OS\OS.H" //这里相应的修改为你的对应头文件地址即可
#include "E:\Small RTOS51\单任务LED\OS\OS_Q.h"
#include "E:\Small RTOS51\单任务LED\OS\OS_SEM.h"

/********************************/
/*     "以下为程序配置"           */
/********************************/

//任务定义
#ifdef IN_OS_CPU_C
extern void Task1(void);

void  (* const TaskFuction[OS_MAX_TASKS])(void)={Task1};
//函数数组TaskFuction[]保存了各个任务初始PC指针,其按任务ID(既优先级次序)顺序保存

#endif


四、在用户程序代码中

#include <config.h>
void Init_MCU( )
{
    //系统节拍中断使用定时器0,中断频率为20Hz
        TH0 =( 65536 - (11059200 / 12) / 20) / 256;
    TL0 =( 65536 - (11059200 / 12) / 20) / 256;
    TMOD = (TMOD & 0XF0) | 0X01;
    TR0 = 1 ;
    ET0 = 1 ;
}
void main( )
{
    Init_MCU( ) ;
    OSStart( ) ;
}
void UserTickTimer(void)
{
    TH0 =( 65536 - (11059200 / 12) / 20) / 256;
    TL0 =( 65536 - (11059200 / 12) / 20) / 256;
}
void Task1(void)
{
    //让P1对应的灯从P0^0~7依次亮1s中
    uint8 i ;
    while(1)
    {
        for( i = 0 ; i < 8 ; i++ )
        {
            P1 = ~( 0x01 << i ) ;
            OSWait(K_TMO , 20 ) ;
            //P1 = 0xFF ;            
        }         
    }
}

编译、调试,上机调试,完整通过。附上源代码

点击此处下载 ourdev_715635DVP3T7.rar(文件大小:88K) (原文件名:单任务LED.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-7-3 00:45:45 | 显示全部楼层
请教一下,我用你的程序运行时怎么一直停在OSWait(K_TMO , 20 ) ;不动了?

出0入0汤圆

发表于 2013-9-25 22:44:52 | 显示全部楼层
仿真成功。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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