55
毕业设计说明书(论文) : 董海巍 学 号: 0110200315 学院 学院 学院 学院(): 自动化系 : 自动化专业 : 城市交通管理模拟综合设计 ——算法设计 指导者 指导者 指导者 指导者: ( ) ( ) 评阅者 评阅者 评阅者 评阅者: ( ) ( ) 2005 年 6 月 林嵘 讲师

城市交通管理模拟综合设计 - 算法设计

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: 城市交通管理模拟综合设计 - 算法设计

南 京 理 工 大 学

毕业设计说明书(论文)

作作作作 者者者者: 董海巍 学学学学 号号号号:::: 0110200315

学院学院学院学院(系系系系): 自动化系

专专专专 业业业业: 自动化专业

题题题题 目目目目: 城市交通管理模拟综合设计

——算法设计

指导者指导者指导者指导者:::: (姓 名) (专业技术职务)

评阅者评阅者评阅者评阅者:::: (姓 名) (专业技术职务)

2005 年 6 月

林嵘 讲师

Page 2: 城市交通管理模拟综合设计 - 算法设计

毕业设计说明书毕业设计说明书毕业设计说明书毕业设计说明书((((论文论文论文论文))))中文摘要中文摘要中文摘要中文摘要

城市交通管理模拟系统要求在一个沙盘上完成城市交通管理模型,由单片机

控制交通运行,管理四个路口的信号灯。小车根据交通信号牌发送的红外信号,

在模拟城市街区中按预定路线自主行驶。另外,为了便于城市交通的集中控制与

管理,将 PC 机(主机)和单片机(从机)通过 RS-485 连接起来,构成主从式多

机通信系统,以达到控制车流量的目的。本文介绍了系统的软件设计部分,其中

包括单片机系统软件设计和小车软件设计。在单片机系统的软件设计中,将“混

合式调度器”作为单片机嵌入式操作系统,并把系统的功能划分为交通灯显示、

RS-485 通信和红外通信三个模块,三个模块由调度器统一调度执行。在小车的

软件设计中,主要采用 NQC 语言和 ROBOLAB 图形化编程语言为小车编写程序。

本文重点论述了上述三个模块及小车的软件设计方法,同时对调度器、RCX 也有

较为详细的介绍。文中所有程序均已在系统中调试通过。

关键词 调度器 交通灯显示 红外通信 RS-485 通信 RCX

Page 3: 城市交通管理模拟综合设计 - 算法设计

毕业设计毕业设计毕业设计毕业设计说明书说明书说明书说明书((((论文论文论文论文))))外文摘要外文摘要外文摘要外文摘要

Title Title Title Title Design of The Traffic Management Simulating System

—— Design of the Software

AbstractAbstractAbstractAbstract

This design is The Traffic Management Simulating System. A SCM controls

the regulation of the traffic system and the traffic lights. The vehicles

move according to the infrared signal transferred by traffic panels. In

order to control the whole system, we build a communication system by

connecting SCM with PC. In this paper, the software design of this system

consists essentially of two parts, the embedded system software design and

the vehicle software design. In the first part, the Task_Schedule will be

used as the embedded operating system. And according to the function of

the system, the system can be divided into three modules, including the

display module, the infrared communication module and the RS-485

communication module. Above all, the Task_Schedule determines which module

will be carried out. In the second part, the vehicles are programmed by

ROBOLAB and NQC. After all, the emphasis is put on the design of the modules

and vehicles. At last, the principles of Task_Schedule and RCX are

illustrated. All the programs have been testified in the system.

Keywords Keywords Keywords Keywords Task_schedule Display of the traffic lights

Infrared Communication RS-485 Communication RCX

Page 4: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 I 页 共 II 页

目 次

1 引言 ................................................................ 1

1.1 背景............................................................... 1

1.2 本论文所做的工作及内容安排......................................... 1

2 调度器 .............................................................. 3

2.1 什么是调度器....................................................... 3

2.2 合作式调度器与抢占式调度器......................................... 3

2.3 混合式调度器....................................................... 4

3 交通灯显示模块设计 .................................................. 5

3.1 交通灯显示模块的结构............................................... 5

3.2 交通运行状态....................................................... 7

3.3 程序设计........................................................... 8

3.4 软件调试.......................................................... 11

4 红外通信模块设计 ................................................... 12

4.1 红外简单发射原理.................................................. 12

4.2 红外调制发射原理.................................................. 13

4.3 红外通信协议与交通规则............................................ 14

4.4 程序设计.......................................................... 15

4.5 软件调试.......................................................... 15

5 RS-485通信模块设计 ................................................. 17

5.1 RS-485主从式多机通信.............................................. 17

5.2 RS-485通信模块的结构.............................................. 17

5.3 程序设计.......................................................... 18

5.4 软件调试.......................................................... 18

6 机器人程序设计 ..................................................... 20

6.1 RCX简介........................................................... 20

6.2 ROBOLAB编程环境................................................... 21

6.3 NQC编程环境....................................................... 22

6.4 机器人的结构和功能................................................ 23

6.5 程序设计.......................................................... 24

结 论 ................................................................ 29

致 谢 ................................................................ 30

参 考 文 献 ........................................................... 31

Page 5: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 II 页 共 II 页

附录A 单片机嵌入式系统源程序 ......................................... 33

附录B NQC源程序 ...................................................... 47

附录C ROBOLAB源程序 .................................................. 50

Page 6: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 1 页 共 50 页

1 1 1 1 引言引言引言引言

1.1 1.1 1.1 1.1 背景背景背景背景

随着城市的不断发展壮大,交通需求的迅速增长与交通基础设施发展缓慢之间的

矛盾日益尖锐。道路交通拥挤、交通秩序混乱、交通事故增加以及交通所引起的环境

污染成为人们关注的话题。交通问题已经成为制约经济发展的一个重要因素。

如何在现有的设施的基础上科学、合理的管理交通已成为各界越来越关注的问

题。

为了对上述问题有更深入的认识,我们在参阅了大量国内外文献并进行了广泛的

调研后,基于本科二期评建项目,设计了下述模拟交通管理系统,为一步的研究构建

基础平台。

该模拟交通系统预计在一个 4.4m×4.4m 的沙盘上完成一个完整的城市交通管理

模型。在整个控制系统中,由单片机管理四个路口的信号灯,机器人根据交通信号牌

发送的红外信号,在模拟城市街区中自主行驶(直行、左转、右转、停止)。除此以

外,为了便于对城市交通集中控制与管理,我们将一台 PC 机作为主机,单片机作为

从机,实现主从式多机通信。这样,系统就可以根据车流量的变化情况动态的改变各

路口东西南北各方向直行、左转、右转和停止的时间,从而达到交通控制管理的目的。

1.2 1.2 1.2 1.2 本论文所做的工作及内容安排本论文所做的工作及内容安排本论文所做的工作及内容安排本论文所做的工作及内容安排

整个系统的设计分为硬件电路设计和软件程序设计两大部分。硬件电路设计主要

包括交通灯显示、红外信号发射以及 RS-485 通信接口三部分电路设计。软件设计主

要包括单片机嵌入式系统的开发和机器人程序设计两个部分。本文将主要介绍系统的

软件设计部分。

在单片机嵌入式系统的开发过程中,根据单片机嵌入式系统的功能,我们将系统

划分为交通灯显示、红外通信和 RS-485 多机通信三个模块。其中,交通灯显示模块

用于交通信号牌的显示控制;红外通信模块把交通灯的状态通过红外信号发送给机器

人;多机通信模块建立了 PC机(主机)与单片机(从机)的主从式多机通信。另外,

为了协调三个模块的运行,将“混合式调度器”作为单片机嵌入式操作系统(Embedded

Real Time Operating System-ERTOS),由调度器统一调度执行上述三个模块(如图

1.1所示)。

Page 7: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 2 页 共 50 页

硬硬硬硬硬硬硬硬

度度度度度度度度调调调调

外外外外外外外外 外外外外红红红红 红红红红 红红红红交交交交外外外外交交交交 交交交交外外外外显显显显 红红红红 RS-485外外外外 外外外外红红红红 红红红红

机机机机度度度度机机机机 PC机机机机(主主主主机机机机)

图 1.1 单片机嵌入式系统结构框图

在机器人的设计过程中,主要采用 NQC(Not quite C)语言和 ROBOLAB 图形化编

程语言为机器人编写程序。文中所有程序都已在系统中调试通过。

本论文的具体安排如下:第 1 章介绍本毕业设计的背景和拟实现的目标,同时还

说明了本论文所做的工作和内容安排;第 2 章首先介绍调度器的原理,然后在合作式

调度器和抢占式调度器的基础上提出了混合式调度器的概念;第 3 章针对交通灯显示

电路的硬件设计,分析了显示模块的软件设计流程;第 4 章从红外调制原理说起,提

出了红外通信协议,并根据上述协议,订立了模拟交通系统的交通规则;第 5 章从分

析 RS-485 主从式多机通信的原理出发,提出了本模拟系统的主从式多机通信协议;

第 6 章首先介绍了机器人的核心控制器机器人探索者(the Robotic Command Explorer

——RCX),然后简述了 ROBOLAB 和 NQC 编程环境及特点,最后通过 ROBOLAB

和 NQC两种风格迥异的编程语言为机器人编写了程序。附录 A为第 3 章~第 6 章所

有程序的源程序,附录 B为机器人的 NQC程序,附录 C为机器人的 ROBOLAB程序。

Page 8: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 3 页 共 50 页

2 2 2 2 调度器调度器调度器调度器

作为简单的嵌入式操作系统,调度器非常适合单片机嵌入式系统。本系统中采用

调度器,统一调度执行交通灯显示、红外通信、RS-485通信三个模块。

2.1 2.1 2.1 2.1 什么是调度器什么是调度器什么是调度器什么是调度器

调度器是一个简单的任务调度程序,它通过定时器建立调度时标,并根据调度时

标,按照调度规则,有条不紊的调度任务。

我们可以从两个角度来理解调度器:

� 一方面,调度器可以看作是一个简单的操作系统,它周期性的调用任务。

� 另一方面,调度器可以看作是多个不同任务共享的定时器中断服务程序。定

时器中断服务子程序用于建立固定的时间间隔(时标),任务的执行是以时标

作为最基本的时间单位的。

从微观上看,调度器将时间划分为若干时间片,每个时间片运行一个固定的任务;

从宏观上看,每个任务都是并行执行的。

按照调度的原则来分类,调度器可以分为两大类:合作式调度器和抢占式调度器。

以下将分别详细说明。

2.2 2.2 2.2 2.2 合作式调度器与抢占式调度器合作式调度器与抢占式调度器合作式调度器与抢占式调度器合作式调度器与抢占式调度器

合作式调度器是一种简单的单任务系统结构。在合作式调度器中,任务的运行规

则十分简单:当任务需要运行时,被添加到等待队列中;当 CPU 空闲时,运行等待

