嵌入式技术课程报告红绿灯控制系统.docx
- 文档编号:30484769
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:21
- 大小:128.01KB
嵌入式技术课程报告红绿灯控制系统.docx
《嵌入式技术课程报告红绿灯控制系统.docx》由会员分享,可在线阅读,更多相关《嵌入式技术课程报告红绿灯控制系统.docx(21页珍藏版)》请在冰豆网上搜索。
嵌入式技术课程报告红绿灯控制系统
《嵌入式技术》课程报告
课题名称:
嵌入式技术
课题负责人名(学号):
同组成员名单(角色):
指导教师:
评阅成绩:
评阅意见:
提交报告时间:
年月日
基于μ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);
}
/*
******************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 技术 课程 报告 红绿灯 控制系统