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

📄 test.c

📁 实现交通灯的定时闪烁并依据等待车辆的数量来实现红绿灯的转换。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 本程序为十字路口交通控制系统*/
/*注明:一下PC_DispChar()或者PC_DispStr()处于顶格位置的即为 动画演示语句,如不需要可以注释掉,为了删减方便所以如此设置 */

#include "includes.h"
#include "stdlib.h"
                                                                                        /*#include <time.h>  */                   
#include <stdio.h> /*需引用的头文件*/
/********************************************************************************/

#define  TASK_STK_SIZE   512				//任务堆栈长度
OS_STK   StartTaskStk[TASK_STK_SIZE];		//定义任务堆栈区
OS_STK   myTaskStk[TASK_STK_SIZE];
OS_STK   youTaskStk[TASK_STK_SIZE];			//定义任务堆栈区
OS_STK   herTaskStk[TASK_STK_SIZE];

OS_EVENT  * stop_Mutex;						//定义事件控制块
                                             
void  StartTask(void *data);			//声明起始任务
void  myTask(void *data);				//声明任务1
void  youTask(void *data);				//声明任务2
void  herTask(void *data);				//声明任务3

 
/***********************************显 示 信 息*********************************************************************************/
INT16S   key;						                     //用于退出的键
char *s018="THE CONTRROLL SYSTEM OF THE CROSS";         //在屏幕的0行的中间用白色显示“十字路口交通控制系统”
char *s22= " run  west and slow down";                  //在屏幕的2行2列位置用绿色的显示“请减速通过路口向东行”
char *s236=" run  east and slow down";                  //在屏幕的2行36列位置用绿色的显示“请减速通过路口向西行”
char *s32= " turn left and slow down";                  //在屏幕的3行2列位置用黄色的显示“请减速通过路口左拐”,同时闪烁50秒结束
char *s336=" turn left and slow down";                  //在屏幕的3行36列位置用黄色的显示“请减速通过路口左拐”,同时闪烁50秒结束
char *s42= " wait,cars running east";                   //在屏幕的4行2列位置用红色的显示“请东行汽车停车等候!”
char *s436=" wait,cars running  west";                  // 在屏幕的4行36列位置用红色的显示“请西行汽车停车等候!
char *s62= " run south and slow down  ";               //在屏幕的6行2列位置用绿色的显示“请减速通过路口向南行”
char *s636=" run north and slow down  ";               //在屏幕的6行36列位置用绿色的显示“请减速通过路口向北行”
char *s72= " turn left and slow down  ";               //在屏幕的7行2列位置用黄色的显示“请减速通过路口左拐”,同时闪烁50秒结束
char *s736=" turn left and slow down  ";               // 在屏幕的7行36列位置用黄色的显示“请减速通过路口左拐”,同时闪烁50秒结束
char *s82= " wait,cars running south";                  //在屏幕的8行2列位置用红色的显示“请南行汔车停车等候!”
char *s836=" wait,cars running north";                  //在屏幕的8行36列位置用红色的显示“请北行汔车停车等候!”
//char *s1=  " number running east is XX";                // 橙色显示“向东行等候人数为X位”
//char *s2=  " number running west is YY";                //橙色显示“向西行等候人数为Y位”
//char *s3=  " number running south is XX";               //橙色显示 “向南行等候人数为X位”
//char *s4=  " number running north is YY";               //橙色显示 “向北行等候人数为Y位”
char *s5=  "                           ";
char *s6;

INT16U a=27;      //左转箭头
INT16U b=24;      //向上箭头
INT16U c=25;      //向下箭头
INT16U d=26;      //向右箭头
INT16U e=45;      // 停车标志
INT16U f=8;       //交通灯模型
INT16U g=30;      //上三角箭头
INT16U h=31;      //下三角箭头
INT16U i=16;      //右三角箭头
INT16U l=2;       //岗亭模型

INT8U err;  						
INT8U y=0;		 //字符显示位置 
INT8U x=2;

INT8U j=0;				
INT8U m;
INT8U n;
INT8U s;
INT8U q;
INT8U u;
INT8U Time=1;
INT16U W;
INT16U X=48;       //控制随机数范围
INT16U Y=57;
INT16U Z;
INT16U NumWait(){srand((unsigned)time(NULL)); 
                 return (rand()%(Y-X+1)+X);} ;             /* 产生0~9之间的随机数*/


//PC_Clear();