任务中的下一个任务;当任务开始运行后,将一直运行直到完成。实际上,合作式调

度器不是一个独立的操作系统,它是系统代码的一部分。通常,这种调度器可以完全

由高级语言(比如“C”)实现,且只要少量代码即可实现。

与合作式调度器相比,抢占式调度器是一种复杂的多任务系统结构。在抢占式调

度器中,任务的运行规则十分复杂:当任务需要运行时,被添加到等待队列中;任务

被周期性的运行一段固定的时间,如此往复运行;如果任务运行了一段固定的时间还

没有完成,该任务将被暂停,并将其放回等待队列。由于抢占式调度器复杂的调度规

则,抢占式调度器很难实现。通常抢占式调度器会被作为一个独立的系统来开发,并

且为了避免“并行运行”的任务在访问共享资源时的冲突,抢占式调度器需要为所有

的中间状态分配内存。另外,这种调度器通常不能用高级语言实现,而只能使用汇编

语言编写源代码。

Page 9: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 4 页 共 50 页

抢占式调度器的优点在于实时性,即任务可以随时被触发,随时被中断。但值得

注意的是,抢占式调度器的运行往往具有不可预测性,这是因为如果在某一时刻任务

1 访问端口 X 时,调度器执行了“上下文切换”,使任务 2 也访问了这个端口 X。那

么在这种情况下,端口的数据就有可能丢失或被破坏,当任务 1 再次被调度执行时,

它对端口 X的操作就会出现错误。而与之相对,由于合作式调度器的任务运行不能中

断,因此合作式调度器的运行非常稳定,但相对来说,合作式调度器的实时性较差。

综上所述,合作式调度器稳定性较好但实时性较差,而抢占式调度器实时性较好但稳

定性较差。那么,能否在两者之间找到一种合适的折中方案呢?由此,引入混合式调

度器。

2.3 2.3 2.3 2.3 混合式调度器混合式调度器混合式调度器混合式调度器

混合式调度器综合了抢占式调度器和合作式调度器的特性,它既支持多个合作式

调度任务,又支持一个抢占式的调度任务。换句话说,混合式调度器提供了有限的多

任务功能。从性能的角度看,混合式调度器继承了合作式调度器和抢占式调度器的优

点,它的运行十分可靠,而且对外部事件的相应速度快,实时性较好。另外,从编程

的角度看,混合式调度器可以使用高级语言(例如“C”)编写,且使用少量代码即可

实现。

总的来说,混合式调度器主要由以下六部分组成:调度器数据结构、调度器初始

化函数、“刷新”函数、“添加任务”函数、“删除任务”函数和调度函数。其中,调

度器数据结构是调度器的核心,它是一个用户自定义的数据类型。在调度器数据结构

中集中了每个任务的所有属性信息;调度器初始化函数的主要用途是设置定时器中

断,用来产生驱动调度器运行的“时标”。另外,调度器数据结构也是在调度器初始

化函数中定义的;“刷新”函数的本质是一个中断服务子程序。它的作用是当定时器

溢出时,根据调度算法确定下一个需要运行的任务,并将该任务的 runme 属性置为 1;

调度函数启动属性 runme 值为 1的任务运行。最后,“添加任务”函数和“删除任务”

的作用分别是向等待任务队列添加和删除任务。

具体来说,使用调度器的流程如下,首先通过调度器初始化函数建立等待任务队

列,然后将所要执行的任务通过“添加任务”函数添加到等待任务队列中并启动调度

器,当定时器溢出时触发“刷新”函数,“刷新”函数根据调度原则将需要运行的任

务的 runme 属性置位 1。最后,调度函数启动 runme 属性为 1的任务。当然,如果需

要删除任务,可在程序中调用“删除任务”函数。

Page 10: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 5 页 共 50 页

在混合式调度器中,所有的操作都依赖与调度器数据结构的属性。可以毫不夸张

的说,调度器的结构是调度器的核心和精髓。混合式调度器的数据结构如下: structstructstructstruct { voidvoidvoidvoid (code *task_p)(voidvoidvoidvoid); unsigned charunsigned charunsigned charunsigned char delay; unsigned charunsigned charunsigned charunsigned char period; unsigned charunsigned charunsigned charunsigned char runme; bitbitbitbit co_op; }; 其中,task_p 是一个指向任务的指针,delay 是第一次运行前的延迟,period 表

示任务重复运行的时标间隔,co_op 表示任务的属性(合作式为 1,抢占式为 0)。特

殊的,当 delay为 0时,任务立即运行;当 peroid为 0时,任务只运行一次。

实际上,混合式调度器就是一个用户自己编写的简单任务运行规则,与常见的超

级循环相比,它的时间漂移更小,实时性更高。

3 3 3 3 交通灯交通灯交通灯交通灯显示模块设计显示模块设计显示模块设计显示模块设计

本模拟系统由单片机实施交通信号牌显示控制。每台单片机控制一个十字路口的

东、西、南、北四个方向的信号牌显示,每个信号牌包含 37 个控制信号,因此每个

单片机需要对 37×4=148个信号进行控制。单片机 32个 I/O口显然不能满足这样大

的信号控制需求。为节省硬件开销和电路复杂度,我们采用串行总线方式。这样,大

大简化了硬件电路,但同时也给软件设计带来了不少问题。

3.13.13.13.1 交通灯显示模块的结构交通灯显示模块的结构交通灯显示模块的结构交通灯显示模块的结构

与现实生活中的交通信号牌一样,模拟信号牌由倒计时模块和交通信号模块两部

分组成(如图 3.1所示)。其中,倒计时模块由 34个双色(红与绿)高亮度发光二极

管(LED)组成,完成两位数的倒计时功能;交通信号模块由红、绿、黄三种颜色的

信号灯构成,用来显示当前的交通状态。

在交通灯的设计中,为了使交通信号显示更接近实际情况,在设计中采用九个交

通灯,即直行方向的红、黄、绿灯,左转方向的红、黄、绿灯和右转方向的红、黄、

绿灯来显示交通状态。另外,各行驶方向的红、绿灯都以相应方向的箭头形状表示,

黄灯沿用以往的圆形表示。所有交通灯,都用相应颜色的发光二极管(LED)排列出

相应的形状。

Page 11: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 6 页 共 50 页

此外,为了将交通状态动态的发送给小车,在设计中,特别在信号牌的左下角增

加了两个红外功率发射二极管,用于信号牌与小车的红外通信。

色色色色色色色色色色色色色色色色红红红红光光光光光光光光光光光光光光光光发发发发黄黄黄黄色色色色色色色色色色色色色色色色光光光光光光光光光光光光光光光光发发发发色色色色色色色色色色色色色色色色绿绿绿绿光光光光光光光光光光光光光光光光发发发发外外外外外外外外外外外外红红红红光光光光光光光光光光光光

、、、、双双双双色色色色(红红红红 绿绿绿绿)色色色色色色色色色色色色光光光光光光光光光光光光光光光光发发发发 图 3.1 交通显示牌外观图

在本模拟系统中,将交通显示牌(如图 3.1 所示)中的控制信号分为五组,每组

控制信号由一个 8 位单向串入并出移位寄存器控制(如图 3.2所示)。每个移位锁存器

都有三个输入信号,包括串行移位数据输入信号 SERIAL_DATA_INPUT、移位时钟信

号 SHIFT_CLOCK 和锁存信号 LATCH_CLOCK。这些控制信号的连接规律如下:十

字 路 口 每 个 方 向 共 用 一 个 移 位 信 号 SHIFT_CLOCK 和 串 行 输 入 信 号

SERIAL_DATA_INPUT;十字路口的四个方向具有相同锁存器号的锁存器共用一个锁

存信号 LATCH_CLOCK。

SHCP DS

Q0移移移移移移移移移移移移移移移移移移移移(((( )))) 1

STCP

左左左左 左左左左 左左左左边边边边 边边边边灯灯灯灯灯灯灯灯灯灯灯灯绿绿绿绿 边边边边Q6

左左左左 左左左左 左左左左边边边边 边边边边灯灯灯灯灯灯灯灯灯灯灯灯红红红红 边边边边 右右右右 左左左左 左左左左边边边边 边边边边灯灯灯灯灯灯灯灯灯灯灯灯红红红红 边边边边 九九九九九九九九九九九九九九九九九九九九号号号号灯灯灯灯 号号号号显显显显SHIFT_CLOCK

SERIAL_DATA_INPUT

LATCH_CLOCK1 LATCH_CLOCK2 LATCH_CLOCK3 LATCH_CLOCK4 LATCH_CLOCK5

右右右右 左左左左 左左左左边边边边 边边边边灯灯灯灯灯灯灯灯灯灯灯灯绿绿绿绿 边边边边SHCP DS

Q0移移移移移移移移移移移移移移移移移移移移(((( )))) 3

STCP

Q6

SHCP DS

Q0移移移移移移移移移移移移移移移移移移移移(((( )))) 2

STCP

Q6

SHCP DS

Q0移移移移移移移移移移移移移移移移移移移移(((( )))) 5

STCP

Q6

SHCP DS

Q0移移移移移移移移移移移移移移移移移移移移(((( )))) 4

STCP

Q6Q5

图 3.2 显示原理图

Page 12: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 7 页 共 50 页

3.23.23.23.2 交通运行状态交通运行状态交通运行状态交通运行状态

交通运行状态是交通控制系统中一个极为重要的概念,不同的交通状态下交通灯

的显示各不相同,而交通运行状态的切换是通过时间来触发的。在本模拟系统中,共

定义 7 种交通状态,分别是:直行状态、直行过渡状态、左转状态、左转过渡状态、

右转状态、右转过渡状态和停止状态。每个状态都对应于特定的交通灯显示(参见表

3.1)。

表 3.1 交通状态-信号灯对照表 直行方向 左转方向 右转方向 交通状态 绿灯 黄灯 红灯 绿灯 黄灯 红灯 绿灯 黄灯 红灯 直行 √ √ √ 直行过渡 √ √ √ 左转 √ √ √ 左转过渡 √ √ √ 右转 √ √ √ 右转过渡 √ √ √ 停止 √ √ √ 注:其中,“√”表示该交通等点亮

在系统初始化时,南北方向的初始交通状态为直行,而东西方向的初始交通状态

为停止。在此之后,各路口按表 3.2所示交通灯运行规则周而复始的运行。

表 3.2 交通灯运行规则 南北方向交通状态 南北方向倒计时时间 东西方向交通状态 东西方向倒计时时间 直行 8s 直行黄灯 2s 左转 8s 左转黄灯 2s 右转 8s 右转黄灯 2s

停止 30s 直行 8s 直行黄灯 2s 左转 8s 左转黄灯 2s 右转 8s

停止 30s 右转黄灯 2s

Page 13: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 8 页 共 50 页

3.3 3.3 3.3 3.3 程序设计程序设计程序设计程序设计

