ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:128.01KB ,
资源ID:30484769      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30484769.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式技术课程报告红绿灯控制系统.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、嵌入式技术课程报告红绿灯控制系统嵌入式技术课程报告课题名称: 嵌入式技术 课题负责人名(学号): 同组成员名单(角色): 指导教师: 评阅成绩: 评阅意见: 提交报告时间: 年 月 日基于C/OS-II红绿灯控制模拟系统的设计和实现学生 指导老师 摘要 红绿灯控制系统是当今现代社会必不可少的一种电子控制设备,属于最常见的实时嵌入式控制系统之一。C/OS-II是目前最流行的实时嵌入式操作系统之一,有便于移植、易于裁减、使用方便等特点,在各种工业和交通控制系统中得到了广泛的应用。本文设计和实现了一个C/OS-II的红绿灯控制系统,经过在PC平台上的仿真模拟,提高了最基本的交通控制功能。关键词:C/

2、OS-II,红绿灯控制系统,模拟仿真1. 系统需求本系统需要实现两个方向的红绿灯控制。在屏幕上用绿色的字母G表示绿灯,红色的字母S表示红灯。在相应信号灯字母的下方,用数字表示该信号灯切换的剩余时间。该时间每秒钟减一,减为零时,切换信号灯。信号灯切换时间缺省为60秒。某方向由红灯切换为绿灯时,应有3秒钟的缓冲时间,以确保另一方向的车辆安全通过。即在切换信号灯时,有3秒钟的时间两个方向的信号灯都是红灯。不能出现两个方向都是绿灯的情况。用户可通过键盘输入信号灯切换时间,切换时间范围为20秒120秒。用户输入的数字以回车键结束。对于错误的输入,系统可不作任何响应。对于正确的输入,下次信号灯切换后,采用

3、新输入的切换时间。用户键入ESC键后,退出该模拟程序。2. 系统设计采用C/OS-II做为操作系统内核的原因。C/OS-II 是一种基于优先级的抢占式多 任务实时操作系统, 包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化.C /OS-II是一个完整的、可移植、可固化、可裁剪的占先式实时多任务内核。C/OS-II绝大部分的代码是用ANSI的C语言编写的,包含一小部 分汇编代码, 使之可供不同架构的微处理器使用。至今,从8

4、位到6 4位,C/OS-II已在超过40种不同架构上的微处理器上运行。C/OS-II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制 上。实际上,C/OS-II已经通过了非常严格的 测试,并且得到了美国航空管 理局(Federal Aviation Administration)的认证,可以用在飞行器上。这说明C/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要(safety critical)系统。更重要的是,C/OS-II的源码公开,便于移植和维护。在这个系统中设计了两个任务Task1和Task2。其中Task1的任务是接收键盘

5、的输入,判断是否是回车,回车后结束,如果接收到字母的话不做任何响应,如果是数字的话要判断是不是在20到120之间,要不在此区间内则清空缓冲区,接受下一次输入,如果在区间内的话,则传递给Task2,同时在屏幕上显示下一次循环的时间。如果是ESC的话则任务退出。Task2用来设置交通灯的残留时间,初始值为60秒改变一次,当接收到Task1传来的值后,下一次循环按此值计数。3. 系统实现3.1 main函数说明流程图3.2 各个任务的实现说明Task1流程图Task2流程图4. 程序源码#include includes.h/*定义常量*/#define TASK_STK_SIZE 512 / 任务

6、堆栈长度#define TASK_START_ID 0 / 任务的标示ID#define TASK_CLK_ID 1#define TASK_1_ID 2#define TASK_2_ID 3#define TASK_START_PRIO 10 / 任务优先级#define TASK_CLK_PRIO 11#define TASK_1_PRIO 13#define TASK_2_PRIO 12/*变量*/OS_STK TaskStartStkTASK_STK_SIZE; / 定义任务堆栈区OS_STK TaskClkStkTASK_STK_SIZE; OS_STK Task1StkTASK_S

7、TK_SIZE; OS_STK Task2StkTASK_STK_SIZE; int LightTime; / 定义了交通灯剩余的时间int waitTime;int SetTime; / 定义了交通灯的最大值 /*函数原形*/ void TaskStart(void *data); static void TaskStartCreateTasks(void);static void TaskStartDispInit(void);static void TaskStartDisp(void); void TaskClk(void *data); void Task1(void *data);

