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

📄 traffic.c

📁 实现交通信号控制(uc/os-ii实现的)用空格实现重新开始
💻 C
字号:
#include"includes.h"
#define task_stk_size 512
OS_STK taskstartstk[task_stk_size];
OS_STK task1stk[task_stk_size];
OS_STK task2stk[task_stk_size];
OS_STK keybroadtaskstr[task_stk_size];
OS_STK timestk[task_stk_size];
void taskstart(void *);
void task1(void *);//创建任务1来控制南北通道的信号灯
void task2(void *);//创建任务2来控制东西通道的信号灯
void keybroadtask(void *);//创建键盘任务来控制南北通道的信号灯
void timetask(void*);//创建时间任务来管理显示时间
void  windowsdispinit(void); 
OS_EVENT *sem1,*sem2;
int time,time1;
INT8U *s,*s1,*s2;
INT8U err; 
void main()
{
   OSInit();
   PC_DOSSaveReturn(); 
   PC_VectSet(uCOS,OSCtxSw);
   OS_ENTER_CRITICAL(); 
   PC_VectSet(0x08, OSTickISR); 
   PC_SetTickRate(OS_TICKS_PER_SEC); 
   OS_EXIT_CRITICAL();
   windowsdispinit(); 
   sem1=OSSemCreate(1);
   sem2=OSSemCreate(1);
   OSTaskCreate(taskstart, (void*)0, &taskstartstk[task_stk_size-1], 0);
   OSStart(); 
}
void taskstart(void *pdata)
{
  #if OS_CRITICAL_METHOD==3
	OS_CPU_SR cpu_sr;
  #endif	
  INT16S key;int time3; 
  pdata=pdata;
  OSSemPend(sem1,0,&err);
  OSSemPend(sem2,0,&err);
  OSTaskCreate(task1, (void*)0, &task1stk[task_stk_size-1], 1);
  OSTaskCreate(task2, (void*)0, &task2stk[task_stk_size-1], 2);
  OSTaskCreate(timetask, (void*)0, &timestk[task_stk_size-1], 3);
  PC_DispStr(3,2,"  ",DISP_BGND_BLACK);
  PC_DispStr(7,2,"  ",DISP_BGND_BLACK);
  PC_DispStr(11,2,"  ",DISP_BGND_BLACK);
  PC_DispStr(67,2,"  ",DISP_BGND_BLACK);
  PC_DispStr(71,2,"  ",DISP_BGND_BLACK);
  PC_DispStr(75,2,"  ",DISP_BGND_BLACK);
  PC_DispStr(20,12,"please press 'ENTER' key to start!",DISP_FGND_BLUE+DISP_BLINK);
  for(;;)
  {
	  if(PC_GetKey(&key)==TRUE)
	  {
		  if(key==0xD)
		  {
            PC_DispStr(20,12,"                                  ",DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
            OSSemPost(sem1);
			OSSemPost(sem2);
			break;
		  }
	  }

  }
  for(;;)
  {   
	  
	  if(PC_GetKey(&key)==TRUE)
	  { 
		     if(key==0x20)
			 {    
				  time3=20;
				  OSTaskDel(1);
				  OSTaskDel(2);
				  OSTaskDel(3);
				 
				  PC_DispStr(3,2,"  ",DISP_BGND_BLACK);
				  PC_DispStr(7,2,"  ",DISP_BGND_BLACK);
				  PC_DispStr(11,2,"  ",DISP_BGND_BLACK);
				  PC_DispStr(67,2,"  ",DISP_BGND_BLACK);
				  PC_DispStr(71,2,"  ",DISP_BGND_BLACK);
				  PC_DispStr(75,2,"  ",DISP_BGND_BLACK);
				  PC_DispStr(20,20,"  ",DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
                  PC_DispStr(60,20,"  ",DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
				  while(time3>0)
				  {
					  sprintf(s2, "%1d",time3);
					  PC_DispStr(40,20,s2,DISP_FGND_YELLOW+DISP_BLINK);
					  OSTimeDlyHMSM(0,0,1,0);
					  time3--;
				  }
				  PC_DispStr(40,20,"   ",DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
				  sem1=OSSemCreate(1);
                  sem2=OSSemCreate(1);
				  OSTaskCreate(task1, (void*)0, &task1stk[task_stk_size-1], 1); 
                  OSTaskCreate(task2, (void*)0, &task2stk[task_stk_size-1], 2);
                  OSTaskCreate(timetask, (void*)0, &timestk[task_stk_size-1], 3);

			 }
			 if(key==0x1B)
			 {
				 PC_DOSReturn();
			 } 
	  }
     OSTimeDlyHMSM(0,0,0,20); 
  }

}
void task1(void *pdata)
{
  #if OS_CRITICAL_METHOD==3
	OS_CPU_SR cpu_sr;
  #endif
  int count=0,flag=0;
     time=60;
	pdata=pdata;
	for(;;)
	{  
		      if(time==60&&flag==0)//控制绿灯显示
				{
					OSSemPend(sem1,0,&err);
					PC_DispStr(7,2,"  ",DISP_BGND_BLACK);
					PC_DispStr(11,2,"  ",DISP_BGND_BLACK);
					while(count<60)
					{
						PC_DispStr(3,2,"  ",DISP_BGND_GREEN) ;
						OSTimeDlyHMSM(0,0,1,0);
						count++;
					}
					OSSemPost(sem1);
					flag=1;
					count=0;
				}
			  else  if(time==60&&flag==1)//控制黄灯显示
					  {
						OSSemPend(sem1,0,&err);
						PC_DispStr(3,2,"  ",DISP_BGND_BLACK);
						PC_DispStr(11,2,"  ",DISP_BGND_BLACK);
						while(count<3)
						{
						  PC_DispStr(7,2,"  ",DISP_BGND_PURPLE);
						  OSTimeDlyHMSM(0,0,1,0);
						  count++;
						}
						 count=0;
						 OSSemPost(sem1);
					}			  
			 else  if(time==57&&flag==1)//控制红灯显示
					{
						OSSemPend(sem1,0,&err);
          				PC_DispStr(3,2,"  ",DISP_BGND_BLACK) ;
						PC_DispStr(7,2,"  ",DISP_BGND_BLACK);
						while(count<57)
						{
							PC_DispStr(11,2,"  ",DISP_BGND_RED);
							OSTimeDlyHMSM(0,0,1,0);
							count++;
						}
						flag=0;
						count=0;
						OSSemPost(sem1);
					}
		OSTimeDlyHMSM(0,0,0,20);
	}

}
void task2(void *pdata)
{
  #if OS_CRITICAL_METHOD==3
	OS_CPU_SR cpu_sr;
  #endif
	int count2=0,flag2=0;
	time1=60;
	pdata=pdata;
	for(;;)
	{  
		      if(time1==60&&flag2==1)//控制绿灯显示
				{
					OSSemPend(sem2,0,&err);
					PC_DispStr(71,2,"  ",DISP_BGND_BLACK);
					PC_DispStr(75,2,"  ",DISP_BGND_BLACK);
					while(count2<60)
					{
						PC_DispStr(67,2,"  ",DISP_BGND_GREEN) ;
						OSTimeDlyHMSM(0,0,1,0);
						count2++;
					}
					OSSemPost(sem2);
					flag2=0;
					count2=0;
				}
			  else  if(time1==3&&flag2==0)//控制黄灯显示
					  {
						OSSemPend(sem2,0,&err);
						PC_DispStr(67,2,"  ",DISP_BGND_BLACK);
						PC_DispStr(75,2,"  ",DISP_BGND_BLACK);
						while(count2<3)
						{
						  PC_DispStr(71,2,"  ",DISP_BGND_PURPLE);
						  OSTimeDlyHMSM(0,0,1,0);
						  count2++;
						}
						 count2=0;
						 flag2=1;
						 OSSemPost(sem2);
					}			  
			 else  if(time1==60&&flag2==0)//控制红灯显示
					{
						OSSemPend(sem2,0,&err);
          				PC_DispStr(67,2,"  ",DISP_BGND_BLACK) ;
						PC_DispStr(71,2,"  ",DISP_BGND_BLACK);
						while(count2<57)
						{
							PC_DispStr(75,2,"  ",DISP_BGND_RED);
							OSTimeDlyHMSM(0,0,1,0);
							count2++;
						}
						count2=0;
						OSSemPost(sem2);
					}
		OSTimeDlyHMSM(0,0,0,20);
	}

}
void timetask(void *pdata)
{
	for(;;)
	{
		if(time==0&&time1==0)
		{
		  time=60;
		  time1=60;
		}
		sprintf(s, "%1d",time);
		PC_DispStr(20,20,s,DISP_FGND_YELLOW+DISP_BLINK);
		sprintf(s1, "%1d",time1);
        PC_DispStr(60,20,s1,DISP_FGND_YELLOW+DISP_BLINK);
		OSTimeDlyHMSM(0,0,1,0);
		time--;
		time1--;
	}
}
	
  void  windowsdispinit (void) 
  { 
    PC_DispStr( 0,  0, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  1, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  2, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  3, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  4, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  5, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  6, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  7, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  8, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0,  9, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 10, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 11, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 12, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 13, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 14, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 15, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 16, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 17, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 18, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 19, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 20, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 21, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 22, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 23, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
    PC_DispStr( 0, 24, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); 
  } 
 

⌨️ 快捷键说明

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