交通灯显示功能是整个模拟交通系统中最基本也是最核心的功能,然而显示的程

序却是模拟交通最为复杂的程序。究其原因,主要有如下几点:首先,显示模块所处

理的控制信号非常多,每个路口共有 148 个控制信号;其次,为了节省硬件开销,在

系统电路设计时采用串行总线的设计方法,这种设计方法导致程序大为复杂;最后,

由于十字路口的具有相同序号的锁存器共用锁存信号,同一十字路口的控制信号非常

容易相互干扰。

为了解决尽可能减小程序复杂度,我们采用如下方法:

� 由于东西方向的交通状态始终相同,因此可将东西两个方向作为一个方向考

虑,南北方向同理,这样每个十字路口需要控制的信号量减半为 74个;

� 如图 3.2所示,控制显示牌输出的 5个位锁存器中有 4个是控制倒计时输出。

倒计时的每一位输出实际上都是针对 7 段数码管,因此为程序在程序中建立

显示译码表将会大大降低程序复杂度。另外,由于 7 段数码管的显示状态包

括不显示、显示 0、显示 1…显示 9 共 11 种状态,因此,与常见的显示译码

表不同,本程序的显示译码表包含 11个元素,第十一个元素为特殊元素 0x00,

表示 7 段数码管不显示;

� 9 个交通灯信号分别由两个移位寄存器控制,换句话说,有 1 个交通灯信号

和“右边数码管红灯 7 段码”一起由移位寄存器(4)控制(如图 3.2所示)。

为了降低编程复杂度,将上述交通信号灯单独考虑,建立交通状态与该交通

灯信号的一一映射,即建立关于该交通灯的显示补偿表。在此译码表中,交

通灯亮为 0x00,交通灯灭为 0x01。在最终显示输出时,首先根据交通状态查

表,然后将结果与显示译码结果按位相与“&”输出即可。

显示程序的难点在于如何避免同一路口不同方向锁存信号的相互干扰。解决这一

问题最行之有效的办法就是对具有相同序号的移位寄存器进行统一操作。具体过程如

下:首先,建立路口所有移位寄存器的缓冲区(移位锁存变量),用来存放下一时刻

进行移位锁存的数据;然后,根据各方向交通状态,设置相应的移位寄存器变量;最

后,将所有移位锁存变量逐一输出。

根据上述软件设计思想,编写程序(源程序见附录 A,程序流程图如图 3.3所示)。

程序说明如下:

程序开始执行后,首先初始化路口各方向交通状态,即南北东西方向为直行状态,

Page 14: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 9 页 共 50 页

东西方向为停止状态;其次定义移位寄存器变量,并置初值为 10;然后设置交通显示

牌无显示,计算东西方向和南北方向倒计时时间的十位和个位,并根据“只有直行状

态,倒计时计数牌才为绿色”的原则分别设置东西方向和南北方向的所有移位锁存变

量;最后,每隔 1s,倒计时时间减 1,程序将补偿后的移位锁存变量统一显示输出。

此后,程序循环执行上述过程,并在倒计时计数值为 2和 0时,分别判断南北方向和

东西方向的交通状态,并进行相应的状态转换。

始始始始开开开开交交交交交交交交交交交交 交交交交始始始始交交交交态态态态

分分分分 分分分分分分分分分分分分分分分分分分分分分分分分分分分分别别别别别别别别 别别别别存存存存 存存存存变变变变 1和和和和2 倒倒倒倒为为为为 为为为为为为为为为为为为为为为为的的的的的的的的分分分分和和和和的的的的分分分分

分分分分 置置置置置置置置置置置置 置置置置别别别别 设设设设 设设设设????分分分分分分分分分分分分分分分分交交交交交交交交交交交交态态态态

分分分分 分分分分分分分分 分分分分分分分分分分分分和和和和别别别别 别别别别分分分分分分分分分分分分分分分分倒倒倒倒为为为为为为为为为为为为为为为为的的的的的的的的分分分分和和和和的的的的分分分分分分分分分分分分 存存存存 存存存存交交交交始始始始交交交交别别别别 变变变变

分分分分 分分分分分分分分分分分分分分分分分分分分分分分分分分分分别别别别别别别别 别别别别存存存存 存存存存变变变变 3和和和和4 倒倒倒倒为为为为 为为为为为为为为为为为为为为为为的的的的的的的的分分分分和和和和的的的的分分分分分分分分 分分分分 分分分分分分分分分分分分分分分分分分分分别别别别别别别别 别别别别 别别别别存存存存 存存存存变变变变 1和和和和2 倒倒倒倒为为为为 为为为为为为为为为为为为为为为为的的的的的的的的分分分分和和和和的的的的分分分分

????分分分分分分分分分分分分交交交交交交交交交交交交别别别别 态态态态 分分分分 分分分分 分分分分分分分分分分分分分分分分分分分分别别别别别别别别 别别别别 别别别别存存存存 存存存存变变变变 3和和和和4 倒倒倒倒为为为为 为为为为为为为为为为为为为为为为的的的的的的的的分分分分和和和和的的的的分分分分

Page 15: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 10 页 共 50 页

南南南南南南南南南南南南南南南南 ???? 倒倒倒倒计计计计计计计计计计计计计计计计=2 ????西西西西南南南南南南南南西西西西西西西西西西西西东东东东 东东东东

置置置置南南南南南南南南南南南南南南南南西西西西西西西西西西西西设设设设 直直直直直直直直直直直直直直直直东东东东态态态态 置置置置南南南南南南南南南南南南南南南南西西西西西西西西西西西西设设设设 左左左左 直直直直直直直直东东东东态态态态 态态态态 置置置置南南南南南南南南南南南南南南南南西西西西西西西西西西西西设设设设 右右右右 直直直直直直直直东东东东态态态态 态态态态直直直直直直直直 左左左左态态态态 右右右右态态态态 停停停停停停停停Y

N

西西西西南南南南南南南南东东东东 ???? 倒倒倒倒计计计计计计计计计计计计计计计计=2 ????西西西西南南南南南南南南西西西西西西西西西西西西东东东东 东东东东

置置置置 西西西西南南南南南南南南西西西西西西西西西西西西设设设设 东东东东 直直直直直直直直直直直直直直直直东东东东态态态态 置置置置 西西西西南南南南南南南南西西西西西西西西西西西西设设设设 东东东东 左左左左 直直直直直直直直东东东东态态态态 态态态态 置置置置 西西西西南南南南南南南南西西西西西西西西西西西西设设设设 东东东东 右右右右 直直直直直直直直东东东东态态态态 态态态态直直直直直直直直 左左左左态态态态 右右右右态态态态 停停停停停停停停Y

N

补补补补补补补补移移移移移移移移 移移移移 移移移移锁锁锁锁 锁锁锁锁倒倒倒倒 倒倒倒倒计计计计计计计计计计计计计计计计 1

Page 16: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 11 页 共 50 页

西西西西西西西西西西西西东东东东 ???? 倒倒倒倒计计计计计计计计计计计计计计计计=0 ????西西西西西西西西西西西西西西西西西西西西西西西西东东东东 东东东东 置置置置 西西西西西西西西西西西西设设设设 东东东东西西西西西西西西西西西西 交交交交东东东东态态态态 态态态态倒倒倒倒 交交交交计计计计计计计计计计计计计计计计态态态态 态态态态计计计计计计计计直直直直直直直直 交交交交态态态态 右右右右态态态态 停停停停停停停停

Y

N

置置置置 西西西西西西西西西西西西设设设设 东东东东西西西西西西西西西西西西 右右右右东东东东态态态态 态态态态倒倒倒倒 右右右右计计计计计计计计计计计计计计计计态态态态 态态态态计计计计计计计计 置置置置 西西西西西西西西西西西西设设设设 东东东东西西西西西西西西西西西西 停停停停停停停停东东东东态态态态倒倒倒倒 停停停停停停停停计计计计计计计计计计计计计计计计态态态态 计计计计计计计计 置置置置 西西西西西西西西西西西西设设设设 东东东东西西西西西西西西西西西西 直直直直直直直直东东东东态态态态倒倒倒倒 直直直直直直直直计计计计计计计计计计计计计计计计态态态态 计计计计计计计计束束束束结结结结

南南南南南南南南西西西西西西西西 ???? 倒倒倒倒计计计计计计计计计计计计计计计计=0 ????南南南南南南南南西西西西西西西西西西西西西西西西西西西西东东东东 置置置置南南南南南南南南西西西西西西西西设设设设西西西西西西西西西西西西 交交交交东东东东态态态态 态态态态倒倒倒倒 交交交交计计计计计计计计计计计计计计计计态态态态 态态态态计计计计计计计计直直直直直直直直 交交交交态态态态 右右右右态态态态 停停停停停停停停

Y

N

置置置置南南南南南南南南西西西西西西西西设设设设西西西西西西西西西西西西 右右右右东东东东态态态态 态态态态倒倒倒倒 右右右右计计计计计计计计计计计计计计计计态态态态 态态态态计计计计计计计计 置置置置南南南南南南南南西西西西西西西西设设设设西西西西西西西西西西西西 停停停停停停停停东东东东态态态态倒倒倒倒 停停停停停停停停计计计计计计计计计计计计计计计计态态态态 计计计计计计计计 置置置置南南南南南南南南西西西西西西西西设设设设西西西西西西西西西西西西 直直直直直直直直东东东东态态态态倒倒倒倒 直直直直直直直直计计计计计计计计计计计计计计计计态态态态 计计计计计计计计

图 3.3 显示任务程序流程图 3.4 3.4 3.4 3.4 软件调试软件调试软件调试软件调试

由于同一路口具有相同锁存器号的锁存信号 LATCH_CLOCK 使连接在一起

的,因此同一路口具有相同序号的移位寄存器必须统一操作,否则会产生相互干扰,

导致交通信号混乱,这在软件调试初期给我们带来了不小的麻烦,最终,我们通过“移

Page 17: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 12 页 共 50 页

位寄存器变量”这一思想解决了这个问题。这一想法实际上并不复杂,即为所有的移

位寄存器建立变量,然后像“填数字”一样按要求填好,最后统一进行移位锁存操作。

另外,对交通信号补偿也是我们在编程中的一大创新。其目的就是把较复杂的信

号单独考虑,建立交通状态与显示补偿的一一映射表,最终通过位运算将复杂信号在

显示中补偿输出。

4 4 4 4 红外通信模块设计红外通信模块设计红外通信模块设计红外通信模块设计

交通模拟系统中的机器人并不能像人眼一样能直接识别红绿灯,因此需要通过其

它途径将红绿灯所显示的交通状态(允许直行、左转、右转和停止)传达给它。考虑

到机器人具有红外发射接收功能,所以采用了红外通信的方式向机器人传达交通状

态,也就是说,在交通灯显示的同时,发射相应的红外编码来通知机器人此时路口的

交通状态。

