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

📄 trafficlights.c

📁 基于ucos的简易交通灯系统TrafficLights
💻 C
📖 第 1 页 / 共 2 页
字号:
*********************************************************************************************************
*/

static  void  TaskStartDisp (void)
{
    char *arr;
	int arrow[2] = {49,50};
	sprintf(arr,"SetTime: %d  ( %c Add, %c Reduce)", SetTime,arrow[0],arrow[1]);
	PC_DispStr( 0, 23, arr, DISP_BGND_BLACK+DISP_FGND_WHITE);
}

/*
*********************************************************************************************************
*                                             创建任务
*********************************************************************************************************
*/

static  void  TaskStartCreateTasks (void)
{
    OSTaskCreateExt(TaskClk,
                   (void *)0,
                   &TaskClkStk[TASK_STK_SIZE - 1],
                   TASK_CLK_PRIO,
                   TASK_CLK_ID,
                   &TaskClkStk[0],
                   TASK_STK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

    OSTaskCreateExt(Task1,
                   (void *)0,
                   &Task1Stk[TASK_STK_SIZE - 1],
                   TASK_1_PRIO,
                   TASK_1_ID,
                   &Task1Stk[0],
                   TASK_STK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

    OSTaskCreateExt(Task2,
                   (void *)0,
                   &Task2Stk[TASK_STK_SIZE - 1],
                   TASK_2_PRIO,
                   TASK_2_ID,
                   &Task2Stk[0],
                   TASK_STK_SIZE,
                   (void *)0,
                   OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

}

/*
*********************************************************************************************************
*                                               交通灯显示任务
*********************************************************************************************************
*/

void  Task1 (void *pdata)
{
	int			sem = 0;
	int			change = 0;
    INT8U       err;
    OS_STK_DATA data;                       
    INT16U      time;                      
    INT8U       i;
	char		*ss = NULL;
    char        s[80];
	INT32U		T;
    pdata = pdata;
    for (;;) {
		sprintf(ss,"%d",LightTime);											// 将当前剩余时间转换成为字符串
		PC_DispStr(56, 8, ss , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);		// 打印剩余时间
		PC_DispStr(23, 16, ss , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
		if (LightTime < 10) {												// 处理个位显示
			PC_DispStr(57, 8, " " , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
			PC_DispStr(24, 16, " " , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
		}
		if (LightTime < 4) {												// 通过信号和change变量控制信号灯的逻辑
			sem = 1;
			if (change && LightTime == 0)
				change = 0;
			else if (!change && LightTime == 0)
				change = 1;
		}
		if (sem == 1 && LightTime == 0 && change == 0) {
			sem = 0;
		}
		else if (sem == 1 && LightTime == 0 && change == 1) {
			sem = 2;
		}
		DisplayLight(sem);
		OSTimeDlyHMSM(0, 0, 1, 0);
    }
}
/*
*********************************************************************************************************
*                                               显示交通灯状态
*********************************************************************************************************
*/
void DisplayLight(int sem)
{
	if (sem == 0)			// 按照传入信号量的不同设置显示的状态.
	{
		DisplayLightS();
	}
	else if (sem == 1)
	{
		DisplayLightBS();
	}
	else if (sem == 2)
	{
		DisplayLightG();
	}
}
/*
*********************************************************************************************************
*                                               交通灯显示 红 绿
*********************************************************************************************************
*/
void DisplayLightS(void)
{
	PC_DispStr(57, 7, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
	PC_DispStr(24, 15, "G", DISP_FGND_LIGHT_GREEN + DISP_BGND_BLACK);
}
/*
*********************************************************************************************************
*                                               交通灯显示 绿 红
*********************************************************************************************************
*/
void DisplayLightG(void)
{
	PC_DispStr(24, 15, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
	PC_DispStr(57, 7, "G", DISP_FGND_LIGHT_GREEN + DISP_BGND_BLACK);
}
/*
*********************************************************************************************************
*                                               交通灯显示 红 红
*********************************************************************************************************
*/
void DisplayLightBS(void)
{
	PC_DispStr(57, 7, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
	PC_DispStr(24, 15, "S", DISP_FGND_LIGHT_RED + DISP_BGND_BLACK);
}
/*
*********************************************************************************************************
*                                               设置交通灯的残留时间任务
*********************************************************************************************************
*/
void  Task2 (void *data)
{
	char *s;
	int sem = 0;
	int  i = 0;
    data = data;
	LightTime = SetTime;
	waitTime = 0;
    for (;;) {
		if (LightTime == -1) {					// 如果残留时间减完,则意味着交通灯变换,重设定残留时间
			LightTime = SetTime;
			sem = 0; 
		}
		OSTimeDlyHMSM(0, 0, 1, 0);
		LightTime--;
    }
}

/*
*********************************************************************************************************
*												获取时间任务
*********************************************************************************************************
*/

void  TaskClk (void *data)
{
    char s[40];


    data = data;
    for (;;) {
        PC_GetDateTime(s);				//获得系统时间
        PC_DispStr(60, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLACK);
        OSTimeDly(OS_TICKS_PER_SEC);
    }
}

⌨️ 快捷键说明

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