8、 void Task2(void *data); void DisplayLight(int sem); void DisplayLightS(void); void DisplayLightG(void); void DisplayLightBS(void);/*程序入口*/void main (void) OS_STK *ptos; OS_STK *pbos; INT32U size; PC_DispClrScr(DISP_FGND_WHITE); / 清屏 OSInit(); / 初始化uCOS_II PC_DOSSaveReturn(); / 保存Dos环境 PC_VectSet(uC

9、OS, OSCtxSw); / 安装uCOS_II中断 PC_ElapsedInit(); / 初始化共用时间变量 ptos = &TaskStartStkTASK_STK_SIZE - 1; / TaskStart使用浮点数 pbos = &TaskStartStk0; size = TASK_STK_SIZE; SetTime = 60; /初始化了信号灯切换时间 OSTaskStkInit_FPE_x86(&ptos, &pbos, &size); OSTaskCreateExt(TaskStart, /创建任务StartTask (void *)0, /给任务传递参数 ptos, TA

10、SK_START_PRIO, /使任务的优先级别为0 TASK_START_ID, pbos, size, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSStart(); /启动多任务管理/*开始任务*/void TaskStart (void *pdata)#if OS_CRITICAL_METHOD = 3 / 分配储存CPU状态的寄存器 OS_CPU_SR cpu_sr;#endif INT16S key; pdata = pdata; TaskStartDispInit(); / 调用显示初始化函数 OS_ENTER_

11、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_I

12、I 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秒钟的时延 /*界面显示函数*/static void TaskStartDispInit (void) PC_DispStr(

13、 0, 0, Traffic Lights System , 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

14、_DispStr( 0, 5, | | , DISP_BGND_BLACK+DISP_FGND_WHITE); PC_DispStr( 0, 6, | | , DISP_BGND_BLACK+DISP_FGND_WHITE); PC_DispStr( 0, 7, | | N-S Light : , 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+

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

16、 PC_DispStr( 0, 15, W-E Light : | | , 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_B

17、LACK+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, , DISP_BGND_BLACK+DISP_FGND_WHITE)

18、;/*初始化显示*/static void TaskStartDisp (void) char *arr; int arrow2 = 49,50; sprintf(arr,SetTime: %d ( %c Add, %c Reduce), SetTime,arrow0,arrow1); PC_DispStr( 0, 23, arr, DISP_BGND_BLACK+DISP_FGND_WHITE);/*创建任务*/static void TaskStartCreateTasks (void) OSTaskCreateExt(TaskClk, (void *)0, &TaskClkStkTASK

19、_STK_SIZE - 1, TASK_CLK_PRIO, TASK_CLK_ID, &TaskClkStk0, TASK_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTaskCreateExt(Task1, (void *)0, &Task1StkTASK_STK_SIZE - 1, TASK_1_PRIO, TASK_1_ID, &Task1Stk0, TASK_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); OSTas

20、kCreateExt(Task2, (void *)0, &Task2StkTASK_STK_SIZE - 1, TASK_2_PRIO, TASK_2_ID, &Task2Stk0, TASK_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/*交通灯显示任务*/void Task1 (void *pdata) int sem = 0; int change = 0; INT8U err; OS_STK_DATA data; INT16U time; INT8U i; char *ss = NULL; char

21、s80; INT32U T; 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_BLAC

22、K); PC_DispStr(24, 16, , DISP_FGND_LIGHT_RED + DISP_BGND_BLACK); if (LightTime 4) / 通过信号和change变量控制信号灯的逻辑 sem = 1; if (change & LightTime = 0) change = 0; else if (!change & LightTime = 0) change = 1; if (sem = 1 & LightTime = 0 & change = 0) sem = 0; else if (sem = 1 & LightTime = 0 & change = 1) s

23、em = 2; DisplayLight(sem); OSTimeDlyHMSM(0, 0, 1, 0); /*显示交通灯状态*/void DisplayLight(int sem) if (sem = 0) / 按照传入信号量的不同设置显示的状态. DisplayLightS(); else if (sem = 1) DisplayLightBS(); else if (sem = 2) DisplayLightG(); /* 交通灯显示 红 绿*/void DisplayLightS(void) PC_DispStr(57, 7, S, DISP_FGND_LIGHT_RED + DISP

24、_BGND_BLACK); PC_DispStr(24, 15, G, DISP_FGND_LIGHT_GREEN + DISP_BGND_BLACK);/*交通灯显示 绿 红*/void DisplayLightG(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);/*交通灯显示 红 红*/void DisplayLightBS(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