/************************主函数*****************************************************************************************/
   void main(void)
{
    OSInit( );						             //初始化uCOS_II
    
    PC_DOSSaveReturn( );				         //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);				     //安装uCOS_II中断

    stop_Mutex=OSMutexCreate(2,&err);            //创建互斥信号量
                                                                                      





	PC_DispStr(18,0,
		s018,
		DISP_BGND_BLACK+DISP_FGND_WHITE );       //显示标题

/**************************动画显示************************************************************************************************/
	PC_DispChar(28,5,c,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(32,5,b,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(30,4,a,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(30,6,d,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(27,5,f,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(33,5,f,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(26,5,f,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(34,5,f,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(30,3,f,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(30,7,f,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(30,2,f,DISP_BGND_BLACK+DISP_FGND_WHITE );
	PC_DispChar(30,8,f,DISP_BGND_BLACK+DISP_FGND_WHITE );


/**************************相关信息显示************************************************************************************************/

	PC_DispStr(48,20,"Shi Shaomeng",DISP_BGND_BLACK+DISP_FGND_PURPLE);
	
    PC_GetDateTime(s6);
	PC_DispStr(42,22,s6,DISP_BGND_BLACK+DISP_FGND_WHITE );


	PC_DispChar(6,17,f,DISP_BGND_BLACK+DISP_FGND_GREEN );                  //红,绿灯和黄色左拐灯
	PC_DispChar(6,18,f,DISP_BGND_BLACK+DISP_FGND_RED );
	PC_DispChar(6,19,a,DISP_BGND_BLACK+DISP_FGND_YELLOW );
	PC_DispStr(9,17,"----This represents a green light",DISP_BGND_BLACK+DISP_FGND_GREEN );                  //交通灯示意图说明
	PC_DispStr(9,18,"-----This represents a red light",DISP_BGND_BLACK+DISP_FGND_RED );
	PC_DispStr(9,19,"------This represents a yellow light",DISP_BGND_BLACK+DISP_FGND_YELLOW );
	
    
	OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE - 1],0);    //创建StartTask						

    OSStart();
}
/***********************任务StartTask*************************************************************************************************/
void  StartTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
	pdata=pdata;
    OS_ENTER_CRITICAL( );
    PC_VectSet(0x08, OSTickISR);		//安装时钟中断向量
    PC_SetTickRate(OS_TICKS_PER_SEC);		//设置uCOS_II时钟频率
    OS_EXIT_CRITICAL( );
    OSStatInit( );				//初始化统计任务

    OSTaskCreate(myTask,(void*)0,&myTaskStk[TASK_STK_SIZE - 1],	3);	//创建任务myTask,第2行绿色字符、8行红色字符显示事务,南北向的检测器完成的事务			
    OSTaskCreate(youTask,(void*)0,&youTaskStk[TASK_STK_SIZE - 1],4);//创建任务youTask,第4行红色字符、6行绿色字符显示事务,东西向的检测器完成的事务
	OSTaskCreate(herTask,(void*)0,&herTaskStk[TASK_STK_SIZE - 1],5);//创建任务herTask,第3,7行显示向左拐弯的事务
	
  
    for (;;) 
    {
	//如果按下Esc键则退出uCOS_II
		if (PC_GetKey(&key) == TRUE) 
		{
            if (key == 0x1B) 
	    	{
                PC_DOSReturn( );
            }
        }
        OSTimeDlyHMSM(0, 0, 3, 0);	//等待3秒
    }
}



/************************任务MyTask***************************************************************************************************/
void  myTask (void *pdata)                                  
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata;
  
    for (;;) 
    { 

  

        OSMutexPend(stop_Mutex,0,&err);      //请求信号

		if(err==OS_NO_ERR)                   //请求信号成功
		{
             
		PC_DispChar(1,2,a,DISP_BGND_BLACK+DISP_FGND_GREEN );     //显示向左箭头
PC_DispChar(26,5,f,DISP_BGND_BLACK+DISP_FGND_GREEN);
	    PC_DispStr(2,2,s22,DISP_BGND_BLACK+DISP_FGND_GREEN );    //显示第2行绿色
PC_DispChar(34,5,f,DISP_BGND_BLACK+DISP_FGND_GREEN );            //
		PC_DispChar(35,2,d,DISP_BGND_BLACK+DISP_FGND_GREEN );    //显示向右箭头
		PC_DispStr(36,2,s236,DISP_BGND_BLACK+DISP_FGND_GREEN );  //显示第2行绿色

⌨️ 快捷键说明

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