📄 test.c
字号:
/* 本程序为十字路口交通控制系统*/
/*注明:一下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 + -