《操作系统课程设计-交通信号灯模拟》由会员分享,可在线阅读,更多相关《操作系统课程设计-交通信号灯模拟(18页珍藏版)》请在金锄头文库上搜索。
1、1交通信号灯模拟交通信号灯模拟操作系统课程设计操作系统课程设计负责人:负责人: 队队 员:员: 学学 号:号: 班班 级:级: 指导老师:指导老师: 时间:时间:2013 年年 12 月月 6 日日2013 年年 12 月月 27日日2目目 录录第一章 需求分析.31.1 现状分析.31.2 可行性分析.3第二章 交通信号灯模拟的设计.42.1 设计思想说明.42.2 详细设计说明.42.2.1 编程语言.42.2.2 开发环境.42.2.3 运行环境.42.2.4 详细设计.42.2.5 结构图.152.2.6 运行效果图.16第 3 章 总结.17参考文献.183第一章第一章 需求分析需求
2、分析1.1现状分析随着我国社会经济的发展,城市化、城镇化进程的加快,近几年机动车辆数字急剧增加,道路交通堵塞问题日趋严重,致使交通事故逐年增加。如何对交通进行合理的管理和调度而尽可能减少堵车现象成为目前我国很多地方尤其是特大城市急需解决的问题,显然交通灯在其中起着不可或缺的作用。现今的交通发展迅速,车辆极具增加,马路不断扩宽,人行横道相对较少。在车流量较大的地段即便有人行横道,行人也很难通过马路。行人自控指示灯系统可以有效的改善这种状况。特别是大都市,经济飞速发展,车辆繁多,人口密集。缓解交通已成为当务之急。 交通灯是城市交通有序、安全、快速运行的重要保障,因此解决好公路交通信号灯控制问题也成
3、了保障交通有序、安全、快速运行的重要环节。本设计是一款基于单片机的交通控制系统,它可以实现对车辆、行人的有效导引导。1.2 可行性分析学生在熟悉课题、调研、收集资料和数据的基础上,对设计课题进行可行性分析,并形成相应的文档。在信息系统的目标需求已经确定,对系统的基本情况又有所了解的情况下,系统分析人员就可以开始可行性分析,可行性分析是根据系统的资源环境等条件,判断所提出的信息系统是否有必要,是否有可能进行开发。 技术上:本系统技术上开发难度一般,具有技术上的可行性。经济上:本系统开发较为简单,所以资金较少,具有经济上的可行性. 社会上:本系统服务于如何对交通进行合理的管理和调度而尽可能减少堵车
4、,堵车现象成为目前我国很多地方尤其是特大城市急需解决4的问题,显然交通灯在其中起着不可或缺的作用,所以具有社会可行性。第二章第二章 交通信号灯模拟的设计交通信号灯模拟的设计 2.1 设计思想说明交通信号灯用软件来模拟实现,要求设置四个方向上的交通信号灯,并且要求比较真实的模拟,当一个方向上的红灯亮时,不允许绿灯亮,同时要求在相反方向上的灯在同一时段所亮的灯的颜色是一致的,而且在另一相反方向上的信号灯与前面的颜色相反,这样要求用线程来进行信号灯的控制。车辆通行的控制,对一个路口而言,只有当一辆车通过路口(越过对面路口的交通灯后) ,其后续车辆才能继续通过交通灯,车辆通过路口的时间可以固定,可以自
5、行计算。我们这组采用 Java 语言来进行开发实现,Java 是一种很好的面向对象的编程语言,在开发交通信号灯模拟这个软件上,能比较好的实现其所要求实现的功能。该设计最重要的是对于各个方向上信号灯进程的控制,而要求对进程控制好,就要求有比较好的Java 编程的水平。2.2 详细设计说明2.2.1 编程语言:Java2.2.2 开发环境:Eclipse2.2.3 运行环境:Windows 下的各个版本2.2.4 设计说明我们对于交通信号灯的控制,首先会有相应的属性来表示,然后用相应的属性来进行判断,是哪个方向上的信号灯。代码如下:Direct td;/属性,表示南北信号灯这个线程5Nbx td2
6、;/属性,表示东西信号灯这个线程 String xhd = “东西灯“;/属性,为东西方向的信号 灯或为南北方向的信号灯信号灯的显示和背景的颜色,以及信号灯人绘制在面板上的位置,我们调用的 Java 中 Graphic 类来实现,其中有方法可以实现我们的要求,代码如下:public void paint(Graphics g) g.fillRect(0, 100, 300, 100);g.fillRect(100, 0, 100, 300);g.setColor(Color.green);/* 在面板上输出南北行和东西行,并随着坐标的变化而变化*/g.drawString(“南北行“, 110
7、, 300 - y1);g.drawString(“南北行“, 160, y1);g.drawString(“东西行“, 280 - x1, 120);g.drawString(“东西行“, x1, 180);/*6* 如果为东西方向上的信号灯,调用自定义的方法,设置信号灯的颜色以及设置信号灯的坐标,并将信号灯在面板上绘出来*/if (xhd = “东西灯“)a.qh(100, 100, “红“, “绿“, g);/* 如果为南北方向上的信号灯,调用自定义的方法,设置信号灯的颜色以及设置信号灯的坐标,并将信号灯在面板上绘出来*/if (xhd = “南北灯“)a.qh(100, 100, “绿
8、“, “红“, g);/* 如果为黄灯,调用自定义的方法,设置信号灯的颜色以及设置信号灯的坐标,并将信号灯在面板上绘出来*/if (xhd = “黄灯“)a.qh(100, 100, “黄“, “黄“, g);7/*控制信号灯的颜色,同时将每个方向上的信号灯设为三个,且设置信号灯的坐标,在面板上绘出来* param*/public void qh(int x1, int y1, String cl1, String cl2, Graphics g) x = x1;y = y1;color1 = cl1;color2 = cl2;for (int i = 0; i 3; i+) /* 设置方向
9、上信号灯的颜色*/if (color1 = “黄“)g.setColor(Color.yellow);if (color1 = “红“)g.setColor(Color.red);8if (color1 = “绿“)g.setColor(Color.green);/* 通过属性g调用GraphicsKh的fillOval()方法,将信号灯在面板上绘制出来 * 南北方法的信号灯*/g.fillOval(x + i * 15, y, 15, 15);g.fillOval(x + 55 + i * 15, y + 85, 15, 15);/* 设置东西方向上信号灯的颜色*/if (color2 =
10、“黄“)g.setColor(Color.yellow);if (color2 = “红“)g.setColor(Color.red);if (color2 = “绿“)9g.setColor(Color.green);/* 东西方向的信号灯,并调用Graphic的fillOval方法,设置东西方向上信号灯的坐标*/g.fillOval(x + 85, y + i * 15, 15, 15);g.fillOval(x, y + 55 + i * 15, 15, 15);对于各个方向上信号灯线程的控制,我们定义了两个成员内部类来实现,这两个类继承了 Thread 类作为信号灯的线程,对信号灯来进
11、行控制,这样方便进行调用,不用在不同的块中定义更多的类,而且定义的属性也有相应的权限,代码如下:/* * *定义一个类Direct,继承Thread,作为南北方向上信号灯 *的线程,10用来控制南北方法的信号灯*/class Direct extends Thread private Jerry a1;/定义一个Jerry的属性,用来控制南北方向上信号灯public Direct(Jerry a) a1 = a;public void run() for (int j = 0; j 100 + j; j+)synchronized (a1) /调用synchronized同步监视器将当前线程锁
12、住,使得在当前进程运行时,不允许其他线程来访问for (int i = 0; i 100; i+) x1 += 5;/x1坐标的变化,使得“南北行“在面板上运动repaint();/x1每加一次,就重绘一次11if (x1 = 285)/当x1=285,就将x1重置为0,x1 = 0;try Thread.sleep(50);/重置为0后,将南北方向上的信号灯这个进程挡土挂起50ms catch (InterruptedException e) xhd = “黄灯“;/为黄灯时,调用repaint方法重绘repaint();try Thread.sleep(400);catch (Interr
13、uptedException e) 12xhd = “南北灯“;/为南北灯时,且x1=70时,调用repaint方法x1 = 70;repaint();try Thread.sleep(400); catch (InterruptedException e) /* * *自定义一个类,继承Thread,作为东西方向信号灯运行*的线程,用来控制东西方向上的信号灯的运行*/class Nbx extends Thread private Jerry a1;/定义一个Jerry的属性,用来控制东西方向上信号灯public Nbx(Jerry a) a1 = a;13public void run()
14、 14for (int j = 0; j 100 + j; j+) synchronized (a1) /调用synchronized同步监视器将当前线程锁住,使得在当前进程运行时,不允许其他线程来访问for (int i = 0; i 100; i+) y1 += 5;/y1坐标不断变化时,“东西行“在面板上运动repaint();/y1坐标每变化一次,就调用repaint方法一次if (y1 = 285)y1 = 0;/当y1坐标达到285时,就将坐标重置为0try Thread.sleep(50); catch (InterruptedException e) xhd = “黄灯“;/当灯的颜色变为黄灯时,15就调用repaint方法16repaint();try Thread.sleep(400); catch (InterruptedException e) xhd = “东西灯