一、设计题目:十字路口交通灯控制器二、设计要求:通过对红绿黄LED发光二极管的控制,熟练掌握8255A可编程并行接口的编程方法。编写程序控制8255A可编程并行接口芯片,使实验台上的红、绿、黄发光二极管按照十字路口交通信号灯的燃灭规律发光。三、硬件方案:(一)设计原理:通过8255A并口来控制LED发光二极管的亮灭。A口控制红灯,B口控制黄灯,C口控制绿灯。输出为0则亮,输出为1则灭。用8253定时来控制变换时间。设有一个十字路口,1、3为南,北方向,2、4为东西方向,初始态为4个路口的红灯全亮。之后,1、3路口的绿灯亮,2、4路口的红灯亮,1、3路口方向通车。延迟30秒后,1、3路口的绿灯熄灭,而1,3路口的黄灯开始闪烁(1HZ)。闪烁5次后,1、3路口的红灯亮,同时2、4路口的绿灯亮,2、4路口方向开始通车。延迟30秒时间后,2、4路口的绿灯熄灭,而黄灯开始闪烁。闪烁5次后,再切换到1、3路口方向。之后,重复上述过程。要求使用可编程并行接口8255,8088CPU,双色灯,PC机等实现。(二).部分所使用的芯片极其原理:(1)8255的基本功能:Intel公司生产的可编程并行接口芯片8255A已广泛应用于实际工程中,例如8255A与A/D、D/A配合构成数据采集系统,通过8255A连接的两个或多个系统构成相互之间的通信,系统与外设之间通过8255A交换信息,等等,所有这些系统都将8255A用作为并行接口。8255A为一可编程的通用接口芯片。它有三个数据端口A、B、C,每个端口为8位,并均可设成输入和输出方式,但各个端口仍有差异:端口A(PA0~PA7):8位数据输出锁存/缓冲器,8位数据输入锁存器;端口B(PB0~PB7):8位数据I/O锁存/缓冲器,8位数据输入缓冲器;端口C(PC0~PC7):8位输出锁存/缓冲器,8位输入缓冲器(输入时没有锁存);在模式控制下这个端口又可以分成两个4位的端口,它们可单独用作为输出控制和状态输入。端口A、B、C又可组成两组端口(12位):A组和B组,参见图A.2。在每组中,端口A和端口B用作为数据端口,端口C用作为控制和状态联络线。在8255A中,除了这三个端口外,还有一个控制寄存器,用于控制8255A的工作方式。因此8255A共有4个端口寄存器,分别用A0和A1指定:A1=0,A0=0,表示访问端口A;A1=0,A0=1,表示访问端口B;A1=1,A0=0,表示访问端口C;A1=1,A0=1,表示访问控制寄存器;在本实验中使用的工作方式为方式0----基本输入输出:将端口信号线分成4组,分别由方式控制字的D3、D2、D1、D0控制其传送方向,当某位为1时,相应的端口数据线设置成输入方式;当某位为0时,相应的端口数据线设置成输出方式。例如,当方式控制字设置成10001010B时,端口A与端口C的低4位数据线设置成输出方式,端口B与端口C的高4位数据线设置成输入方式。特别注意,当将C口的低4位设置成同一传送方向时,则端口C可用作为独立的端口,因此,8255A提供了3个独立的8为端口。(2)8253的基本功能:含有3个独立的16位计数器,能够进行3个16位的独立计数。每一个计数器具有六种工作方式;能进行二进制/十进制计数(减法计数);计数频率为0~2MHz;可作计数器或定时器。其内部结构如图:8253支持二进制计数或十进制计数。二进制计数很容易理解,每来一个计数脉冲计数器的值减l。所谓十进制计数,是指BCD码计数,每个计数器可表示4位十进制数的BCD码,每来一个计数脉冲时,按照十进制数减1规律进行计数。例如,当前的计数值为10000lOl00000000(8500),来一个计数脉冲后,变为1000010010011001(8499)。8253的引脚信号与内部结构:8253为24脚,双列直插封装。和8255A一样,其内部有一个三态数据缓冲器,以保证未选中时内部数据线和系统数据总线是“脱开”的。三个计数器在使用时是独立的。每一个计数器对外有三个引脚:CLK为计数脉冲输入,GATE为门控信号(允许/禁止计数),OUT为输出信号。每一个计数器占用一个I/O端口地址,加上控制字口,一片8253共占用4个I/O端口地址。和8255A一样,8253也设置了两个用于端口寻址的引脚A1和A0。这两个信号与片选信号、CPu读/写信号相配合,实现对8253内部端口的操作。(3)8279的基本功能:8279是一种可编程的键盘、显示器接口芯片。8279芯片内部有专门用于存储显示数据的RAM区,共有16个字节,地址排列从00H到0FH。8279芯片的扫描线有译码扫描和编码扫描2种工作方式。当采用译码扫描方式时,8279只能送出显示RAM中前4个字节的内容,因而最多只能扫描4个LED数码管。当采用编码扫描方式时,扫描输出线SL3~SLO经过“4~16”译码后,可以选择16个LED数码管,这16个LED数码管显示的字符分别对应8279显示RAM区的00H~0FH中的内容。将8279的命令字设置成:读或写以后地址自动加1,左端输入。当SL3~SL0为0000时,显示数据输出线上输出为显示RAM区中的第1位(00H中的内容)。当SL3~SL0为0001时,显示数据输出为显示RAM区中的第2位(01H中的内容)。依次类推,当SL3~SL0为1111时,显示数据输出为显示RAM区中的第16位(0FH中的内容)。因而,8279送出的显示数据,与CPU写入8279内部16个字节显示RAM区的数值,存在着一一对应的关系。8279的显示方式又可分为左端入口和右端入口方式。显示数据只要写入显示RAM,则可由显示器显示出来,因此显示数据写入显示RAM的顺序,决定了显示的次序。左端入口方式即显示位置从显示器最左端1位(最高位)开始,以后显示的字符逐个向右顺序排列;右端入口方式即显示位置从显示器最右端1位(最低位)开始,已显示的字符逐个向左移位。但无论左右入口,后输入的总是显示在最右边。(4)8088的基本功能:8088CPU的一个基本总线周期由4个时钟周期(T1,T2,T3,T4)组成,时钟周期也称为时钟状态,即T1状态、T2状态、T3状态和T4状态。每一个时钟周期(时钟状态)内完成一些基本操作。例如:在T1状态,CPU往数据/地址多路复用总线上发出访问存储器或I/O端口的地址信息。在T2状态,CPU从总线上撤销地址,若为读周期发出“RD”控制信号,使数据/地址多路复用总线的低8位处于高阻抗状态,以便CPU有足够的时间从输出地址方式转变为输入数据方式,接着在T3~T4期间,CPU从总线上接收数据。若为写周期发出“WR”控制信号,由于输出数据和输出地址都是写总线过程,因而不需要缓冲时间,CPU在T2~T4期间把数据放到总线上。在T3状态,数据/地址分时复用线的低8位上出现由CPU输出的数据或为CPU从存储器或I/O端口读入的数据。在T4状态,8088完成数据传送,是控制信号变为无效,结束总线周期。8088的地址和数据线:AD7~AD0:8位地址/数据总线,分时复用、双向、三态。A15~A8:地址线,三态输出。A19/S6~A16/S3:地址/状态线,分时复用、输出、三态。在总线周期的T1状态作地址线用,A19~A16输出高4位地址。在总线周期的T2T4状态作状态线用,S6~S3输出状态信息,其中:S6恒为0。S5指示中断允许标志IF的当前状态,S5=1,表示当前允许可屏蔽中断请求,S5=0,则禁止一切可屏蔽中断。S4和S3用以指示是哪一个段寄存器正在使用,其编码和使用的段寄存器如下:00为ES,01为SS,10为CS,11为DS。(三).交通灯变化规律:本实验是模拟交通灯控制实验,是通过并行接口芯片8255和8088计算机的硬件连接,以及通过延时的方法,来实现十字路口交通灯的模拟控制,所以要先了解实际交通灯的变化规律。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1南北绿灯通车,东西红灯。过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然红灯。再转状态3,东西绿灯通车,南北红灯。过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然红灯,最后循环至状态1。本实验中模拟交通灯的发光二极管采用的是双色LED,双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加低电平时,黄灯亮,当两端都加高电平时,灯灭。(四).模拟交通灯控制电路的原理图:控制电路的基本原理图:整个控制电路的原理图为:四、软件方案:根据原理绘出主程序流程图:使4个路口的红灯全亮置8255控制字,使各端口均为输出口,且均工作于方式0读取PB口数据保存在BL中置8255控制字使B口为输入口8255初始化程序开始延时一段时间点亮1、3路口绿灯延时1、3路口黄灯闪烁八次四个红灯全亮点亮2、4路口绿灯延时熄灭2、4路口绿灯熄灭1、3路口绿灯熄灭2、4路口绿灯2、4路口黄灯闪烁八次四个红灯全亮延时实验程序:DATASEGMENT;初始化程序LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HD1EQU10HD2EQU200H;8255A端口AEBAEQU200H;8259端口地址EBEEQU203HCONTROLEQU20BH;8253端口地址COUNT0EQU208HCOUNT1EQU209HCOUNT2EQU20AHZ8279EQU222HD8279EQU220HLEDMODEQU00H;左边输入LEDFEQEQU38H;扫描频率DATAENDSCODESEGMENTASSUMECS:CODE,DSATACODESEGMENTASSUMECS:CODECONTDB0CONT1DB0CONT2DB0BSDDB0BADDB0BDADB0TEMPDB0START:PUSHCSPOPDSMOVDX,203H;8255A、B、C口设置为全输出MOVAL,80HOUTDX,ALMOVDX,200HMOVAL,00OUTDX,AL;清LEDMOVDX,200H;全红MOVAL,0F0HOUTDX,ALMOVBX,7FHCALLDLYBG:MOVAL,01011010B;南北绿,东西红OUTDX,ALMOVBX,D2CALLDLYMOVCX,03HXH1:ANDAL,0F5H;绿灭OUTDX,ALMOVBX,D1CALLDLYORAL,0AH;绿亮OUTDX,ALMOVBX,D1CALLDLYLOOPXH1MOVAL,0A0H;南北黄OUTDX,ALMOVBX,D1CALLDLYMOVBX,D1CALLDLYMOVAL,10100101B;南北红,东西绿OUTDX,ALMOVBX,D2CALLDLYMOVCX,03XH2:ANDAL,0FAH;绿灭OUTDX,ALMOVBX,D1CALLDLYMOVAL,05H;绿亮时OUTDX,ALMOVBX,D1CALLDLYLOOPXH2ORAL,50H;东西黄OUTDX,ALMOVBX,D1CALLDLYMOVBX,D1CALLDLYJMPBGDLYPROCNEARPUSHCXDDD:MOVCX,0FFFHCCC:LOOPCCCDECBXCMPBX,0JNEDDDPOPCXRETDLYENDPCODEENDSINT:STI;中断服务程序HLTJMPINTIR:START;数码管程序JMPCPCP:CMPDL,0JZST0CMPDL,1JZST1CMPDL,2JZST2CMPDL,3JZST3ST0:;东西红南北绿MOVAL,01011010BOUTD2,ALDECSIJNZXXC1DECDHMOVSI,100XXC1:DECCXCMPCX,0JNZZC0MOVCX,500ST1:DECDI;东西方向黄灯闪烁,南北绿灯CMPDI,0JNZHS1MOVAL,00001010B;东西灭,南北绿OUTD2