4.1 4.1 4.1 4.1 红外简单发射原理红外简单发射原理红外简单发射原理红外简单发射原理

在发射端,输入信号经放大后送入红外发射管发射,在接收端,接收管收到红外

信号后,由放大器放大处理后还原成信号,这就是红外的简单发射原理(如图 4.1所

示)。

.放放放放放放放放 放放放放放放放放射射射射发发发发 接接接接接接接接

图 4.1 红外简单发射原理图

这种发射的基本思想比较简单,容易理解,但这种原理有个最大的弱点,即红外

的强弱与信号的大小完全等同,这样就很难避免空间红外的噪声干扰,一旦在空间传

输的红外射线受到了来自外界的红外干扰,就会影响接收信号的精确再现,甚至无法

再现,而且这种空间红外噪声的干扰又非常普遍,如太阳光线(白天和夜晚的不同)、

Page 18: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 13 页 共 50 页

人体辐射(有人靠近与无人靠近的不同),从现实应用环境的角度出发,这些产生红

外噪声的干扰又是无法避免的,所以简单发射原理设计的通信电路,有一个最大问题,

那就是如何避免空间中无处不在的红外射线的干扰,如果不能解决这个问题,通信电

路的实用就是不可能的。

因此,如果要实现红外通信,如何正确地处理它可能就是红外通信应用项目设计

过程中需要解决的主要问题。设计实用的红外通信电路,必须利用红外的调制发射原

理,通过发射的红外线的频率变化来携带必要的信息,这样才可以最大限度地避免干

扰红外的影响。

4.2 4.2 4.2 4.2 红外调制发射原理红外调制发射原理红外调制发射原理红外调制发射原理

在具体使用的红外通信中,要解决空间的红外干扰问题就必须使用调制发射的原

理来实现红外通信,调制发射一般采用频率调制的办法。依据红外干扰信号的频率一

般比较低、其频率无规律的特点,空间的红外干扰不会改变调制后的红外射线的频率,

因此这种方法可以最大限度的保证信号的实际内容,使信号可以可靠的传输,实现信

号的精确再现。

红外信号调制的基本原理如下:首先使光源按特定频率连续的开关(调制),然

后用接收器探测出以此频率闪烁的光线(解调)。红外调制光线发射和探测的过程如

图 4.2所示。

有有有有有有有有有有有有 有有有有有有有有有有有有

5V

0V

IR制制制制制制制制调调调调

出出出出输输输输

LED打开

LED关关关关关关关关

25微微微微微微微微/周周周周周周周周

(((( 40kHz)

图 4.2 红外调制解调器的理想响应模式

在图 4.2中,上半部分表示一个红外 LED 连续发出两组信号,每组信号都包含了

Page 19: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 14 页 共 50 页

一定量的高频光脉冲(调制光)。图的下半部分表示红外解调的输出。对应于有脉冲

信号的两个阶段,解调显示“有信号”;而在两组信号之间,解调器没有发现红外脉

冲,因此显示“无信号”。换言之,当解调器“看见”有光线闪烁时,它才输出“真”

状态。

上述过程看上去很简单,但还有一些细节问题值得重视,其中最重要的一点是要

将解调器的接受频率调节到与光线闪烁的频率一致。现在商业化的 IR 调制器频率范

围很宽,从 32kHz到 45kHz不等,这么高的频率足以防止一般室内光线(如荧光灯)

的干扰。

4.3 4.3 4.3 4.3 红外通信协议与交通规则红外通信协议与交通规则红外通信协议与交通规则红外通信协议与交通规则

在现实生活中,司机驾驶车辆通过十字路口的过程大致如下:首先,抬头看清此

时的交通信号灯,然后根据“绿灯行,红灯停”的交通规则正确驾驶车辆通过路口。

如此看来,一个十字路口的车辆能安全有序的通行必须包含以下必要条件:第一,司

机必须正确无误的看清信号牌上的显示;第二,所有司机都必须遵守“绿灯行,红灯

停”这一约定俗成的交通规则。

然而,在本模拟系统中,机器人并没有“眼睛”,它并不能看清交通信号牌上的

显示,但它可以通过控制器 RCX 前部的红外解调电路感受外界的红外调制信号。值

得注意的是,并不是所有的调制信号机器人都能正确无误的接收,机器人可接收的调

制信号必须有一个规则,这个规则就叫做机器人的红外通信协议。

与其它红外设备相比,机器人的红外通信协议相对比较简单:机器人可接收的信

息的最小单位是数据包,一个标准的数据包包含若干字节,其形式如下:

0x55 0xff 0x00 0xf7 0x08 D ~D C ~C

其中,D 是要发送的资料,校验和 C = f7+D,~D和~C分别表示 D和 C的反码。

例如,数据包 0x55 0xff 0x00 0xf7 0x08 0x12 0xed 0x09 0xf6 表示信息

0x12。

具体来说,对于数据包中的每一个字节,又是按如下规则调制发送的:

� 红外载波频率为 38kHz;

� 字节格式为:一位起始位,八位数据位,一位校验位(奇校验),一位停止位;

� 波特率为 2400b/s。

通信协议的建立使模拟系统中的机器人可以接受到由信号牌发送的特定的信息,

就像机器人有了“眼睛”可以看到红、绿灯一样,但在“绿灯行,红灯停”的交通规

Page 20: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 15 页 共 50 页

则建立之前,交通牌显示的红灯或绿灯对机器人来说没有任何意义,以下我们订立交

通规则(如表 4.1所示):

表 4.1 交通规则 信息 数据包格式 规则

0x01 0x55 0xff 0x00 0xf7 0x08 0x01 0xfe 0xf8 0x07 只允许机器人直行

0x02 0x55 0xff 0x00 0xf7 0x08 0x02 0xfd 0xf9 0x06 只允许机器人左转

0x03 0x55 0xff 0x00 0xf7 0x08 0x03 0xfc 0xfa 0x05 只允许机器人右转

0x04 0x55 0xff 0x00 0xf7 0x08 0x04 0xfb 0xfb 0x04 只允许机器人停止

上述通信协议和交通规则的建立使机器人不仅能够“看到”交通灯,而且明白“红

灯停,绿灯行”的交通规则,这样模拟系统中的交通才能有条不紊的运行。

4.4 4.4 4.4 4.4 程序设计程序设计程序设计程序设计

从软件编程的角度来说,不需要考虑产生精确的 38KHz 载波频率,因为这一点

是由硬件电路来保证的。因此,程序设计只需完成相应的串口初始化设置,并把信息

按照数据包的格式从串行口发送出去。为了便于单片机发送信息,我们在程序存储区

新建 4 张表分别存放信息 1、信息 2、信息 3和信息 4的数据包格式,如下所示:

typedeftypedeftypedeftypedef tByte unsigned charunsigned charunsigned charunsigned char; tByte codetByte codetByte codetByte code message1_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x01,0xfe,0xf8,0x07}; tByte codetByte codetByte codetByte code message2_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x02,0xfd,0xf9,0x06}; tByte codetByte codetByte codetByte code message3_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x03,0xfc,0xfa,0x05}; tByte codetByte codetByte codetByte code message4_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x04,0xfb,0xfb,0x04};

单片机发送信息时,只需通过查表把表中的字节逐一从串行口发送出去即可。根

据上述软件设计思想,编写程序(源程序见附录 A,程序流程图如图 4.3所示)。程序

说明如下:

程序开始执行后,初始化串行口(11 位异步收发方式、2400b/s、奇校验),此后

分别查询南北方向和东西方向的交通状态,并将相应的交通状态按照红外通信协议发

送出去。

4.5 4.5 4.5 4.5 软件调试软件调试软件调试软件调试

红外任务的调试过程主要分为以下三个步骤:首先,利用红外发射接收器和串口

助手软件接收由单片机发送的 0xff 字节;其次,将 0xff 字节改为机器人可识别的信息

Page 21: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 16 页 共 50 页

(数据包),再次观察是否接收正确;最后,编写机器人测试程序,使其在接收到信

息 1后蜂鸣表示接收正确。

在红外通信模块的调试过程中注意到,通常红外功率二极管发射距离约为 1m,

发射角度不大于 30°,因此整个城市交通各路口、各方向的红外信息不会相互干扰。

另外,我们还发现对于 38kHz的载波频率,发送数据的波特率最高不能超过 2400b/s。

如果超过 2400b/s,接收的误码率将明显升高,这是因为解调电路默认接收“0”时的

载波信号脉冲不能少于 14个。

始始始始开开开开串串串串串串串串串串串串串串串串始始始始串串串串????南南南南南南南南南南南南南南南南南南南南南南南南南南南南态态态态

南南南南南南南南南南南南南南南南送送送送发发发发 message1[]南南南南南南南南南南南南南南南南送送送送发发发发 message2[]

南南南南南南南南南南南南南南南南送送送送发发发发 message3[]南南南南南南南南南南南南南南南南送送送送发发发发 message4[]

????西西西西南南南南南南南南南南南南南南南南南南南南东东东东 态态态态 西西西西南南南南南南南南东东东东送送送送发发发发 message1[]

西西西西南南南南南南南南东东东东送送送送发发发发 message2[]

西西西西南南南南南南南南东东东东送送送送发发发发 message3[]

西西西西南南南南南南南南东东东东送送送送发发发发 message4[]

直直直直串串串串 左左左左转转转转 右右右右转转转转 停停停停停停停停

直直直直串串串串 左左左左转转转转 右右右右转转转转 停停停停停停停停束束束束结结结结

图 4.3 红外通信程序流程图

Page 22: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 17 页 共 50 页

5 5 5 5 RSRSRSRS----485485485485 通信模块设计通信模块设计通信模块设计通信模块设计

为了便于对城市交通集中控制与管理,我们将一台 PC机作为主机,12台单片机

(共有 12个路口)作为从机,主机与从机之间通过 RS-485 连接实现主从式多机通信。

这样,我们就可以根据车流量的变化情况动态的改变各路口东西南北各方向直行、左

转、右转和停止的时间,从而达到交通控制管理的目的。

5.1 5.1 5.1 5.1 RSRSRSRS----485485485485 主从式多机通信主从式多机通信主从式多机通信主从式多机通信

RS-485主从式多机通信的原理如下,通信前必须首先确定某一个设备或计算机为

主机(其他设备都为从机),然后为每一台从机分配一个独立从机地址码。通信时,

主机发送地址帧,总线上的从机收到地址帧后与自己的从机地址码相比,如果相同,

那么它将给主机发送一个应答信号;如果不同,它将继续监听总线上的地址帧。主机

在接收到从机的应答信号后,发送数据帧,从而建立与从机的点对点的通信。

特殊的,如果主机发送地址帧后从机没有响应,主机应该再等待一定的时间,如

果时间过后,从机还没有应答,那么主机就应再次发送地址帧。上述等待的时间通常

