⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trafficlights.c

📁 基于ucos的简易交通灯系统TrafficLights
💻 C
📖 第 1 页 / 共 2 页
字号:
/*======================================================================
文件:ucos的交通灯设计
创建者:
参与者:
创建日期:2007.12.28
描述:负责交通灯的入口以及主要的逻辑实现
========================================================================*/
#include "includes.h"

/*
*********************************************************************************************************
*                                              定义常量
*********************************************************************************************************
*/

#define          TASK_STK_SIZE     512               // 任务堆栈长度

#define          TASK_START_ID       0               // 任务的标示ID
#define          TASK_CLK_ID         1
#define          TASK_1_ID           2
#define          TASK_2_ID           3

#define          TASK_START_PRIO    10               // 任务优先级
#define          TASK_CLK_PRIO      11
#define          TASK_1_PRIO        13
#define          TASK_2_PRIO        12

/*
*********************************************************************************************************
*                                              变量
*********************************************************************************************************
*/

OS_STK        TaskStartStk[TASK_STK_SIZE];            // 定义任务堆栈区
OS_STK        TaskClkStk[TASK_STK_SIZE];             
OS_STK        Task1Stk[TASK_STK_SIZE];               
OS_STK        Task2Stk[TASK_STK_SIZE];               
int			  LightTime;							// 定义了交通灯剩余的时间
int			  waitTime;
int			  SetTime;								 // 定义了交通灯的最大值                    



/*
*********************************************************************************************************
*                                         函数原形
*********************************************************************************************************
*/

        void  TaskStart(void *data);                 
static  void  TaskStartCreateTasks(void);
static  void  TaskStartDispInit(void);
static  void  TaskStartDisp(void);
        void  TaskClk(void *data);
        void  Task1(void *data);
        void  Task2(void *data);
		void  DisplayLight(int sem);
		void  DisplayLightS(void);
		void  DisplayLightG(void);
		void  DisplayLightBS(void);

/*
*********************************************************************************************************
*                                                  程序入口
*********************************************************************************************************
*/

void main (void)
{
    OS_STK *ptos;
    OS_STK *pbos;
    INT32U  size;


    PC_DispClrScr(DISP_FGND_WHITE);                        // 清屏

    OSInit();                                              // 初始化uCOS_II

    PC_DOSSaveReturn();                                    // 保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);                             // 安装uCOS_II中断
    PC_ElapsedInit();                                      // 初始化共用时间变量

    ptos        = &TaskStartStk[TASK_STK_SIZE - 1];        // TaskStart使用浮点数
    pbos        = &TaskStartStk[0];
    size        = TASK_STK_SIZE;
	SetTime		= 60;									//初始化了信号灯切换时间
    OSTaskStkInit_FPE_x86(&ptos, &pbos, &size);            
    OSTaskCreateExt(TaskStart,							//创建任务StartTask
                   (void *)0,							//给任务传递参数	
                   ptos,		
                   TASK_START_PRIO,						//使任务的优先级别为0
                   TASK_START_ID,	
                   pbos,
                   size,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

    OSStart();                                             //启动多任务管理
}

/*
*********************************************************************************************************
*                                               开始任务
*********************************************************************************************************
*/

void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                                // 分配储存CPU状态的寄存器
    OS_CPU_SR  cpu_sr;
#endif
    INT16S     key;


    pdata = pdata;                                         

    TaskStartDispInit();                                   // 调用显示初始化函数

    OS_ENTER_CRITICAL();                                   // 安装时钟tick
    PC_VectSet(0x08, OSTickISR);						   // 安装时钟中断向量
    PC_SetTickRate(OS_TICKS_PER_SEC);                      // 设置uCOS_II时钟频率
    OS_EXIT_CRITICAL();

    OSStatInit();                                          //初始化统计任务

    TaskStartCreateTasks();                                // 调用函数创建各种任务

    for (;;) {
        TaskStartDisp();                                   // 更新显示(用于更新设置的参数)

        if (PC_GetKey(&key)) {                            // 处理键盘响应
            if (key == 0x1B) {                            // 如果按下Esc键则退出uCOS_II
                PC_DOSReturn();                           
            }
			if (key == 0x31) {							   // 如果按下数字'1'键则将SetTime的全局变量加一
				SetTime++;
				if (SetTime > 120)
					SetTime = 120;
			}
			if (key == 0x32) {								// 如果按下数字'1'键则将SetTime的全局变量减一
				SetTime--;
				if (SetTime < 20)
					SetTime = 20;
			}
        }

        OSCtxSwCtr = 0;                                    
        OSTimeDly(OS_TICKS_PER_SEC);                       // 设置1秒钟的时延
    }
}
/*
*********************************************************************************************************
*                                        界面显示函数
*********************************************************************************************************
*/

static  void  TaskStartDispInit (void)
{
    PC_DispStr( 0,  0, "                          Traffic Lights System                                 ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
    PC_DispStr( 0,  1, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  2, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  3, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  4, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  5, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  6, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  7, "                               |        |   N-S Light : [ ]                     ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  8, "                               |        |   TimeRemain:      (s)                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0,  9, "           ____________________|        |______________________                 ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 10, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 11, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 12, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 13, "           ____________________          _______________________                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 14, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 15, "           W-E Light : [ ]     |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 16, "           TimeRemain:      (s)|        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 17, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 18, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 19, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 20, "                               |        |                                       ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 21, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 22, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
	PC_DispStr( 0, 23, "                                                                                ", DISP_BGND_BLACK+DISP_FGND_WHITE);
    PC_DispStr( 0, 24, "                            <-PRESS 'ESC' TO QUIT->                             ", DISP_BGND_BLACK+DISP_FGND_WHITE);
}

/*
*********************************************************************************************************
*                                           初始化显示

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -