嵌入式技术课程报告红绿灯控制系统.docx

上传人:b****8 文档编号:30484769 上传时间:2023-08-15 格式:DOCX 页数:21 大小:128.01KB
下载 相关 举报
嵌入式技术课程报告红绿灯控制系统.docx_第1页
第1页 / 共21页
嵌入式技术课程报告红绿灯控制系统.docx_第2页
第2页 / 共21页
嵌入式技术课程报告红绿灯控制系统.docx_第3页
第3页 / 共21页
嵌入式技术课程报告红绿灯控制系统.docx_第4页
第4页 / 共21页
嵌入式技术课程报告红绿灯控制系统.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

嵌入式技术课程报告红绿灯控制系统.docx

《嵌入式技术课程报告红绿灯控制系统.docx》由会员分享,可在线阅读,更多相关《嵌入式技术课程报告红绿灯控制系统.docx(21页珍藏版)》请在冰豆网上搜索。

嵌入式技术课程报告红绿灯控制系统.docx

嵌入式技术课程报告红绿灯控制系统

《嵌入式技术》课程报告

 

课题名称:

嵌入式技术

 

课题负责人名(学号):

同组成员名单(角色):

指导教师:

评阅成绩:

评阅意见:

提交报告时间:

年月日

基于μC/OS-II红绿灯控制模拟系统的设计和实现

 

学生指导老师

 

[摘要]红绿灯控制系统是当今现代社会必不可少的一种电子控制设备,属于最常见的实时嵌入式控制系统之一。

μC/OS-II是目前最流行的实时嵌入式操作系统之一,有便于移植、易于裁减、使用方便等特点,在各种工业和交通控制系统中得到了广泛的应用。

本文设计和实现了一个μC/OS-II的红绿灯控制系统,经过在PC平台上的仿真模拟,提高了最基本的交通控制功能。

 

关键词:

μC/OS-II,红绿灯控制系统,模拟仿真

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种不同架构上的微处理器上运行。

μC/OS-II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。

实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局(FederalAviationAdministration)的认证,可以用在飞行器上。

这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safetycritical)系统。

更重要的是,μC/OS-II的源码公开,便于移植和维护。

在这个系统中设计了两个任务Task1和Task2。

其中Task1的任务是接收键盘的输入,判断是否是回车,回车后结束,如果接收到字母的话不做任何响应,如果是数字的话要判断是不是在20到120之间,要不在此区间内则清空缓冲区,接受下一次输入,如果在区间内的话,则传递给Task2,同时在屏幕上显示下一次循环的时间。

如果是ESC的话则任务退出。

Task2用来设置交通灯的残留时间,初始值为60秒改变一次,当接收到Task1传来的值后,下一次循环按此值计数。

 

3.系统实现

3.1main函数说明

流程图

 

 

3.2各个任务的实现说明

Task1流程图

 

Task2流程图

 

4.程序源码

#include"includes.h"

/*

*******************************************************

定义常量

**************************************************

*/

#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;//定义了交通灯剩余的时间

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);

/*

*******************************************************

程序入口

**************************************************

*/

voidmain(void)

{

OS_STK*ptos;

OS_STK*pbos;

INT32Usize;

 

PC_DispClrScr(DISP_FGND_WHITE);//清屏

OSInit();//初始化uCOS_II

PC_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

(void*)0,//给任务传递参数

ptos,

TASK_START_PRIO,//使任务的优先级别为0

TASK_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;

#endif

INT16Skey;

 

pdata=pdata;

TaskStartDispInit();//调用显示初始化函数

OS_ENTER_CRITICAL();//安装时钟tick

PC_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_II

PC_DOSReturn();

}

if(key==0x31){//如果按下数字'1'键则将SetTime的全局变量加一

SetTime++;

if(SetTime>120)

SetTime=120;

}

if(key==0x32){//如果按下数字'1'键则将SetTime的全局变量减一

SetTime--;

if(SetTime<20)

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);

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_WHITE);