称为超时时间。通常,超时时间过短会使得从机尚未来得及反应主机就跳离,时间过

长时则导致系统的反应迟钝,使得通信系统总体处理效率降低。

通过 8051单片机串行口方式 2、方式 3,我们可以方便的实现 RS-485主从式多

机通信。具体过程如下:初始状态下所有从机的 SM2 位置 1,处于只接收地址帧的状

态;主机发送一帧地址信息,其中前 8 位为地址,第 9 位为地址/数据信息的标志位(该

位置 1 表示该帧为地址信息);从机接收到地址帧后,各自将接收的地址与本从机的

地址比较。对于地址相符的那个从机,使 SM2 位清零,以接收主机随后发来的所有

信息;对于地址不符的从机,仍保持 SM2=1,对主机随后发来的数据不予理睬,直至

发送新的地址帧。

5.2 5.2 5.2 5.2 RSRSRSRS----485485485485 通信模块的结构通信模块的结构通信模块的结构通信模块的结构

本通信模块由 1台 PC机、1个 RS-232/485 网络转换器和 12个单片机交通控制装

置组成,每个单片机通过串行口与 RS-232/485 网络转换器的一端相连,PC机通过串

行口与 RS-232/485的网络转换器的令一端相连。系统结构原理如图 5.1所示。

通信时,串行通信数据格式为 1 位起始位、8 位数据位、1 位程控位和 1 位停止

位,通信波特率为 2400,并约定:

01H~12H 单片机分机地址码

Page 23: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 18 页 共 50 页

ffH 数据接收错误应答信号

f1H 改变直行时间命令字

f2H 改变左转时间命令字

f3H 改变右转时间命令字

f4H 改变停止时间命令字

主机与单片机从机的数据传送格式为:地址码→命令字→参数。

示示示示示示示示显显显显 算算算算算算算算计计计计 RS232/485示示示示转转转转转转转转 片片片片算算算算单单单单 1 片片片片算算算算单单单单 2 片片片片算算算算单单单单 12. . .

RS-232 RS-485

..

..

..

图 5.1 RS-485 通信模块原理图

5.3 5.3 5.3 5.3 程序设计程序设计程序设计程序设计

根据上述 RS-485主从式多机通信协议,编写程序(源程序见附录 A,程序流程

图如图 5.2所示)。程序说明如下:

程序开始执行后,进行串口初始化,之后从机采用查询方式接收数据。当从机接

收到地址码后,与自己的地址码对照,只有与本机的地址码相符合的从机将自己的程

控位 SM2 置位 0,并向主机发送应答信号(自己的分机号),建立该从机与主机点对

点的数据传送。此后,从机接收到命令字后,检测接收数据是否正确,若不正确,回

送数据错误应答信号 0xff;若正确,接收参数并执行命令。在此过程中,其它从机处

于监听状态。

5.45.45.45.4 软软软软件调试件调试件调试件调试

RS-485 串行通信任务的调试主要有以下几点需要注意:首先,RS-485 串行通信

与红外通信都要用到串行口。为解决上述问题,我们使用数据分配器,使这两个通信

任务分时复用串行口。这样,每次使用串行通信口时都要注意串行口的参数是否正确

设置。其次,RS-485 属半双工通信方式,数据流的方向是由 RS-485电平转换芯片的

控制引脚的电平所决定的。因此,在发送和接收切换时,需改变上述引脚电平。最后,

RS-485 属主从式通信方式,应避免从机同时应答主机产生混乱。

Page 24: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 19 页 共 50 页 始始始始开开开开串串串串串串串串串串串串串串串串始始始始串串串串

????命命命命命命命命命命命命 回回回回回回回回改改改改 改改改改串串串串 命命命命命命命命命命命命变变变变 变变变变变变变变 回回回回回回回回改改改改 改改改改 命命命命命命命命命命命命变变变变 变变变变变变变变变变变变 回回回回回回回回改改改改 改改改改 命命命命命命命命命命命命变变变变 变变变变变变变变变变变变 回回回回回回回回改改改改 改改改改 命命命命命命命命命命命命变变变变 变变变变变变变变变变变变改改改改 改改改改串串串串变变变变 变变变变变变变变 改改改改 改改改改变变变变 变变变变变变变变变变变变 改改改改 改改改改变变变变 变变变变变变变变变变变变 改改改改 改改改改变变变变 变变变变变变变变变变变变

接接接接接接接接接接接接接接接接????本本本本本本本本本本本本本本本本码码码码 回回回回回回回回本本本本本本本本本本本本本本本本码码码码SM2=0,RB8=0接接接接接接接接命命命命命命命命命命命命

接接接接接接接接改改改改串串串串变变变变变变变变 接接接接接接接接改改改改变变变变变变变变变变变变 接接接接接接接接改改改改变变变变变变变变变变变变 接接接接接接接接改改改改变变变变变变变变变变变变改改改改 改改改改串串串串变变变变 变变变变变变变变 改改改改 改改改改变变变变 变变变变变变变变变变变变 改改改改 改改改改变变变变 变变变变变变变变变变变变 改改改改 改改改改变变变变 变变变变变变变变变变变变SM2=0束束束束结结结结

其其其其其其其其回回回回回回回回接接接接接接接接 接接接接接接接接接接接接错错错错错错错错错错错错

图 5.2 RS-485 通信模块流程图

Page 25: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 20 页 共 50 页

6 6 6 6 机器人程序设计机器人程序设计机器人程序设计机器人程序设计

本毕业设计利用机器人模拟城市交通车辆,要求机器人能沿着城市道路平稳行

驶,并能根据交通灯信号自主选择行驶路线。具体来说,首先要解决的最基本的问题

是机器人沿直线和曲线行走,其次还要解决路口识别、信号灯识别、直角转弯、壁障

等一系列问题,这些都可以通过 ROBOLAB 或 NQC实现。

6.16.16.16.1 RCXRCXRCXRCX 简介简介简介简介

机器人探索者(the Robotic Command Explorer——RCX)是乐高机器人的核心控

制部分。RCX有 3路输入、3路输出,可以连接各种传感器和马达等输入、输出设备。

RCX 可以保存 5 个独立的应用程序。RCX 的操作系统是面向事件(event-oriented)

的,可以并行处理 10个任务。

图 6.1 RCX可编程积木

具体来说,RCX的功能包括:

� 三个输入:可以连接多种传感器,我们不仅可以使用乐高公司生产的标准传

感器,还可以使用自己动手设计制作的传感器;

Page 26: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 21 页 共 50 页

� 三个输出:通常接 DC 马达;

� 五个程序:任意装载不同的程序,自由擦写,非常方便;

� 红外通讯:通过 RCX 前端的红外接口,我们可以轻松的将程序下载到 RCX

中,RCX 也可以将采集的数据实时的上载到电脑中;

� 十个任务:RCX 的操作系统是一个多任务操作系统,可以同时运行多达 10

个任务;

� A/D转换:10 位的 A/D转换器;

� 数据存储:2000 点的数据存储。RCX 可以脱离计算机进行数据测量,配合

ROBOLAB 强大的数据分析功能,可以完成许多复杂的数据处理任务;

� 通信功能:可以实现机器人之间的相互通信,这一点对于多主体

(Multi-agency)的研究特别有用。

RCX实际上就是个微型电脑,使用 RCX可以方便的搭建一个机器人控制系统。

在这个控制系统中,传感器感应周围环境,接受信息,完成输入。红外发射仪将计算

机上编写好的机器人系统程序指令下载到 RCX中。这样,RCX就可以控制输出——

光电、声音以及马达,从而完成特定的功能。

6.2 6.2 6.2 6.2 ROBOLABROBOLABROBOLABROBOLAB 编程环境编程环境编程环境编程环境

ROBOLAB 是以美国国家仪器公司(NI)的 LabVIEW软件为基础开发的图形化编程环

境。ROBOLAB 最大优点在于它提供了不同的水平等级以及不同的编程方式。在 ROBOLAB

中提供了两种编程方式——“编程者”和“研究者”。研究者提供了数据采集分析功

能,而“编程者”又可分为导航者和发明家者级别。导航者级别提供的编程环境和例

子较为简单,适宜初学者;发明家级别则提供全部的控制能力。

A. 导航者级别是最容易的编程模式。在此级别中使用了特殊的编程环境,能够

使程序一直处于编译和执行中(导航者级别程序如图 6.2所示)。

图 6.2 导航者级别程序

B. 发明家级别是第二个编程模式。在这个级别中通过连线把单独的图标连在一

起组成一个程序。编写好的程序可以包含所有类型的编程元件,例如:容器、

Page 27: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 22 页 共 50 页

参数、循环和函数图标(发明家级别程序如图 6.3所示)。

图 6.3 发明家级别程序

C. 研究者级别是最高的编程模式。在这个级别中包括了发明家级别中

的所有功能,同时还增加了数据采集和高级数据分析的功能(研究者级别程

序如图 6.4 所示)。

图 6.4 研究者级别程序

6.36.36.36.3 NQCNQCNQCNQC 编程环境编程环境编程环境编程环境

NQC 是 Not Quite C的缩写,也就是不完全的 C 语言,他是一个名叫 Dave Baum

的乐高爱好者为 RCX 编程而开发的一种语言,所用的语法与传统的 C完全一样,只

是增加了几个专门为控制 RCX而开发的命令。NQC与 ROBOLAB 相比,有两大优势:

第一,NQC的变量定义和变量运算比 ROBOLAB更加方便;第二,NQC的控制更加

灵活,这一点在定义传感器类型时尤为明显。此外,NQC 还有许多值得称道的地方,

例如它支持多个平台——Windows/Linux/Mac,程序易于修改等。这些优点使 NQC成

为 ROBOLAB之外最佳选择。

Page 28: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 23 页 共 50 页

如果没有软件集成开发环(Itegrated Development Environment-----IDE),就只

能在 DOS下对程序进行编译。NQC 支持多种 IDE,在众多的 IDE中,伯瑞克控制中

心(Bricx Command Center——BricxCC)非常完善,它不仅提供 NQC的编译环境,

还提供很多工具,例如 RCX 监测、内存察看等,这些都使程序的调试更加方便

(BricxCC 编程环境如图 6.5所示)。

图 6.5 BicxCC编程环境

6.4 6.4 6.4 6.4 机器人的结构和功能机器人的结构和功能机器人的结构和功能机器人的结构和功能

在模拟城市交通中行驶的机器人由智能积木 RCX 搭建而成(如图 6.6所示)。其

中,RCX的三个输入口分别与 3个灰度传感器相连,用于检测路况。具体来说,三个

灰度传感器分别完成道路轨迹识别、路口识别和障碍物识别功能。两个输出口与马达

相连,构成机器人的驱动装置,而剩下的 1个输出口与灯相连,作为机器人的尾灯。

在本模拟系统中,机器人采用单灰度传感器实现沿轨迹行走。当灰度传感器接收

