代码放在github上,智慧交通场景的模拟实现
一、设计内容
采用8086汇编语言,设计并实现多个十字路口组成的道路交通模拟,包括路口的红绿灯显示,以及车流的模拟显示,每辆车能够从出发地到达指定目的地,并且交通灯能够根据道路车辆数量分布改变时间,实现智能交通。
二、需求分析
- 能够正确显示根据红绿灯变化引导车辆通行,并且要能够显示红绿灯的读秒数
- 实现4个十字路口的构成的道路交通模拟,可以直行,右转,左转,设立左转弯待转区和右转弯中转区域。
- 能够随机产生车辆的数量,以及每辆车的出发地和目的地
- 能够通过按键在每个路口添加车辆。
- 能够根据局部车辆拥塞情况动态即时改变红绿灯持续时间,实现智慧交通。
三、概要设计
3.1 系统结构
3.2 模块功能说明
- 主菜单显示模块:显示主菜单界面,选择普通交通模拟模式或者智慧交通模拟模式或者退出。
地图显示模块:绘制程序运行地图,并且打印提示字符
按键添加车辆模块:通过按键新增车辆,1—8键分别在8个路口区域增加车辆数量,9键在各个路口区域增加车辆数量
中断模块:通过8253与PC相连时产生的每秒18次的中断,来得到1秒1次的中断服务程序执行。
数字显示模块:根据红绿灯状态,将红绿灯秒数绘制至地图中心;在地图中心以相应位置形式且显示每个路口的剩余进车数;显示智慧交通改变后的红绿灯秒数
车辆显示模式:跟据车辆状态,绘制车辆至地图相应位置,道路、路口、右转弯区域、左转弯待转区。
红绿灯显示模块:根据红绿灯的状态,将红绿灯实时绘制至地图路口处。
红绿灯状态更新模块:通过中断所累加的计数器对红绿灯状态进行更新,60秒红灯,60秒绿灯,3秒黄灯。其中60秒绿灯分为前50秒直行与右转,后10秒左转待转区的车辆进行左转。
状态选择模块:程序由四个主状态的状态机进行控制,四个状态分别为东西绿灯,南北红灯;东西黄灯,南北红灯;东西红灯,南北绿灯;东西红灯,南北黄灯。
车辆状态更新模块:根据状态选择模块传递的状态,通过车辆行进算法,实现车辆的左转(左转弯待转区,在路口为绿灯的后10秒执行左转),右转和直行,并对车辆进行状态更新。
车辆增加模块:根据按键添加车辆模块传给1—8个路口的车辆,在固定的中断时间内,对相应路口的相应位置增加车辆的信息对新的车辆进行状态赋予与更新。
智慧交通模块:在状态选择模块的模块更替时,根据车辆拥塞情况改变下一个红绿灯持续时长,实现智慧交通。
四、详细设计
4.1 系统流程图
4.2 总地图设计
分为四个路口,八个进出口,用八个长度为44的数组来表示地图上8*44个点
道路的定义:
line0_0 dw 44 dup(0)
line1_0 dw 44 dup(0)
line2_0 dw 44 dup(0)
line3_0 dw 44 dup(0)
line0_1 dw 44 dup(0)
line1_1 dw 44 dup(0)
line2_1 dw 44 dup(0)
line3_1 dw 44 dup(0)
4.3 路口具体设计
每个路口有:
1. 一个容纳一个车辆的右转弯缓冲区
2. 最多容纳十辆车的左转弯待转区
3. 四个路口过道
左转弯待转区(一个队列)数据结构:
Left struc
Asize DB 10 ;最大大小
Count DB 0 ;当前队列数量
First DB 0 ; 头索引
Last DB 0 ; 尾索引
Array dw 10 dup(0) ; 存放左转弯待转区内车辆号
Left ends
4.4 车辆行进
4.4.1 概述
东西绿灯,南北红灯;东西黄灯,南北红灯;东西红灯,南北绿灯;东西红灯,南北黄灯。
其中绿灯时候分两种状态:可以直行和右转,左转只能进左转待转区域;不能够直行和右转,左待转区域进入下一路口。
根据地图可以用8个44长度的1维数组表示出来,所以根据红绿灯的状态,依次对每条街道进行遍历,长度44的一位数组中如果没有车,则存放零,若有车则存放车辆编号,车辆编号从1-337(84*4+1,一个十字最多84辆车)。
车辆定义:
car struc
start_X DW ? ;目前X坐标
start_Y DW ? ;目前Y坐标
end_X DW ? ;目的X坐标
end_Y DW ? ;目的Y坐标
live DW 0 ;是否在图内,1是,0否
car ends
car_array car 337 dup(<>)
4.4.2 车辆前进算法
4.5 显示模块
- 先设置屏幕显示模式(640*480*16),再采用描点画图,通过INT10中断来描点画图。
- 通过将AH放入0CH,通过10H中断来描点
- 调用画点的宏,完成画一条线,即方块(地图、车辆和灯)
- 调用画点的宏,完成画平行四边形(用于显示左转弯待转区)
地图线条数据结构:
line struc
X DW ? ;X坐标
Y DW ? ;Y坐标
R_L DW ? ;宽
C_L DW ? ;长
line ends
红绿灯表示数据结构:
红绿灯
light struc
X1 DW ? ;X坐标
Y1 DW ? ;Y坐标
COLOR DB ? ; 红绿灯颜色
Reserved DB 0 ;用来字节对齐
light ends
运行显示(可以看到左转弯待转区和右转缓冲区):