黄淑卿 广东省佛山市南海技师学院
基于VB定时器的交通灯控制程序
——VB教学案例一则
黄淑卿 广东省佛山市南海技师学院
对于较为枯燥的编程学习,如何提高学生学习兴趣,较快掌握理论知识,是我们教师多年来面对的一个课题。选择好的学习素材则是编程教学中一项重要环节,红绿交通灯控制是人们日常生活中经常见到的道路场景。用VB编程语言实现交通灯控制,在编程过程中引导学生运用模块化设计思想、图表化设计表达工具,完成变量的设置及赋值、VB语句编写、子程序的调用,逐步实现并完善交通灯的控制程序。这一过程使编程学习更加生动有趣,各知识点的掌握及理解更加顺畅。
VB编程教学 程序设计 交通灯控制
交通灯是现代生活中常见的交通指挥工具,特别是近年来,随着经济的高速发展,汽车数量急速增加,交通灯的使用更加普遍,几乎每个交通路口都有交通灯控制。合理的交通灯控制对于疏导交通、提升道路通行效率、减少交通事故有着重要意义。看似简单易行的红绿控制,蕴藏着很强的逻辑性,是流程控制型编程教学的佳例,虽然现实生活中交通灯控制实际采用PLC可编程逻辑控制器实现,但出于教学目的,应用VB编程实现交通灯控制,生动展示编程过程,是学生学习编程相关知识的绝好素材。
交通信号灯由红灯、绿灯、黄灯组成。红灯表示禁止通行,绿灯表示准许通行,黄灯表示警示。交通信号灯控制方式可以分为定时控制、感应控制、自适应控制。本文选用某处交叉路口为设计背景,通过VB编程模拟实现实际交通控制情形,从而展示VB编程从需求分析、概念设计到具体编程的实现过程。
实际操作中,通过观察某处交叉路口交通灯控制模式,确定项目的需求,本例运用三态脉冲图使信号灯周期性红黄绿三态变化规律得到形象化表示,状态转移图进一步把控制规律变为清晰的概念,流程图帮助确定程序模块的组成及调用关系,最后通过VB控件及语句,实现需求所要求的目标。总的说来,本案例涉及到的知识点包括:概念设计中图表的运用,控制过程的流程图表示、程序模块设计、VB控件的运用、逻辑控制语句的编写、变量的设置、界面制作,这些知识基本涵盖VB编程的基础内容,学生通过这一课题的实践,可以初步理解VB编程的基本操作过程,并为日后完成更复杂的编程项目打下基础。
3.1 需求分析
选择某一路口作为本例的编程场景,通过对这一路口的观察,确认所选定交叉路口采用的控制方式为:直行加左转,南北西东依次通行的控制模式,即先向南方向绿灯放行,同时南向车辆可左转,然后北向直行及左转绿灯,接着东向,最后西向,按此顺序周期循环。我们还注意到,由于从南北向进入东西向主干道的车辆较多,在南北左转绿灯比直行绿灯多亮10秒。交通信号灯有红黄绿三个状态,选用三态脉冲图可反映信号的变化规律,以上情形可用三态脉冲图表示如下:
如图所示,数字为信号灯编号,每盏灯有绿黄红三个状态,分别高中低三个电位表示,八盏灯分布在该交叉路口的四个角上,周期性地控制车辆通行。
3.2 信号灯控制模式的概念化表示
三态脉冲图如实反映了交通信号灯周期性变化规律,但要把这一现象提升为清晰的概念,还得借助状态转移图来实现,经过分析,我们将信号灯的变化规律转化为五个状态的循环转换,以状态转移图表示如下:
为简化图形表示,这里只显示绿灯的状态,绿灯亮时其他灯均为红色,另外还省略了黄灯的状态,因为绿灯转红灯有5秒的黄灯过渡为固定模式,逐一罗列不利于弄清信号灯的变化规律。如上图所示,经过简化处理后,信号灯的控制过程更为清晰,状态转移图将所观察的现象转化为清晰的概念。图的右上方状态显示这一时刻二个左转灯同时为绿,这一设置正是为满足较多车辆要进入东西向主干道的需求而设计。
3.3 程序设计
3.3.1 信号灯变换设计
实现单一信号灯状态变换是实现多信号灯系统联动的基础,本例中制作信号灯小图片,通过LoadPicture函数,改变image控件的picture属性,实现信号灯红绿变化及黄灯闪烁的效果,应用timer定时器控制信号灯的时长。本例中,模拟信号灯左转的几个小图片如下:
3.3.2 子程序设计
本例中,共设置8只信号灯,按其位置分别编号1至8,图片控件image(1)至image(8)分别控制相应的信号状态,如下图所示:
为了使程序简化且便于阅读,编写子过程Pass(lamp_ no)、Alarm(lamp_no),通过子过程的调用实现各信号灯状态的切换。
子过程Pass中参数lamp_no表示信号灯编号,如call Pass(4)表示4号灯切换到通行状态,即4号信号灯亮绿灯。子过程Alarm中参数lamp_no表示信号灯编号,如call Alarm(4)即4号信号灯进入黄闪状态。
3.3.3 程序流程图
根据业务需求及子程序调用形式的确定,绘制程序流程图如下:
从流程图来看,控制流为二个部分重合的闭环组成,为此需要设立2个定时器timer1、timer2分别控制程序流,另外黄闪控制也应由各自的专用定时器timerAlarm1、timerAlarm2分别控制。
本例中,根据业务需求绘制三态脉冲图,精确表达业务需求所述的情景,利用状态迁移图揭示业务表象下实质性的逻辑关系,理清头绪,简化问题。通过对程序流程图的分析,得知本例控制流特性为二路控制流,从而确立设置2个定时器分别控制。在编程细节上,根据信号灯的控制特点,编写pass(),alarm()2个子程序,通过调用子程序,实现对相应信号灯的控制。这种方式的编码设置,实现代码重用,提高编程效率,并使程序简练易读,也为日后系统维护提供方便。
[1]《Visual Basic 6.0程序设计与应用教程》李俊编著,电子工业出版社
[2]《Visual Basic开发实战》软件开发技术联盟编著,清华大学出版社
[3]《Visual Basic 2015入门经典(第8版)/NET开发经典名著》[美]Bryan Newsome著;李周芳,石磊,译.清华大学出版社