到的光变暗时说明机器人驶入黑色区域,机器人停止右侧马达调整行驶方向;当灰度

传感器接收到的光变亮时说明机器人驶入白色区域,机器人停止左侧马达调整行驶方

向。如此周而复始,机器人不断调整自己的行驶方向,机器人走过的路线轨迹呈锯齿

Page 29: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 24 页 共 50 页

状(如图 6.7所示)。路口识别的原理与轨迹识别的原理相似,即当机器人发现与道路

垂直的黑色轨迹时,机器人到达十字路口。

图 6.6 机器人实物图 图 6.7 单灰感机器人原理图

实际上,灰度传感器不仅可以测量红外光,还可以测量可见光。利用这一点我们

可以使用灰度传感器测量光源的远近,当灰度传感器接收的可见光较强时,表明机器

人与光源距离较近;当灰度传感器接收到的可见光较弱时,表明机器人与光源距离较

远。根据上述原理,通过在每部机器人后加上尾灯,而前部加上检测尾灯光源的灰度

传感器就可以方便的实现机器人避障。

6.5 6.5 6.5 6.5 程序设计程序设计程序设计程序设计

ROBOLAB 与 NQC 的功能都很强大。两者都支持多任务的程序设计方法和基于

“事件”的程序设计方法。在本设计中,分别利用上述两种编程方法为机器人编写了

程序。其中,前者通过 NQC实现,而后者则通过 ROBOLAB实现。由于多任务的程

序设计方法实现较为复杂,下面将进行详细分析:

通过多任务的程序设计方法进行程序设计时,根据机器人所要实现的功能,共需

创建了 5个任务,分别为:主任务、路口识别任务、避障任务、直角转弯任务和沿轨

迹行走任务。各任务说明如下:

主任务负责调用其它的任务。程序开始执行后,首先进行系统初始化,包括传感

器的定义和全局变量的定义,然后蜂鸣 1s 表示系统启动成功,最后分别启动避障任

务、路口识别任务和沿轨迹行走任务(源程序见附录 B,程序流程图如图 6.8所示)。

Page 30: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 25 页 共 50 页

路口识别任务负责检测机器人是否到达十字路口。程序开始执行后,查询传感器

是否检测到路口黑线,直到上述条件为真时,机器人蜂鸣表示已识别路口,并启动直

角转弯任务。之后,机器人再次检测路口黑线,重复上述过程(源程序见附录 B,程

序流程图如图 6.9所示)。

始始始始开开开开系系系系 系系系系始始始始系系系系统统统统蜂蜂蜂蜂鸣鸣鸣鸣启启启启 启启启启启启启启启启启启动动动动 动动动动启启启启 启启启启启启启启 启启启启动动动动 动动动动动动动动 动动动动启启启启 启启启启 启启启启启启启启启启启启启启启启动动动动 动动动动 动动动动束束束束结结结结

始始始始开开开开???? 感感感感感感感感 感感感感感感感感传传传传 传传传传传传传传 传传传传

蜂蜂蜂蜂鸣鸣鸣鸣启启启启 启启启启启启启启 启启启启启启启启动动动动 动动动动 动动动动束束束束结结结结

图 6.8 主任务程序流程图 图 6.9 路口识别任务程序流程图

避障任务的功能使机器人避免撞到前面的机器人。程序开始执行后,机器人反复

检测前边是否有车,直到发现前面确实有车时,蜂鸣表示发现前方车辆,然后停止沿

轨迹行走任务和路口识别任务,停车等待,直到发现前方没有车辆,等待两秒后,启

动路口识别任务和沿轨迹行走任务。之后,机器人再次检测前方是否有车,重复上述

过程(源程序见附录 B,程序流程图如图 6.10)。

沿轨迹行走任务使机器人能沿着黑线与灰线的界限平稳行驶。程序开始运行后,

Page 31: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 26 页 共 50 页

两个马达同时启动,机器人向前行驶,当机器人驶入灰色区域时,关闭左马达,调整

行驶方向;当机器人驶入黑色区域时,关闭右马达,调整行驶方向(如图 6.7所示),

如此往复,机器人在不断调整中行驶(源程序见附录 B,程序流程图如图 6.11所示)。

始始始始开开开开

????前前前前前前前前前前前前车车车车

前前前前前前前前前前前前车车车车?蜂蜂蜂蜂鸣鸣鸣鸣停停停停停停停停停停停停 停停停停停停停停停停停停停停停停轨轨轨轨 轨轨轨轨停停停停停停停停停停停停停停停停 停停停停识识识识识识识识 轨轨轨轨

束束束束结结结结

停停停停车车车车等等等等等等等等2s启启启启 停停停停停停停停 停停停停动动动动 识识识识识识识识 轨轨轨轨启启启启 停停停停 停停停停停停停停停停停停停停停停动动动动 轨轨轨轨 轨轨轨轨

Y

N

Y

N

始始始始开开开开直直直直直直直直???? 入入入入入入入入入入入入入入入入入入入入驶驶驶驶

束束束束结结结结

左左左左 左左左左关关关关关关关关 关关关关???? 入入入入入入入入入入入入入入入入入入入入驶驶驶驶

右右右右 左左左左关关关关关关关关 关关关关 N

Y

N

Y

图 6.10 避障任务程序流程图 图 6.11 沿轨迹行走任务流程图

直角转弯任务的功能在于当机器人已经识别十字路口后,根据设定好的行车路线

Page 32: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 27 页 共 50 页

和此时交通灯的状态正确行驶。在图 6.12所示的直角转弯任务中我们设定的行车路线 始始始始开开开开停停停停停停停停停停停停停停停停 停停停停识识识识识识识识 识识识识Sem=?

停停停停停停停停停停停停 停停停停停停停停停停停停停停停停轨轨轨轨 识识识识

停停停停车车车车清清清清清清清清清清清清清清清清清清清清

束束束束结结结结

停停停停停停停停停停停停 停停停停停停停停停停停停停停停停轨轨轨轨 识识识识

======== ????清清清清邮邮邮邮 邮邮邮邮 2 左左左左转转转转 ======== ????清清清清邮邮邮邮 邮邮邮邮 4

停停停停车车车车 ======== ????清清清清邮邮邮邮 邮邮邮邮 1 直直直直停停停停 小小小小 小小小小关关关关关关关关 车车车车关关关关

启启启启 停停停停停停停停 停停停停动动动动 识识识识识识识识 识识识识启启启启 停停停停 停停停停停停停停停停停停停停停停动动动动 轨轨轨轨 识识识识

停停停停车车车车 ======== ????清清清清邮邮邮邮 邮邮邮邮 3 右右右右转转转转SEM+=1

1 2 3 4

图 6.12 直角转弯任务

Page 33: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 28 页 共 50 页

为:在第一个十字路口直行,在第二个十字路口左转,在第三个十字路口右转,在第

四个十字路口停车关闭机器人电源。程序开始执行后,分别停止路口识别任务和沿轨

迹行走任务,检测标志值,如果标志为 1 且此时交通状态为直行,那么机器人直行,

否则停车等待,直到交通状态为直行时机器人直行。之后,机器人清空交通状态标志

并启动路口识别任务和沿轨迹行走任务。标志为其它值时的情况与此类似(源程序见

附录 B,程序流程图如图 6.12所示)。

Page 34: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 29 页 共 50 页

结结结结 论论论论

在交通模拟系统的软件开发过程中,始终遵循着“整体设计”的思想。在系统软

件开发的初期,首先构建任务调度器,建立系统框架。然后根据系统所要实现的功能,

将系统分割为多个模块进行设计。针对不同模块的特点,抽象出相应的目标对象,并

通过定义输入输出接口将各个模块有机的联系起来。最后,在代码的实现过程中,采

用“面向对象”的程序设计思想,通过“文件封装”的形式为代码添加结构。总的来

说,在软件的设计过程中,试图寻求一种嵌入式系统开发的通用模式,并努力将自己

所作的工作规范化。

最终,本设计完成了混合式调度器、交通灯显示模块、红外通信模块、RS-485

通信模块的所有软件设计与调试,圆满完成了单片机嵌入式系统的开发工作。另外,

在机器人软件设计方面,本设计中机器人 ROBOLAB和 NQC程序也已在机器人上调

试通过,机器人可平稳、可靠在模拟系统中运行。

我认为对于交通模拟系统还可以从功能上进行进一步的完善:第一,目前机器人

只能沿着事先指定好的路线行驶,而不能根据需要改变行车路线。如果能动态的控制

机器人的行驶路线,那么模拟系统将更加贴近现实交通系统;第二,虽然现有的模拟

交通系统可动态改变任意方向交通灯的时间,但由于模拟系统中缺乏车流量的检测机

制,因此,交通灯的智能控制受到了很大的制约。基于上述问题,根据我对系统的认

识,提出以下解决方案:前者可以通过 RCX的直接控制模式实现,即建立 RCX与主机

的动态通信;而后者可通过在交通路口增设传感器来实现。

Page 35: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 30 页 共 50 页

致致致致 谢谢谢谢

在整个毕业设计过程中,我得到了林嵘老师和秦华旺老师细致耐心的指导,林老

师对工作的认真负责,对学生的严格要求,让我深受鼓舞;秦老师严谨的治学态度、

丰富的专业知识让我受益非浅。在此,我向两位老师致以最诚挚的谢意!另外,我还

想向1007教研室的各位老师以及西觅亚科技有限公司苏艳飞项目辅导老师表示感谢,

感谢您们对我们毕业设计的大力支持!

在毕业设计即将结束的时刻,我还要感谢王晨同学和娄悦同学。在毕业设计的几

个月中,我们从相识到熟悉,从相知到朋友。在团队中,我们互相帮助,努力工作,

攻克了一个个难关,最终完成了整个项目的设计和调试,这些都充分体现了我们团队

的合作精神。这种团队协作的精神,必将使我在今后的学习和工作中受益匪浅! 谨于此感谢父母对我的养育之恩与鼓励支持,并感谢所有曾经关心、帮助过我的

人。

Page 36: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 31 页 共 50 页

参参参参 考考考考 文文文文 献献献献

1 马忠梅,籍顺心,张凯,马岩.单片机的 C 语言程序设计.第 3 版.北京:北

京航空航天大学出版社,2003

2 胡大可,李培弘,方路平.基于 8051的嵌入式开发指南.第 1版.北京:电子

工业出版社,2003

3 林伸茂等.8051单片机彻底研究实习篇.北京:人民邮电出版社,2004

4 闫玉德,俞虹.MCS-51单片机原理与应用(C 语言版).北京:机械工业出版

社,2003

5 Michael J.Pont.C 语言嵌入式系统开发.北京:中国电力出版社,2003

6 王力虎,李红波.PC控制及接口程序设计实例.北京:科学出版社,2004

7 Michael J.Pont.时间触发嵌入式系统设计模式. 北京:中国电力出版社,

2004