PC_DispStr(0,11,"",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,12,"",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,13,"___________________________________________",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,14,"||",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,15,"W-ELight:

[]||",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,16,"TimeRemain:

(s)||",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,17,"||",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,18,"||",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,19,"||",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,20,"||",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,21,"",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,22,"",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,23,"",DISP_BGND_BLACK+DISP_FGND_WHITE);

PC_DispStr(0,24,"<-PRESS'ESC'TOQUIT->",DISP_BGND_BLACK+DISP_FGND_WHITE);

}

/*

*******************************************************

初始化显示

**************************************************

*/

staticvoidTaskStartDisp(void)

{

char*arr;

intarrow[2]={49,50};

sprintf(arr,"SetTime:

%d(%cAdd,%cReduce)",SetTime,arrow[0],arrow[1]);

PC_DispStr(0,23,arr,DISP_BGND_BLACK+DISP_FGND_WHITE);

}

/*

*******************************************************

创建任务

**************************************************

*/

staticvoidTaskStartCreateTasks(void)

{

OSTaskCreateExt(TaskClk,

(void*)0,

&TaskClkStk[TASK_STK_SIZE-1],

TASK_CLK_PRIO,

TASK_CLK_ID,

&TaskClkStk[0],

TASK_STK_SIZE,

(void*)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

OSTaskCreateExt(Task1,

(void*)0,

&Task1Stk[TASK_STK_SIZE-1],

TASK_1_PRIO,

TASK_1_ID,

&Task1Stk[0],

TASK_STK_SIZE,

(void*)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

OSTaskCreateExt(Task2,

(void*)0,

&Task2Stk[TASK_STK_SIZE-1],

TASK_2_PRIO,

TASK_2_ID,

&Task2Stk[0],

TASK_STK_SIZE,

(void*)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

}

/*

*******************************************************

交通灯显示任务

**************************************************

*/

voidTask1(void*pdata)

{

intsem=0;

intchange=0;

INT8Uerr;

OS_STK_DATAdata;

INT16Utime;

INT8Ui;

char*ss=NULL;

chars[80];

INT32UT;

pdata=pdata;

for(;;){

sprintf(ss,"%d",LightTime);//将当前剩余时间转换成为字符串

PC_DispStr(56,8,ss,DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);//打印剩余时间

PC_DispStr(23,16,ss,DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);

if(LightTime<10){//处理个位显示

PC_DispStr(57,8,"",DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);

PC_DispStr(24,16,"",DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);

}

if(LightTime<4){//通过信号和change变量控制信号灯的逻辑

sem=1;

if(change&&LightTime==0)

change=0;

elseif(!

change&&LightTime==0)

change=1;

}

if(sem==1&&LightTime==0&&change==0){

sem=0;

}

elseif(sem==1&&LightTime==0&&change==1){

sem=2;

}

DisplayLight(sem);

OSTimeDlyHMSM(0,0,1,0);

}

}

/*

*******************************************************

显示交通灯状态

**************************************************

*/

voidDisplayLight(intsem)

{

if(sem==0)//按照传入信号量的不同设置显示的状态.

{

DisplayLightS();

}

elseif(sem==1)

{

DisplayLightBS();

}

elseif(sem==2)

{

DisplayLightG();

}

}

/*

*******************************************************交通灯显示红绿

**************************************************

*/

voidDisplayLightS(void)

{

PC_DispStr(57,7,"S",DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);

PC_DispStr(24,15,"G",DISP_FGND_LIGHT_GREEN+DISP_BGND_BLACK);

}

/*

*******************************************************

交通灯显示绿红

**************************************************

*/

voidDisplayLightG(void)

{

PC_DispStr(24,15,"S",DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);

PC_DispStr(57,7,"G",DISP_FGND_LIGHT_GREEN+DISP_BGND_BLACK);

}

/*

*******************************************************

交通灯显示红红

**************************************************

*/

voidDisplayLightBS(void)

{

PC_DispStr(57,7,"S",DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);

PC_DispStr(24,15,"S",DISP_FGND_LIGHT_RED+DISP_BGND_BLACK);

}

/*

******************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1