利用TX-1C试验板,嵌入实时操作系统Small RTOS实现LED跑马灯实验
本次实验硬件平台:TX-1C实验板实时操作系统:Small RTOS51 版本号1.12.1
编译环境:Keil C51 V9.00
实验目的:用P1接到发光二极管,依次实现从P1^0~7每个二极管循环点亮1秒,晶振采用11.0592MHz,,我们需要自己修改一下TH0和TL0的值即可。
一、在OS_CPU.H
找到:#defineIDATA_RAM_SIZE0x100 这句(256k RAM)
将其改变为#defineIDATA_RAM_SIZE0x80(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_FRONT0 /* 禁止(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 TRUE1
#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)(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) 请教一下,我用你的程序运行时怎么一直停在OSWait(K_TMO , 20 ) ;不动了? 仿真成功。
页:
[1]