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

📄 test.c

📁 嵌入式红绿灯系统 UCOS系统下C语言开发 含报告
💻 C
字号:
/************************Test*********************************************/
#include "includes.h"
#define  TASK_STK_SIZE   512			//任务堆栈长度
OS_STK   MyTaskStk[TASK_STK_SIZE];		//定义MyTask任务堆栈区
OS_STK   YouTaskStk[TASK_STK_SIZE];		//定义YouTask任务堆栈区
OS_STK   CtrlTaskStk[TASK_STK_SIZE];	//定义CtrlTask任务堆栈区
INT16S   key;                           //用于读取用户输入
INT32U   SwichTime =126;                //切换一轮的时间,初始为126
INT32U   change=0;                      //中间变量,用于接受input并赋给SwichTime
INT32U   MyTime;					    //MyTask计时器
INT32U   YouTime;                       //YouTask计时器
void  MyTask(void *data);			    //声明任务,控制一个方向的信号灯
void  YouTask(void *data);			    //声明任务,控制另一个方向的信号灯
void  CtrlTask(void *data);			    //声明任务,控制用户输入
/************************主函数*******************************************/
void  main (void)
{
    OSInit();					        //初始化uCOS_II
    PC_DOSSaveReturn();				    //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);			//安装uCOS_II中断
    OSTaskCreate(MyTask,			    //创建任务MyTask
		(void*)0,			            //给任务传递参数
		&MyTaskStk[TASK_STK_SIZE - 1],  //设置任务堆栈栈顶指针
		0);				                //使任务MyTask的优先级别为0
    OSStart();					        //启动uCOS_II的多任务管理
}
/************************任务MyTask***************************************/
void  MyTask (void *pdata)
{
	char mt[5];                         //用于显示剩余时间
#if OS_CRITICAL_METHOD == 3             //选择函数实现方法
    OS_CPU_SR  cpu_sr;
#endif
	pdata = pdata;                      //防止编译器报错
	MyTime = SwichTime;                 //初始MyTask计时器
	OS_ENTER_CRITICAL();                //关中断
	PC_VectSet(0x08, OSTickISR);	    //安装uCOS_II时钟中断向量
	PC_SetTickRate(OS_TICKS_PER_SEC);	//设置uCOS_II时钟频率
	OS_EXIT_CRITICAL();                 //开中断
	OSStatInit();			            //初始化uCOS_II的统计任务

	OSTaskCreate(YouTask,			    //创建任务YouTask
		(void*)0,				        //给任务传递参数
		&YouTaskStk[TASK_STK_SIZE - 1],	//设置任务堆栈栈顶指针
		2);				                //使任务YouTask的优先级别为2

	printf("\n Signal Lamp Control System");
	for (;;)                            //MyTask主循环
	{
		if (MyTime==0)                  //计时器减为0,一轮结束
		{
			if(change>=20&&change<=120) //检测中间变量范围
			{
				SwichTime = 2*change+6; //转换公式
				change=0;               //切换时间改变完毕,清0
			}
			MyTime=SwichTime;           //计时器重新计时
		}
		MyTime-=1;                      //计时器递减1

		PC_DispStr(3, 4,		        //在3,4位置显示East,白色字体
			"East",
			DISP_BGND_BLACK+DISP_FGND_WHITE );
		PC_DispStr(13, 4,		        //在13,4位置显示West,白色字体
			"West",
			DISP_BGND_BLACK+DISP_FGND_WHITE );
		PC_DispStr(32, 4,		        //在32,4位置显示South,白色字体
			"South",
			DISP_BGND_BLACK+DISP_FGND_WHITE );
		PC_DispStr(42, 4,		        //在42,4位置显示North,白色字体
			"North",
			DISP_BGND_BLACK+DISP_FGND_WHITE );

		if(MyTime>=((SwichTime-6)/2+6)) //绿灯时间
		{
			sprintf(mt,"%5d",MyTime-((SwichTime-6)/2+6));
			PC_DispStr(9, 4,		    //在9,4位置显示G,绿色字体
				"G",
				DISP_BGND_BLACK+DISP_FGND_GREEN );
			PC_DispStr(5, 5,		    //在5,5位置显示剩余时间,白色字体
				mt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
			PC_DispStr(19, 4,		    //在19,4位置显示G,绿色字体
				"G",
				DISP_BGND_BLACK+DISP_FGND_GREEN );
			PC_DispStr(15, 5,		    //在15,5位置显示剩余时间,白色字体
				mt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
		}
		if(MyTime<((SwichTime-6)/2+6)&&MyTime>=((SwichTime-6)/2+3))//缓冲时间
		{
			sprintf(mt,"%5d",0);
			PC_DispStr(9, 4,		    //在9,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(5, 5,		    //在5,5位置显示0,白色字体
				mt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
			PC_DispStr(19, 4,		    //在19,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(15, 5,		    //在15,5位置显示0,白色字体
				mt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
		}
		if(MyTime<((SwichTime-6)/2+3)&&MyTime>=3)//红灯时间
		{
			sprintf(mt,"%5d",MyTime-3);
			PC_DispStr(9, 4,		    //在9,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(5, 5,		    //在5,5位置显示剩余时间,白色字体
				mt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
			PC_DispStr(19, 4,		    //在19,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(15, 5,		    //在15,5位置显示剩余时间,白色字体
				mt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
		}
		OSTimeDlyHMSM(0, 0, 1, 0);	    //等待1秒
	}
}
/************************任务YouTask**************************************/
void  YouTask (void *pdata)
{
	char yt[5];                         //用于显示剩余时间
#if OS_CRITICAL_METHOD == 3             //选择函数实现方法
	OS_CPU_SR  cpu_sr;
#endif
	pdata = pdata;                      //防止编译器报错
	YouTime = SwichTime;                //初始YouTask计时器

	OSTaskCreate(CtrlTask,			    //创建任务CtrlTask
		(void*)0,			            //给任务传递参数
		&CtrlTaskStk[TASK_STK_SIZE - 1],//设置任务堆栈栈顶指针
		4);				                //使任务CtrlTask的优先级别为4

	for (;;)                            //YouTask主循环
	{
		if (YouTime==0)                 //计时器减为0,一轮结束
		{
			YouTime=SwichTime;          //计时器重新计时
		}
		YouTime-=1;                     //计时器递减1

		if(YouTime>=((SwichTime-6)/2+6))//红灯时间
		{
			sprintf(yt,"%5d",YouTime-((SwichTime-6)/2+6));
			PC_DispStr(39, 4,		    //在39,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(35, 5,		    //在35,5位置显示剩余时间,白色字体
				yt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
			PC_DispStr(49, 4,		    //在49,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(45, 5,		    //在45,5位置显示剩余时间,白色字体
				yt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
		}
		if(YouTime<((SwichTime-6)/2+3)) //绿灯时间
		{
			sprintf(yt,"%5d",YouTime-3);
			PC_DispStr(39, 4,		    //在39,4位置显示G,绿色字体
				"G",
				DISP_BGND_BLACK+DISP_FGND_GREEN );
			PC_DispStr(35, 5,		    //在35,5位置显示剩余时间,白色字体
				yt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
			PC_DispStr(49, 4,		    //在49,4位置显示G,绿色字体
				"G",
				DISP_BGND_BLACK+DISP_FGND_GREEN );
			PC_DispStr(45, 5,		    //在45,5位置显示剩余时间,白色字体
				yt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
		}
		if(YouTime<3)                   //缓冲时间
		{
			sprintf(yt,"%5d",0);
			PC_DispStr(39, 4,		    //在39,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(35, 5,		    //在35,5位置显示0,白色字体
				yt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
			PC_DispStr(49, 4,		    //在49,4位置显示S,红色字体
				"S",
				DISP_BGND_BLACK+DISP_FGND_RED );
			PC_DispStr(45, 5,		    //在45,5位置显示0,白色字体
				yt,
				DISP_BGND_BLACK+DISP_FGND_WHITE );
		}
		OSTimeDlyHMSM(0, 0, 1, 0);	    //等待1秒
	}
}
/************************任务CtrlTask*************************************/
void  CtrlTask(void *pdata)
{
	INT32U input=0;                     //接受用户输入,初始为0
#if OS_CRITICAL_METHOD == 3             //选择函数实现方法
	OS_CPU_SR  cpu_sr;
#endif
	pdata = pdata;                      //防止编译器报错
	/*显示提示语句*/
	printf("\n\n\n\n\n\n\n  Range Of The Switch Time: 20 to 120 seconds");
	printf("\n  (It will be changed after 1 round, please wait a moment --!)");
	printf("\n\n  Please input switch time of the signal lamp:  ");

	for (;;)                            //CtrlTask主循环
	{
		/*监控键盘输入*/
		if (PC_GetKey(&key) == TRUE)
		{
			if (key == 0x1B)            //如果按下Esc键则退出uCOS_II
			{
				PC_DOSReturn();
			}
			if (key>=48&&key<=57)       //输入0-9之间的数字
			{
				input=input*10+key-48;  //公式用于取得用户输入的十进制数
				printf("%d",key-48);
			}
			if (key == 0xD)             //如果按下Enter键
			{
				if(input>=20&&input<=120)//检测范围
				{
					change=input;       //保存input
					printf("\n\n  You have changed the switch time to %d seconds",input);
					printf("\n\n  Please input switch time of the signal lamp:  ");
				}
				else                    //超出范围,报错
				{
					printf("\n\n  Wrong Time!");
					printf("\n\n  Please input switch time of the signal lamp:  ");
				}
				input=0;                //读取输入完毕,清0
			}
		}
	}
}
/************************End**********************************************/

⌨️ 快捷键说明

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