您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 嵌入式技术课程设计-红绿灯控制系统
《嵌入式技术》课程报告课题名称:嵌入式技术课题负责人名(学号):同组成员名单(角色):指导教师:评阅成绩:评阅意见:提交报告时间:年月日-1-基于μC/OS-II红绿灯控制模拟系统的设计和实现学生指导老师[摘要]红绿灯控制系统是当今现代社会必不可少的一种电子控制设备,属于最常见的实时嵌入式控制系统之一。μC/OS-II是目前最流行的实时嵌入式操作系统之一,有便于移植、易于裁减、使用方便等特点,在各种工业和交通控制系统中得到了广泛的应用。本文设计和实现了一个μC/OS-II的红绿灯控制系统,经过在PC平台上的仿真模拟,提高了最基本的交通控制功能。关键词:μC/OS-II,红绿灯控制系统,模拟仿真-2-1.系统需求本系统需要实现两个方向的红绿灯控制。在屏幕上用绿色的字母‘G’表示绿灯,红色的字母‘S’表示红灯。在相应信号灯字母的下方,用数字表示该信号灯切换的剩余时间。该时间每秒钟减一,减为零时,切换信号灯。信号灯切换时间缺省为60秒。某方向由红灯切换为绿灯时,应有3秒钟的缓冲时间,以确保另一方向的车辆安全通过。即在切换信号灯时,有3秒钟的时间两个方向的信号灯都是红灯。不能出现两个方向都是绿灯的情况。用户可通过键盘输入信号灯切换时间,切换时间范围为20秒~120秒。用户输入的数字以回车键结束。对于错误的输入,系统可不作任何响应。对于正确的输入,下次信号灯切换后,采用新输入的切换时间。用户键入ESC键后,退出该模拟程序。2.系统设计采用μC/OS-II作为操作系统内核的原因。μC/OS-II是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化.μC/OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。μC/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到64位,μC/OS-II已在超过40种不同架构上的微处理器上-3-运行。μC/OS-II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(FederalAviationAdministration)的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safetycritical)系统。更重要的是,μC/OS-II的源码公开,便于移植和维护。在这个系统中设计了两个任务Task1和Task2。其中Task1的任务是接收键盘的输入,判断是否是回车,回车后结束,如果接收到字母的话不做任何响应,如果是数字的话要判断是不是在20到120之间,要不在此区间内则清空缓冲区,接受下一次输入,如果在区间内的话,则传递给Task2,同时在屏幕上显示下一次循环的时间。如果是ESC的话则任务退出。Task2用来设置交通灯的残留时间,初始值为60秒改变一次,当接收到Task1传来的值后,下一次循环按此值计数。-4-3.系统实现3.1main函数说明流程图初始化uCOS_II保存DOS环境安装uCOS_II中断启动多任务管理-5-3.2各个任务的实现说明Task1流程图InstalltimeIRSettimefrequencyInitializestatisticstaskPC_getKeySaveinKey_receiveIsdigit(key)TIME_DEFAULT=aanddisplay20=a=120atoiKey=enterPC_DOSReturnKey=ESCFalseTrueTrue-6-Task2流程图4.程序源码#includeincludes.h/********************************************************定义常量InstalltimeIRSettimefrequencyInitializestatisticstaskPC_getKeyFalse-7-***************************************************/#defineTASK_STK_SIZE512//任务堆栈长度#defineTASK_START_ID0//任务的标示ID#defineTASK_CLK_ID1#defineTASK_1_ID2#defineTASK_2_ID3#defineTASK_START_PRIO10//任务优先级#defineTASK_CLK_PRIO11#defineTASK_1_PRIO13#defineTASK_2_PRIO12/********************************************************变量***************************************************/OS_STKTaskStartStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKTaskClkStk[TASK_STK_SIZE];OS_STKTask1Stk[TASK_STK_SIZE];OS_STKTask2Stk[TASK_STK_SIZE];intLightTime;//定义了交通-8-灯剩余的时间intwaitTime;intSetTime;//定义了交通灯的最大值/********************************************************函数原形***************************************************/voidTaskStart(void*data);staticvoidTaskStartCreateTasks(void);staticvoidTaskStartDispInit(void);staticvoidTaskStartDisp(void);voidTaskClk(void*data);voidTask1(void*data);voidTask2(void*data);voidDisplayLight(intsem);voidDisplayLightS(void);voidDisplayLightG(void);voidDisplayLightBS(void);/********************************************************程序入口***************************************************/-9-voidmain(void){OS_STK*ptos;OS_STK*pbos;INT32Usize;PC_DispClrScr(DISP_FGND_WHITE);//清屏OSInit();//初始化uCOS_IIPC_DOSSaveReturn();//保存Dos环境PC_VectSet(uCOS,OSCtxSw);//安装uCOS_II中断PC_ElapsedInit();//初始化共用时间变量ptos=&TaskStartStk[TASK_STK_SIZE-1];//TaskStart使用浮点数pbos=&TaskStartStk[0];size=TASK_STK_SIZE;SetTime=60;//初始化了信号灯切换时间OSTaskStkInit_FPE_x86(&ptos,&pbos,&size);OSTaskCreateExt(TaskStart,//创建任务StartTask-10-(void*)0,//给任务传递参数ptos,TASK_START_PRIO,//使任务的优先级别为0TASK_START_ID,pbos,size,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);OSStart();//启动多任务管理}/********************************************************开始任务***************************************************/voidTaskStart(void*pdata){#ifOS_CRITICAL_METHOD==3//分配储存CPU状态的寄存器OS_CPU_SRcpu_sr;#endifINT16Skey;-11-pdata=pdata;TaskStartDispInit();//调用显示初始化函数OS_ENTER_CRITICAL();//安装时钟tickPC_VectSet(0x08,OSTickISR);//安装时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);//设置uCOS_II时钟频率OS_EXIT_CRITICAL();OSStatInit();//初始化统计任务TaskStartCreateTasks();//调用函数创建各种任务for(;;){TaskStartDisp();//更新显示(用于更新设置的参数)if(PC_GetKey(&key)){//处理键盘响应if(key==0x1B){//如果按下Esc键则退出uCOS_IIPC_DOSReturn();}-12-if(key==0x31){//如果按下数字'1'键则将SetTime的全局变量加一SetTime++;if(SetTime120)SetTime=120;}if(key==0x32){//如果按下数字'1'键则将SetTime的全局变量减一SetTime--;if(SetTime20)SetTime=20;}}OSCtxSwCtr=0;OSTimeDly(OS_TICKS_PER_SEC);//设置1秒钟的时延}}/********************************************************界面显示函数***************************************************/staticvoidTaskStartDispInit(void){PC_DispStr(0,0,TrafficLightsSystem,DISP_FGND_WHITE+DISP_BGND_RED+DISP_BLINK);-13-PC_DispStr(0,1,,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,2,,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,3,,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,4,||,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,5,||,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,6,||,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,7,||N-SLight:[],DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,8,||TimeRemain:(s),DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,9,____________________||______________________,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(0,10,,DISP_BGND_BLACK+DISP_FGND_W
本文标题:嵌入式技术课程设计-红绿灯控制系统
链接地址:https://www.777doc.com/doc-2031686 .html