8 Fred G. Martin.机器人探索――工程实践指南.电子工业出版社,2004

9 ROBOLAB 2.5编程者指南(ver0.9.9).www.semia.com,2003

10 ROBOLAB研究者指南(ver1.0.1).www.semia.com,2003

11 使用 ActiveX控件来控制 RCX.www.ceeo.com/activeX,2004

12 Andrew O’Grady.ROBOLAB Troubleshooting Guide.Tufts University

Press,2003

13 ROBOLAB_Reference_Guide(version1.2).www.lego.com/education,2002

14 Eric.L.Wang,ChrisRogers.Engineering with LEGO bricks and ROBOLAB.

Department of Mechanical Engineering,2002

15 Matthew Bates.NQC Programmer Reference.The Open University,2000

16 Dave Baum.NQC Programmier Guide.www.robotdiy.com,2003

17 William J.Taffe.Programming LEGO Robots Using NQC.Department of

Computer Science Utrecht University,2002

18 Jonathan B.Knudsen.LEGO MINDSTORMS Robots.www.oreilly.com/catalog,

1999

19 Walton Hall ,Milton Keynes.What Is the Best Environment Language

For Teaching Robotics Using LEGO MindStorms.The Open University,2002

20 David Hanley,Sean Hearne.LEGO Mindstorms programming with VB.WIT

Press,2002

21 Quickstart Guide.www.LEGO.com/education/MINDSTORMS,2004

22 Controlling LEGO Programmable Bricks Technical Reference.www.ceeo.

com/ Pbrick,1998

Page 37: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 32 页 共 50 页

23 Fred G. Martin.The Art of LEGO Design.The Robotics Practitioner

Press,1995

24 王建校,杨建国,宁改娣,危建国.51 单片机及 C51 程序设计.北京:科学

出版社,2002

25 靳达.单片机应用系统开发实例导航.北京:人民邮电出版社,2003

26 闫玉德,俞虹.MCS-51 单片机原理与应用(C 语言版).北京:机械工业出

版社,2003

Page 38: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 33 页 共 50 页

附录附录附录附录 AAAA 单片机嵌入式系统源程序单片机嵌入式系统源程序单片机嵌入式系统源程序单片机嵌入式系统源程序

#ifndef _port_h

#define _port_h

sbit SERIAL_DATA_INPUT_NORTH=P1^0;

sbit SERIAL_DATA_INPUT_SOUTH=P1^1;

sbit SERIAL_DATA_INPUT_WEST=P1^2;

sbit SERIAL_DATA_INPUT_EAST=P1^3;

sbit SHIFT_CLOCK_NORTH=P1^4;

sbit SHIFT_CLOCK_SOUTH=P1^5;

sbit SHIFT_CLOCK_WEST=P1^6;

sbit SHIFT_CLOCK_EAST=P1^7;

sbit LATCH_CLOCK1=P2^0;

sbit LATCH_CLOCK2=P2^1;

sbit LATCH_CLOCK3=P2^2;

sbit LATCH_CLOCK4=P2^3;

sbit LATCH_CLOCK5=P2^4;

sbit DE=P3^4;

sbit A0=P0^4;

sbit A1=P0^5;

sbit A2=P0^6;

sbit A3=P0^7;

sbit SW1=P0^0;

sbit SW2=P0^1;

sbit SW3=P0^2;

sbit SW4=P0^3;

#endif

#ifndef _main_h

#define _main_h

源程序清单 1 端口头文件 port.h

源程序清单 2 项目头文件 main.h

Page 39: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 34 页 共 50 页

#include <reg52.h>

#define osc_freq (12000000UL)

#define osc_per_inst (12)

typedef unsigned char tByte;

typedef unsigned int tWord;

typedef unsigned long tLong;

#define interrupt_timer_0_overflow 1

#define interrupt_timer_1_overflow 3

#define interrupt_timer_2_overflow 5

#endif

#include "main.h"

#include "port.h"

#include "display.h"

#include "485.h"

#include "ir.h"

#include "2_01_12h.h"

tByte time_in_state_ns;

tByte time_in_state_we;

void main(void)

{

hsch_init_t2( );

initial( );

traffic_state_init( );

clear_screen( );

power_on( );

hsch_add_task(display,0,0,0);

hsch_add_task(slave_rev,0,0,0);

hsch_add_task(ir,0,0,0);

hsch_start( );

while(1)

{

hsch_dispatch_tasks( );

}

源程序清单 3 系统定义文件 main.c

Page 40: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 35 页 共 50 页

}

void initial(void)

{

SW1=1;

SW2=1;

SW3=1;

SW4=1;

slave=(P0&0x0f);

DE=0;

A2=0;

A3=0;

TMOD=0x21;

TH0=19450/256;

TL0=19450/256;

ET0=1;

EA=1;

SCON=0xD0; //SM0=SM1=1;SM2=0;REN=1;

TH1=0xf4;

TL1=0xf4;

TR0=1;

TR1=1;

}

void traffic_state_init(void)

{

traffic_state_we=FORWARD;

time_in_state_we=FORWARD_DURATION;

traffic_state_ns=STOP;

time_in_state_ns=STOP_DURATION;

}

#include "main.h"

#include "hsch.h"

void hsch_init_t2(void);

void hsch_start(void);

#include "2_01_12h.h"

源程序清单 4 时标发生器头文件 2_01_12h.h

源程序清单 5 时标发生器定义文件 2_01_12h.c

Page 41: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 36 页 共 50 页

extern staskh hsch_tasks_g[hsch_max_tasks];

void hsch_init_t2(void)

{

T2CON=0x04;

T2MOD=0x00;

TH2=0xfc;

PCAP2H=0xfc;

TL2=0x18;

PCAP2L=0x18;

ET2=1;

TR2=1;

}

void hsch_start(void)

{

EA=1;

}

void hsch_update(void) interrupt interrupt_timer_2_overflow

{

tByte index;

TF2=0;

for(index=1;index<hsch_max_tasks;index++)

{

if(hsch_tasks_g[index].ptask)

{

if(hsch_tasks_g[index].delay==0)

{

if(hsch_tasks_g[index].co_op)

{

hsch_tasks_g[index].runme+=1;

}

else

{

(*hsch_tasks_g[index].ptask)( );

hsch_tasks_g[index].runme-=1;

if(hsch_tasks_g[index].period==0)

{

hsch_tasks_g[index].ptask=0;

}

}

else

{

Page 42: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 37 页 共 50 页

hsch_tasks_g[index].delay=hsch_tasks_g[index].period;

}

}

}

}

}

#ifndef _hsch_h

#define _hsch_h

#define “main.h”

typedef struct

{

void (code *task_p)(void);

tWord delay;

tWord period;

tWord runme;

bit co_op;

}staskh;

void sch_dispatch_tasks(void);

void hsch_add_task(void (code *)(void),tWord,tWord,bit);

#define hsch_max_tasks (3)

#endif

#include "main.h"

#include "port.h"

#include "hsch.h"

staskh hsch_tasks_g[hsch_max_tasks];

static void hsch_go_to_sleep(void);

void hsch_dispatch_tasks(void)

{

tByte index;

for(index=0;index<hsch_max_tasks;index++)

{

if((hsch_tasks_g[index].co_op)&&(hsch_tasks_g[index].runme)

{

源程序清单 6 混合式调度器头文件 hsch.h

源程序清单 7 混合式调度器定义文件 hsch.c

Page 43: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 38 页 共 50 页

(*hsch_tasks_g[index].ptask)( );

hsch_tasks_g[index].runme-=1;

if(hsch_tasks_g[index].period==0)

{

hsch_tasks_g[index].ptask=0;

}

}

}

hsch_go_to_sleep( );

}

void hsch_add_task(void (code *fn_p)( ),tWord delay,tWord period,bit co_op)

{

tByte index=0;

while((hsch_tasks_g[index].ptask!=0)&&(index<hsch_max_tasks))

{

index++;

}

hsch_tasks_g[index].ptask=fn_p;

hsch_tasks_g[index].delay=delay;

hsch_tasks_g[index].period=period;

hsch_tasks_g[index].co_op=co_op;

hsch_tasks_g[index].runme=0;

}

void hsch_go_to_sleep(void)

{

PCON|=0x01;

}

#ifndef _display_h

#define _display_h

tByte code table[ ]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};

// 0 1 2 3 4 5 6 7 8 9

tByte code traffic_signal_table[ ]={0x0c,0x14,0x64,0xa4,0x21,0x22,0x24};

tByte code compensation_table[ ]={0x01,0x01,0x00,0x00,0x01,0x01,0x01};

enum direction {north_south,west_east};

enum traffic_state {FORWARD,AMBER_F,LEFT,AMBER_L,RIGHT,AMBER_R,STOP};

traffic_state traffic_state_ns,traffic_state_we;

enum color {GREEN,RED} COL;

void clear_screen(void);

源程序清单 8 显示模块头文件 display.h

Page 44: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 39 页 共 50 页

void led_update(tByte flag,tByte signal_ns,tByte signal_we);

void display(void);

#endif

#include "main.h"

#include "port.h"

#include "display.h"

tByte FORWARD_DURATION=10;

tByte LEFT_DURATION=10;

tByte RIGHT_DURATION=10;

tByte STOP_DURATION=10;

tByte flag;

tByte signal;

void clear_screen(void)

{

tByte i;

LATCH_CLOCK1=0;

LATCH_CLOCK2=0;

LATCH_CLOCK3=0;

LATCH_CLOCK4=0;

LATCH_CLOCK5=0;

for(i=0;i<8;i++)

{

SHIFT_CLOCK_NORTH=0;

SHIFT_CLOCK_SOUTH=0;

SHIFT_CLOCK_WEST=0;

SHIFT_CLOCK_EAST=0;

SERIAL_DATA_INPUT_NORTH=0;

SERIAL_DATA_INPUT_SOUTH=0;

SERIAL_DATA_INPUT_WEST=0;

SERIAL_DATA_INPUT_EAST=0;

SHIFT_CLOCK_NORTH=1;

SHIFT_CLOCK_SOUTH=1;

SHIFT_CLOCK_WEST=1;

SHIFT_CLOCK_EAST=1;

}

LATCH_CLOCK1=1;

LATCH_CLOCK2=1;

LATCH_CLOCK3=1;

源程序清单 9 显示模块定义文件 display.c

Page 45: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 40 页 共 50 页

LATCH_CLOCK4=1;

LATCH_CLOCK5=1;

}

void led_update(tByte flag,tByte signal_ns,tByte signal_we)

