红绿灯控制系统设n计.docx
- 文档编号:26138958
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:21
- 大小:254.93KB
红绿灯控制系统设n计.docx
《红绿灯控制系统设n计.docx》由会员分享,可在线阅读,更多相关《红绿灯控制系统设n计.docx(21页珍藏版)》请在冰豆网上搜索。
红绿灯控制系统设n计
红绿灯控制系统的设计
随着城市人口的快速增长和机动车数量的大量增加,城市交通灯作为缓解交通压力、提高道路通行效率的重要手段,其作用越来越重要。
因此,如何改进交通灯的设计,使其更好的适应城市交通的发展也成为一个重要课题。
红绿灯控制系统是利用8253A定时/计数器芯片的定时功能,向8259A中断控制器芯片发出定时中断请求,驱动8255A可编程并行接口芯片改变路口的LED灯的亮灭。
系统采用DVCC8086-JHN微机原理与接口技术实验箱作为测试与运行的平台,8086汇编语言作为编程语言,并用MASM5.0作为汇编语言开发环境。
一、十字路口基本情况分析
图1-1是一个典型的十字路口示意图。
分别用1、2、3、4表明东、南、西和北四个流向的主车道,每个主车道置有一个交通灯,用于指示对面车辆的左转、右转和直行。
比如,1号路口的左转灯亮时,即表示对面3号路口的车可以向左转行驶。
每个路口的情况都不尽相同,要根据具体的情况来设置各个方向的放行时间。
假设,1、3方向是主干道,车流量比较大,可以将1、3路口的直行灯亮的时间设得比较长;而2、4路口是一般道路,那么2、4路口直行灯亮的时间可以设得短一点。
左转灯和右转灯放行的时间一般应比直行灯放行的时间要短。
通常情况下,主干道直行时间应在40-60秒左右;左转和右转通行时间应在15-30秒之间。
每个路口应设置时间指示灯,用来显示剩余的通行时间,并在时间快用尽时,交通灯闪烁一定的次数,用来提醒行人。
完成一个循环应在2分钟以内,以免引起
车辆等待过长的时间。
图1-1十字路口示意图
二、交通灯状态转换分析
合理的设置每个路口、每个方向的交通灯的通行时间,对车辆能否及时疏散,有着决定性的作用。
在本系统中,路口共设有四个状态,分别用来表示不同时间路口的通行状况。
状态1的时候,2、4两个路口的直行灯亮,东西方向行驶的车辆通行45秒。
2、4方向步行的行人,也可以同时通过路口。
当通行时间快结束的时候,LED灯会闪烁,提醒车辆和行人通行时间快到了。
状态2的时候,1、3两个路口左转灯亮,2、4两个路口右转灯亮15秒。
在本状态的时候,四个路口的车辆可以同时进行疏散,并且不发生冲突,大大地加快了车辆通行的速度。
这样的设置,在南京市新街口的十字路口有类似这样的设置。
通过在十字路口中间设置相应的行车线,行人也可以和车辆同时地经过路口。
当通行时间快结束的时候,LED灯会闪烁,提示通行时间即将结束。
类似于状态2,状态3的时候,1、3两个路口右转灯亮,2、4两个路口左转灯亮15秒。
通过在十字路口中间设置相应的行车线,行人也可以和车辆同时地经过路口。
当通行时间快结束的时候,LED灯会闪烁,提醒车辆和行人注意安全。
类似于状态1,状态4的时候,1、3两个路口的直行灯亮,东西方向行驶的车辆通行45秒。
1、3方向步行的行人,也可以同时通过路口。
完成四个状态的一次循环需要120秒,完成了在适当的时间限度内,有效的疏散较大的通行量的目的。
整个状态转换的过程见表1-1。
表1-1路口四个状态和相互转换过程
每个路口灯的点亮情况
通行时间
路口1
路口2
路口3
路口4
左右
人行
状态1 1.1 直行 直行 40s 20s 40s 1.2 右转 右转直行 右转 右转直行 20s 状态2 左转 右转 左转 右转 15s 状态3 右转 左转 右转 左转 15s 状态4 4.1 直行 直行 50s 20s 50s 4.2 右转直行 右转 右转直行 右转 30s 三、硬件功能分析 1.8253A定时/计数器芯片 8253A定时/计数器具有定时、计数双功能。 它具有三个相同且相互独立的16位减法计数器,分别称为计数器0、计数器1和计数器2。 每个计数器计数频率为0-2MHZ。 其内部数据总线缓冲器为双向三态,故可直接连在系统数据总线上,通过CPU写入计数初值,也可由CPU读出计数当前值。 读写控制逻辑,当选中该芯片时,根据读写命令和送来的地址信息控制整个芯片工作。 其工作方式通过控制字确定。 控制字寄存器用于接收数据总线缓冲器的信息。 当写入控制字时,控制计数器的工作方式;当写入数据时则装入计数初值。 控制寄存器为8位,只能写入不能读出。 8253A内部结构见图1-2。 当8253A执行计数功能时,计数器装入初值后,当GATE为高电平时,可用外部事件作为CLK脉冲对计数值进行减1计数。 每来一个脉冲减1,当计数值减为0时,由OUT端输出一个标志信号。 当8253A执行定时功能时,计数器装入初值后,当GATE为高电平时,由CLK脉冲触发开始自动计数。 当计数到零时,发计数结束定时信号。 8253A可以工作在方式0到方式5,常用的有方式2频率发生器方式和方式3方波发生器方式。 在方式2时,当初值装入后,OUT变为高;计数结束,OUT变为低。 该方式下如果计数未结束,但GATE为低时,立即停止计数,将OUT变为高;当GATE再变高时,便启动一次新的计数周期。 在方式3时,当装入初值后,在GATE上升沿启动计数,OUT输出高电平;当计数完成一半时,OUT输出低电平。 在本系统中,8253A工作于方式3方波发生器方式。 图1-28253A内部结构图 2.8259A中断控制器芯片 8259A是专为控制优先级中断而设计的芯片。 它将中断源按优先级排队、辨认中断源和提供中断向量的电路集成于一体,只要用软件对它进行编程,就可以管理8级中断。 8259A的内部结构见图1-3。 它由中断请求寄存器 1 图1-38259A的内部结构 对8259A编程和初始化的时候,首先要写初始化命令字ICW1-ICW4。 写ICW1以确定中断请求信号类型,清除中断屏蔽寄存器,进行中断优先级排队和确定系统是用单片还是多片。 写ICW2用来定义中断向量的高五位类型码。 ICW3可以定义主片8259A中断请求线上IR0-IR7有无级联的8259A从片。 写ICW4用来定义8259A工作时用8085模式还是8088模式,以及中断服务寄存器复位方式等。 初始化命令字写完以后,要写8259A的控制命令字,它包括OCW1-OCW3。 写OCW1可以设置或清除对中断源的屏蔽。 写OCW2设置优先级是否进行循环、循环的方式和中断结束的方式。 8259A复位时自动设置IR0优先权最高,IR7优先权最低。 写OCW3用来设置查询方式和特殊屏蔽方式,并可以读取8259A中断寄存器的当前状态。 在本系统中,使用8259A的循环等待中断工作方式。 3.8255A可编程并行接口芯片 8255A是一种可编程的芯片,它采用双列直插封装,用+5V电源供电。 内部有3个8位的I/0端口: A口、B口和C口。 这三个端口也可以分为各有12位的两组: A组和B组。 A组包含A口8位和C口的高四位,B组包含B口8位和C口的低四位;A组控制和B组控制用于实现方式选择操作;读写控制逻辑用于控制芯片内部寄存器的数据和控制字经数据总线缓冲器送入各组接口寄存器中。 因为8255A数据总线缓冲器是双向三态8位驱动器,因此可以直接和8088系统数据总线相连。 8255A的内部逻辑结构见图1-4。 图1-48255A的内部结构 8255A有三种工作方式: 方式0、方式1和方式2。 它通过对控制寄存器写入不同的方式选择控制字来决定其三种不同的工作方式。 方式0是基本输入输出方式。 该方式下的A口8位和B口8位可以由输入的控制字决定为输入或输出,C口分成高4位 需要注意的是,该方式下,只能将C口其中一组的四位全部置为输入或输出。 方式1选通输入输出方式,又叫单向输入输出方式。 它分为A、B两组,A组由数据口A和控制口C的高4位组成,B组由数据口B和控制口C的低4位组成。 数据口的输入输出都是锁存的,与方式0不同,由控制字来决定它是作为输入还是输出。 C口的相应位用于寄存数据传送中所需的状态信号和控制信息。 方式2为双向输入输出方式。 本方式只有A组可以使用。 此时A口为输入输出双向口,C口中的5位 在本系统中,8255A的三个端口均工作于方式0,全部为输出口。 四、系统设计 <一)硬件设计 1.电路分析 本系统要实现的功能是模拟十字路口红绿灯的工作状况。 按照预先设定并优化的交通灯规则,控制LED指示灯的亮灭,同时在实验箱的数码管显示屏上显示剩余的时间。 当时间递减到0的时候,改变LED灯的状态,并刷新显示屏显示的时间。 为了实现以上功能需求,本系统需要12个LED指示灯,来分别代表四个路口的直行、左转和右转灯;两个双位的数码管显示屏,用来显示1、3路口和2、4路口剩余的时间。 为了实时地更新数码管显示屏上的数字,需要使用8255A可编程芯片来即时地改变显示屏每个笔划的电平高低,从而准确地将需要显示的数字显示在数码管显示屏上。 因为交通灯需要按秒进行计数,所以需要一个均匀地时钟发生器。 8253A芯片是个功能丰富、使用简单的定时/计数器。 它可以根据需要设置不同的显示初值,从而产生所需频率的时钟脉冲,为系统提供计时和驱动其他事件的发生。 8259A中断控制器芯片可以在收到8253A发出的时钟脉冲时,产生定时的中断,在中断服务程序中,更新显示缓冲区,并调用8255A芯片来执行相关程序,从而更新LED灯和数码管显示屏。 本系统使用集成的电路和实验环境,以方便进行电路的连接和测试,同时减少因为电路的复杂性而产生的错误。 2.电路连接设计 本系统所使用到的硬件包括8253A芯片、8259A芯片、8255A芯片、LED指示灯和数码管显示屏。 在电路连接的时候,将8255A芯片的PB4-PB7连接至四个路口的直行灯,PC0-PC3连接至四个路口的右转灯,PC4-PC7连接至四个路口的左转灯。 通过改变8255A的PB口和PC口的值来实时地控制每个LED灯的亮灭,从而改变十字路口的交通状态。 将8255A的CS插孔CS-8255接译码输出Y7插孔。 将8253A的T2CLK插孔连接至1MHZ的分频输出插孔。 分频输出插孔所输出的频率是将系统的主频分解为一定的频率,以供其他硬件或者软件使用。 8253A从分频插孔得到1MHZ的固定频率,再根据芯片内部设定的计数初值,从而产生需要频率的时钟脉冲,由T2OUT口输出,供其他芯片使用。 将8253A的T2OUT插孔连接至8259A的IRQ3插孔上。 8259A的IRQ3中断口每隔固定的时间便会收到8253A发送过来的时钟脉冲,作为中断源来执行中断服务程序。 在中断服务程序中,完成更新数码管显示值和改变交通灯状态的功能。 硬件的连接见图2-1和图2-2。 图2-1系统电路图——8253A和8259A的连接图 图2-2系统电路图——8255A和LED灯的连接图 <二)软件设计 1.程序总体设计 本系统采用“自上而下总体规划、自下而上应用开发”的策略进行总体设计和开发。 先根据其功能需要,设定需要的功能模块,确定需要编写的子程序,从而使程序结构清晰,便于阅读和调试,加快了系统完成的速度。 结构化的程序设计方法很适合用来开发汇编语言程序,因为汇编语言的特性决定了其无法使用面向对象的程序开发方法;使用瀑布程序开发模型,从开始的时候把系统的需求分析透彻,对系统的功能和各个模块进行清晰的规划,从而缩短系统开发所用的时间。 为了完成系统的功能,系统的程序部分应包含以下几个模块<见图2-3)。 各个模块有的为一个子程序,有的为几个子程序的集合,有的为一段代码,但是其功能却是相互独立和便于调用的。 程序定义模块。 它用来定义系统的代码段、数据段、堆栈段、所使用到的常量和变量、8253A、8255A和8259A的各控制口和数据口地址,以及系统的储存地址的偏移量。 汇编语言所编写的程序开头有固定的格式,为下面程序的运行建立必须的条件。 芯片初始化模块用来初始化各个芯片,分为以下几个步骤: 写8253A芯片的控制字,选用方波发生器方式,并设定其使用通道2进行工作;定义8255A的工作方式,使A、B、C三个端口均工作于方式0,且为输出口;写8259A的ICW1、ICW2、ICW3和ICW4,设定其工作方式为循环等待中断方式。 地址赋初值模块 等待模块 交通灯状态模块存放着四个交通灯状态子程序ZT1、ZT2、ZT3、ZT4,供等待模块调用。 当某个子程序被调用时,便点亮相应的LED灯。 中断处理程序分为两个子程序。 其中INT7是在中断源电平信号不符合规定要求时,自动转到7号中断,在数码管显示屏上显示“Err”;INT3是主要的中断服务程序,用来对8253A发来的时钟脉冲进行计数,到达一定次数后,调用NEWTIME、CONVERS和LEDDISP模块。 更新时间缓冲区模块 更新显示缓冲区模块 显示模块 图2-3系统模块图 2.程序流程设计 程序运行的流程图见图2-4。 开始运行的时候,调用FORMAT初始化程序,给初始显示区和电平错误显示区赋初值,这样系统会在初始显示和电平有错误的时候,显示相应的字符;定义数值对应的显示字符,便于转换程序取到时间数值对应的字符;定义显示缓冲区的地址,便于系统运行的时候,把时间转换成的显示字符存到相应的单元中;定义时间缓冲区初值,系统运行后时间将从该处的值开始减小;定义系统初始状态,便于运行后LED灯工作于相应的状态。 接着对8253A、8255A和8259A进行初始化。 定义8253A使用通道2,工作于方式3,其计数初值为3C50,每隔20ms向8259A发出一个时钟脉冲;8255A的A、B、C三个端口均工作于输出方式;8259A工作于循环等待中断方式。 进入等待程序WATING后,首先打开中断,等待8259A发出的中断请求。 当无中断的时候,判断系统所处的状态,并调用相应的交通灯状态子程序,使LED灯相应的点亮。 当有中断的时候,则转到相应的中断服务程序,本系统主要为INT3程序。 INT3程序首先关闭中断,判断中断计数器DATA6单元所存储的中断次数是否达到20次,如果没有则直接调用INTR2程序,打开中断,并中断返回。 如果达到20次,则将中断计数器清零;再调用显示程序LEDDISP把当前时间显示出来;接着调用时间缓冲区更新程序NEWTIME将剩余时间减1;进入状态判断程序P1-P4,当相应状态的剩余时间未减到0的时候,调用CONV程序,更新显示缓冲区并中断返回,否则改变状态,并将新状态将持续的时间写入时间缓冲区,再调用CONV程序,更新显示缓冲区并中断返回。 3.重要代码分析 <1)中断服务程序INT3是本系统的程序最核心的子程序。 它用来计算收到8353A发来的中断次数,当次数达到20的时候,就自动将次数清零、调用LEDDISP显示程序、NEWTIME时间缓冲区更新程序、状态修改程序P1-P4和中断返回程序,完成数码显示屏上时间的更新和LED灯状态的改变。 以下是该程序的代码分析,并注有详细的功能说明。 //等待模块 交通灯状态模块存放着四个交通灯状态子程序ZT1、ZT2、ZT3、ZT4,供等待模块调用。 当某个子程序被调用时,便点亮相应的LED灯。 INT3: ;定义函数名称 CLI;处理中断时先关中断 PUSHAX;保存堆栈 PUSHDX MOVAL,DS: [DATA6];DATA6用于保存收到的中断次数,取当前中断次数 INCAL;将中断次数加1 MOVDS: [DATA6],AL;将加1后的中断次数写回DATA6存储单元 CMPAL,20H;将中断次数与20进行比较 JAENEXT;大于等于20时,清零,并转向状态判断程序,中断返回 JMPINTRE2;小于时直接中断返回 NEXT: MOVBYTEPTRDS: [DATA6],00H;将DATA6清零 CALLLEDDISP;调用显示程序,将显示缓冲区中的数字显示出来 CALLNEWTIME;调用时间缓冲区更新程序,将时间缓冲区DATA8,DATA9减1 P1: CMPBYTEPTRDS: [STATUS],01H;判断是否是状态一 JNZP2;如果不是状态一,则转P2CMPBYTEPTRDS: [DATA8],00H;如果是状态一,看时间否已经减到0 JNECONV;如果未减到0,则更新显示缓冲区,并中断返回 MOVBYTEPTRDS: [STATUS],02H;如果减到0,则设置系统为状态二 MOVBYTEPTRDS: [DATA9],15H;设定状态二时,路口的显示初始值 MOVBYTEPTRDS: [DATA8],15H JMPCONV ;P2-P4类似于P1,在此略去。 CONV: CALLCONVERS;把时间缓冲区中的时间转换到显示缓冲区中 INTRE2: MOVAL,20H;写8259控制口,并中断返回 MOVDX,INTPORT1 OUTDX,AL POPDX;弹出堆栈 POPAX STI;开中断 IRET;中断返回<2)交通灯状态程序也是本系统中一个非常重要的子程序。 它通过改变8255A的PB和PC口的值来控制特定LED灯的亮灭。 下面以状态1所对应的子程序为例,来分析一下如何用8255A来控制交通灯的亮灭。 ZT1: PUSHAX PUSHDX MOVAL,01010000B;设置2,4路口直行灯亮 MOVDX,BPort;BPort为8255A的PB口的地址 OUTDX,AL;更改PB口的值,从而改变LED灯显示的状态 MOVAL,00H;设置四个路口左转灯,右转灯全部关闭 MOVDX,CPort;CPort为8255A的PC口的地址 OUTDX,AL;更改PC口的值,从而改变LED灯显示的状态 POPDX POPAX RET ZT1F: ;状态一闪烁程序: 2、4路口直行灯闪烁PUSHAX PUSHDX MOVCX,12H;定义闪烁12次 ZT1Flash: MOVAL,00H;灯灭 MOVDX,BPort OUTDX,AL CALLDELAY2;短延时 MOVDX,BPort MOVAL,01010000B;灯亮 OUTDX,AL CALLDELAY2;短延时 LOOPZT1Flash;循环 POPDX POPAX JMPWATING;跳转到等待程序<3)显示子程序 LEDDISP: PUSHAX;将当前寄存器保存到堆栈中 PUSHBX PUSHCX PUSHDX MOVSI,DATA4;将显示缓冲区的首地址0520h存入SI MOVAL,90H;初始显示时DATA3EQU0518H MOVDX,CONTPORT;写8255控制口 OUTDX,ALMOVBYTEPTRDS: [DATA5],00H;DATA5单元中保存当前显示到第几位 LED1: CMPBYTEPTRDS: [DATA5],05H;看是否显示到第5位 JALED2;如果显示完5位后,返回 MOVBL,DS: [DATA5] MOVBH,0HMOVAL,CS: [BX+SI];将当前位的显示缓冲区的地址写入AL MOVDX,DATAPORT;写8255A数据口,以此改变显示值 OUTDX,AL ADDBYTEPTRDS: [DATA5],01H;显示下一位 JNZLED1 LED2: POPDX;弹出堆栈并返回 POPCX POPBX POPAX RET 五、系统实现 <一)软件开发与运行环境 本系统的代码使用8086汇编语言编写,所以代码编写环境可以使用任何文本编辑器。 如系统自带的记事本、DOS下的编辑工具EDIT和文本编辑工具UltraEdit等。 本系统使用了DVCC-8086JHN实验箱附带的DV88联机软件。 它可以读取其他编辑软件生成的MASM格式的汇编语言文件<*.ASM),也可以作为汇编代码的编辑、测试、运行环境。 在显示代码的时候,可以把常用的汇编指令显示为蓝色,数值显示为红色,注释显示为绿色,从而使论文清晰易读,并容易发现代码中的错误。 DV88联机软件同样可以作为系统的运行环境。 系统运行的时候需要将ASM源程序编译产生的OBJ文件传送到实验箱,由实验箱上的处理器和各个芯片负责执行。 <二)系统硬件环境 交通灯控制系统采用的DVCC-8086JHN通用微机原理及接口实验系统,集成了8253A计数/定时器芯片、8255A可编程并行接口芯片和8259A中断控制器芯片,并把大部分的引脚进行了封装,方便直接进行使用;并设有12个LED显示灯;系统分频器可以产生特定频率的时钟脉冲;固定的导线接口,方便使用导线把各芯片进行连接;并设有键盘,可以随时控制程序的运行,方便进行调试。 实验箱使用串行口连接线与PC机的串口相连,然后使用DV88联机软件与实验箱进行连接并传送运行的程序。 <三)系统运行步骤 系统的代码编写完毕的时候,便可以进行程序的联机调试了。 将实验箱的电源线连接好,使用串口通信线将实验箱上的串口与PC机上的串口相连。 将各个芯片和LED灯按照硬件连接设计图上的图示进行连接。 打开实验箱的电源,数码管显示屏上显示DVCC—86,提示实验箱初始化成功。 在PC机上打开DV88联机软件,调用编辑好的程序代码。 首先进行编译,系统会自动调用MASM程序对代码进行编译。 若没有提示错误,便可以点击连接按钮,调用LINK程序把编译生成的OBJ文件进行连接,生成EXE文件。 再点进调试按钮,把生成的可执行文件传送到实验箱,进行调试状态,此时屏幕会显示实验箱各个寄存器的值。 最后点击连续运行按钮,实验箱上的数码显示管和LED灯便会按照设计的要求进行工作。 在运行的过程中可以随时按实验箱上的RESET键,中断程序的执行,以便进行代码的修改或者结束系统的运行。 <四)系统测试结果 按照表1-1中交通灯四个状态所对应的秒数,在程序中为各个状态子程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红绿灯 控制系统