{

tByte i;

switch(flag)

{

case 1: LATCH_CLOCK1=0;break;

case 2: LATCH_CLOCK2=0;break;

case 3: LATCH_CLOCK3=0;break;

case 4: LATCH_CLOCK4=0;break;

case 5: LATCH_CLOCK5=0;break;

}

for(i=0;i<8;i++)

{

SHIFT_CLOCK_NORTH=0;

SHIFT_CLOCK_SOUTH=0;

SHIFT_CLOCK_WEST=0;

SHIFT_CLOCK_EAST=0;

SERIAL_DATA_INPUT_NORTH=(signal_ns&(1<<i))>>i;

SERIAL_DATA_INPUT_SOUTH=(signal_ns&(1<<i))>>i;

SERIAL_DATA_INPUT_WEST=(signal_we&(1<<i))>>i;

SERIAL_DATA_INPUT_EAST=(signal_we&(1<<i))>>i;

SHIFT_CLOCK_NORTH=1;

SHIFT_CLOCK_SOUTH=1;

SHIFT_CLOCK_WEST=1;

SHIFT_CLOCK_EAST=1;

}

switch(flag)

{

case 1: LATCH_CLOCK1=1;break;

case 2: LATCH_CLOCK2=1;break;

case 3: LATCH_CLOCK3=1;break;

case 4: LATCH_CLOCK4=1;break;

case 5: LATCH_CLOCK5=1;break;

}

}

void display(void)

{

tByte number_high_class_ns,number_low_class_ns;

tByte number_high_class_we,number_low_class_we;

Page 46: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 41 页 共 50 页

tByte num_high_ns,num_low_ns;

tByte num_high_we,num_low_we;

tByte green_left_ns,green_left_we;

tByte green_right_ns,green_right_we;

tByte red_left_ns,red_left_we;

tByte red_right_ns,red_right_we;

num_high_ns=time_in_state_ns/10;

num_low_ns=time_in_state_ns%10;

num_high_we=time_in_state_we/10;

num_low_we=time_in_state_we%10;

green_left_ns=10;

green_left_we=10;

green_right_ns=10;

green_right_we=10;

red_left_ns=10;

red_left_we=10;

red_right_ns=10;

red_right_we=10;

if(traffic_state_ns ==FORWARD||traffic_state_ns==AMBER_F)

{

green_left_ns=num_high_ns;

green_right_ns=num_low_ns;

}

else

{

red_left_ns=num_high_ns;

red_right_ns=num_low_ns;

}

if(traffic_state_we ==FORWARD||traffic_state_we==AMBER_F)

{

green_left_we=num_high_we;

green_right_we=num_low_we;

}

else

{

red_left_we=num_high_we;

red_right_we=num_low_we;

}

led_update(1,table[green_left_ns],table[green_left_we]);

led_update(2,table[green_right_ns],table[green_right_we]);

Page 47: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 42 页 共 50 页

led_update(3,table[red_left_ns],table[red_left_we]);

led_update(4,table[red_right_ns]|compensation_table[traffic_state_ns]

,table[red_right_we]|compensation_table[traffic_state_we]);

led_update(5,traffic_signal_table[traffic_state_ns],traffic_signal_table[traffic_state_we]);

time_in_state_ns-=1;

time_in_state_we-=1;

if(time_in_state_ns==2)

{

switch(traffic_state_ns){

case FORWARD: traffic_state_ns=AMBER_F;break;

case LEFT: traffic_state_ns=AMBER_L;break;

case RIGHT: traffic_state_ns=AMBER_R;break;

default:break;

}

}

if(time_in_state_we==2)

{

switch(traffic_state_we){

case FORWARD: traffic_state_we=AMBER_F;break;

case LEFT: traffic_state_we=AMBER_L;break;

case RIGHT: traffic_state_we=AMBER_R;break;

default:break;

}

}

if(time_in_state_ns==0)

{

switch(traffic_state_ns)

{

case AMBER_F:

traffic_state_ns=LEFT;

time_in_state_ns=LEFT_DURATION;

break;

case AMBER_L:

traffic_state_ns=RIGHT;

time_in_state_ns=RIGHT_DURATION;

break;

case AMBER_

traffic_state_ns=STOP;

time_in_state_ns=STOP_DURATION;

break;

case STOP:

traffic_state_ns=FORWARD;

time_in_state_ns=FORWARD_DURATION;

Page 48: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 43 页 共 50 页

break;

}

}

if(time_in_state_we==0)

{

switch(traffic_state_we)

{

case AMBER_F:

traffic_state_we=LEFT;

time_in_state_we=LEFT_DURATION;

break;

case AMBER_L:

traffic_state_we=RIGHT;

time_in_state_we=RIGHT_DURATION;

break;

case AMBER_R:

traffic_state_we=STOP;

time_in_state_we=STOP_DURATION;

break;

case STOP:

traffic_state_we=FORWARD;

time_in_state_we=FORWARD_DURATION;

break;

}

}

}

#ifndef _485_h

#define _485_h

#define change_FORWARD_time 0xf1

#define change_LEFT_time 0xf2

#define change_RIGHT_time 0xf3

#define change_STOP_time 0xf4

#define power 0xee

#define reset 0xff

void power_on(void);

void error(void);

void transfer_receive(tByte d);

void slave_rev(void);

#endif

源程序清单 10 RS-485通信模块头文件 485.h

Page 49: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 44 页 共 50 页

#include "main.h"

#include "port.h"

#include "485.h"

tByte slave;

void power_on(void)

{

while(!RI);

RI=0;

}

void error(void)

{

DE=1;

SBUF=0xff;

while(!TI);

TI=0;

DE=0;

}

void transfer_receive(tByte d)

{

DE=1;

SBUF=d;

while(!TI);

TI=0;

DE=0;

while(!RI);

RI=0;

}

void slave_rev(void) //interrupt 4 using 2

{

RI=0;

if(SBUF==slave)

{

SM2=0;

transfer_receive(slave);

switch(SBUF)

{

源程序清单 11 RS-485通信模块定义文件 485.c

Page 50: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 45 页 共 50 页

case change_FORWARD_time:

transfer_receive(change_FORWARD_time);

FORWARD_DURATION=SBUF;

break;

case change_LEFT_time:

transfer_receive(change_LEFT_time);

LEFT_DURATION=SBUF;

break;

case change_RIGHT_time:

transfer_receive(change_RIGHT_time);

RIGHT_DURATION=SBUF;

break;

case change_STOP_time:

transfer_receive(change_STOP_time);

STOP_DURATION=SBUF;

break;

default:error( );

}

SM2=1;

}

}

#ifndef _ir_h

#define _ir_h

tByte code message1_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x01,0xfe,0xf8,0x07};

tByte code message2_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x02,0xfd,0xf9,0x06};

tByte code message3_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x03,0xfc,0xfa,0x05};

tByte code message4_table[ ]={0x55,0xff,0x00,0xf7,0x08,0x04,0xfb,0xfb,0x04};

void send_message(bit a1,bit a0,tByte message);

void ir(void);

#endif

#include "main.h"

#include "port.h"

#include "ir.h"

void send_message(bit a1,bit a0,tByte message)

{

tByte i;

源程序清单 12 红外通信模块头文件 ir.h

源程序清单 13 红外通信模块定义文件 ir.c

Page 51: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 46 页 共 50 页

A1=a1;

A0=a0;

for(i=0;i<9;i++)

{

switch(message)

{

case 1:ACC=message1_table[i];break;

case 2:ACC=message2_table[i];break;

case 3:ACC=message3_table[i];break;

case 4:ACC=message4_table[i];break;

}

TB8=!P;

SBUF=ACC;

while(!TI);

TI=0;

}

}

void ir(void)

{

switch(traffic_state_ns)

{

case FORWARD: send_message(0,0,1);send_message(0,1,1);break;

case LEFT: send_message(0,0,2);send_message(0,1,2);break;

case RIGHT: send_message(0,0,3);send_message(0,1,3);break;

case STOP: send_message(0,0,4);send_message(0,1,4);break;

}

switch(traffic_state_we)

{

case FORWARD: send_message(1,0,1);send_message(1,1,1);break;

case LEFT: send_message(1,0,2);send_message(1,1,2);break;

case RIGHT: send_message(1,0,3);send_message(1,1,3);break;

case STOP: send_message(1,0,4);send_message(1,1,4);break;

}

}

Page 52: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 47 页 共 50 页

附录附录附录附录 BBBB NQC NQC NQC NQC 源程序源程序源程序源程序

#define BLACK 45

#define WHITE 49

#define THRESHOLD (BLACK+WHITE)/2

#define left( ) On(OUT_A+OUT_C);Wait(63);Toggle(OUT_A);Wait(128);

#define right( ) On(OUT_A+OUT_C);Wait(90);Toggle(OUT_C);Wait(120);

int sem;

void init( ) // 初始化函数

{

SetSensorType(SENSOR_3,SENSOR_TYPE_LIGHT);

SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);

SetSensor(SENSOR_2,SENSOR_LIGHT);

SetSensor(SENSOR_1,SENSOR_LIGHT);

ClearSensor(SENSOR_3);

ClearSensor(SENSOR_2);

ClearSensor(SENSOR_1);

ClearMessage( );

sem=0;

}

task check_turn_signal( ) // 路口识别任务

{

while(true)

{

if(SENSOR_1<THRESHOLD-1)

{

PlaySound(SOUND_CLICK);

start turn;

}

}

}

task check_obstacle_signal( ) // 避障任务

Page 53: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 48 页 共 50 页

{

while(true)

{

if(SENSOR_3<500)

{

PlaySound(SOUND_DOUBLE_BEEP);

stop trace;

stop check_turn_signal;

Off(OUT_A+OUT_C);

until(SENSOR_3>530);

Wait(200);

start check_turn_signal;

start trace;

}

}

}

task turn( ) // 直角转弯任务

{

stop check_turn_signal;

stop trace;

sem+=1;

switch(sem)

{

case 1: break;

case 2:

{

if(Message( )= =2) left( );

else

{

Off(OUT_A+OUT_C);

until(Message( )==2);

left( );

}

break;

}

case 3:

{

if(Message( )==2) right( );

else

{

Off(OUT_A+OUT_C);

until(Message( )==3);

right( );

}

Page 54: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 49 页 共 50 页

break;

}

case 4: StopAllTasks( );

}

ClearMessage( );

start check_turn_signal;

start trace;

}

task trace( ) // 沿轨迹行走任务

{

while(true)

{

OnFwd(OUT_A+OUT_C);

if(SENSOR_2>THRESHOLD)

{

Float(OUT_C);

until(SENSOR_2<=THRESHOLD);

}

if(SENSOR_2<THRESHOLD)

{

Float(OUT_A);

until(SENSOR_2>=THRESHOLD);

}

}

}

task main( ) // 主任务

{

init( );

PlaySound(SOUND_UP);

Wait(100);

start check_obstacle_signal;

start check_turn_signal;

start trace;

}

Page 55: 城市交通管理模拟综合设计 - 算法设计

本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书本科毕业设计说明书((((论文论文论文论文)))) 第 50 页 共 50 页

附录附录附录附录 CCCC ROBOLAB ROBOLAB ROBOLAB ROBOLAB 源程序源程序源程序源程序