课程设计交通灯

1. 交通灯课程设计简介

1.1 概述

交通灯设计课题简介

十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。当前,国内大多数城市正在采用“自动”红绿交通灯,它具有固定的“红灯—绿灯”转换间隔,并自动切换。它们一般由“通行与禁止时间控制显示、红黄绿三色信号灯和方向指示灯”三部分组成。在交通灯的通行与禁止时间控制显示中,通常要么南北两方向绿灯各5秒;要么根据交通规律,东西方向5秒,时间控制都是固定的。

1.2 设计要求及目的 目的:

通过实习进一步了解微型计算机的工作原理,熟悉微机基本输入、输出接口的组成及地址分析方法,了解各种接口芯片,熟悉试验机的软件与硬件系统的组成,掌握简单接口电路的设计原则,并完成有关接口程序的编制、运行和调试工作。 要求:

1)按照实习内容完成实习任务;

2)认真编写程序,并进行程序调试,在试验机上运行,完成接口程序的设计; 3)完成实验报告。

1.3 设计思想

设计中使用了8088/8086和8255A可编程并行接口实现了,对南北、东西方向交通的分别计时、分别控制,设计采用定时加中断控制的方式进行,对两个方向车辆的通行时间分别计时,可随意进行更改双向的通行时间。

1.交通灯采用红、黄、绿三色发光二极管构成交通灯亮灭规律;四个方向红灯亮(延时)南、北方向绿灯亮5秒;南、北方向绿灯灭,黄灯闪烁5秒;南、北方向红灯灭,东、西方向的绿灯亮5秒,黄灯闪烁5秒(延时),南、北方向绿灯亮5秒重复;

2.用数码管倒计时显示时间; 3.绘制电路原理图; 4.根据要求编程。

2. 硬件电路介绍

2.1 8255 并行接口芯片

8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。

8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。

2.2 8253可编程定时/计数接口芯片

intel8253是NMOS工艺制成的可编程计数器/定时器,有几种芯片型号,外形引脚及功能都是兼容的,只是工作的最高计数速率有所差异,例如8253(2.6MHz),8253-5(5MHz)

8253内部有三个计数器,分别称为计数器0、计数器1和计数器2,他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。

执行部件实际上是一个16位的减法计数器,

它的起始值就是初值寄存器的值,而初始值寄存器的值是通过程序设置的。输出锁存器的值是通过程序设置的。输出锁存器OL用来锁存计数执行部件CE的内容,从而使CPU可以对此进行读操作。顺便提一下,CR、CE和OL都是16位寄存器,但是也可以作8位寄存器来用。

2.3 8086微处理器

Intel 8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标)。资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。它提供64K 8 位元的输出输入(或32K 16 位元),以及固定的向量中断。大部分的指令只能够存取一个内存位址,所以其中一个操作数必须是一个寄存器。运算结果会储存在操作数中的一个寄存器。

Intel 8086有四个 内存区段(segment)寄存器,可以从索引寄存器来设定。区段寄存器可以让 CPU 利用特殊的方式存取1 MB内存。8086 把段地址左移 4 位然后把它加上偏移地址。大部分的人都认为这是一个很不好的设计,因为这样的结果是会让各分段有重叠。尽管这样对组合语言而言大部分被接受(也甚至有用),可以完全地控制分段,,使在编程中使用指针(如C编程语言) 变得困难。它导致指针的高效率表示变得困难,且有可能产生两个指向同一个地方的指针拥有不同的地址。更坏的是,这种方式产生要让内存扩充到大于 1 MB 的困难。而 8086 的寻址方式改变让内存扩充较有效率。

8086处理器的时钟频率介于4.77MHz(在原先的IBM PC频率)和10 MHz之间。8086 没有包含浮点指令部分(FPU),但是可以通过外接数学辅助处理器来增强浮点计算能力。

2.4 硬件连接

3. 软件设计介绍

3.1十字路口交通灯状态转换表:

3.2主程序流程图:

3.4共阴数码管码表:

3.5 8259初始化说明

MOV AL,13H MOV DX,INTPORT1 OUT DX,AL MOV AL,08H MOV DX,INTPORT2 OUT DX,AL MOV AL,09H OUT DX,AL MOV AL,0F7H OUT DX,AL

;写ICW1,需要ICW4、单片工作、边沿触发方式

;写ICW2,设置中断向量号

;写ICW4,普通全嵌套方式、采用缓冲方式 ;写OCW1,只开IR3中断请求,其余屏蔽

8253初始化说明

MOV DX,TCONTRO

MOV AL,10110100B;采用二进制计数方式,工作方式二,十六们计数,计数器二 OUT DX,AL

MOV DX,TCON2 MOV AL,0AH OUT DX,AL MOV AL,00H OUT DX,AL

;计数初值为10,即1S中断一次

8255初始化说明

MOV MOV OUT

AL,80H ;PA、PB、PC口都设定为输出工作方式 DX,IOCONPT DX,AL

3.6 具体代码及注释

CODE SEGMENT ASSUME CS:CODE

INTPORT1 EQU 0020H ;8259端口地址 INTPORT2 EQU 0021H ;8259端口地址

INTQ3 EQU INTREEUP3 ;8259 IRQ3中断程序 CONTPORT EQU 00DFH ;8255控制地址 DATAPORT EQU 00DEH ;8279数据口 TCONTRO EQU 004BH TCON2 EQU 004AH IOCONPT EQU 0073H IOCPT EQU 0072H IOBPT EQU 0071H

DATA0 EQU 0580H DATA1 EQU 0500H DATA2 EQU 0508H DATA3 EQU 0518H DATA4 EQU 0520H ORG 1000H

START: JMP Tint1 Tint1: CLI MOV AX,0H MOV DS,AX

MOV DX,CONTPORT MOV AL,00H OUT DX,AL MOV AL,2AH OUT DX,AL MOV AL,0d0h OUT DX,AL MOV AL,90h OUT DX,AL

MOV AL,80H MOV DX,IOCONPT OUT DX,AL

;8253 ;所用芯片端口地址初始化 ;8255 8279初始化及工作方式设定

;8255初始化设定

;PA、PB、PC口都设定为输出工作方式 ;

MOV DX,TCONTRO ;8253初始化及工作方式的设定

MOV AL,10110100B ;采用二进制计数方式,工作方式二,十六进制,计数器2 OUT DX,AL MOV DX,TCON2 表

MOV AL,13H ;8259初始化及工作方式的设定

MOV DX,INTPORT1 ;写ICW1,需要ICW4,单片工作,边沿触发方式 OUT DX,AL MOV AL,08H

MOV DX,INTPORT2 ;写ICW2,设置中断向量号 OUT DX,AL

MOV AL,09H ;写ICW4,普通全嵌套方式、采用缓冲方式 OUT DX,AL MOV OUT MOV OUT CALL CLI MOV MOV XOR REP MOV CALL MOV MOV CALL

AL,0AH ;计数初值为10,即0.1s×10=1s 中断一次 DX,AL AL,00H DX,AL

FORMAT ;调用FORMAT子程序建显示模型库 DI,DATA0 CX,08H AX,AX STOSW SI,DATA3 LEDDISP AX,0H DS,AX WRINTVER

;数码管显示初始图案“-------”

;调用子程序WRINTVER,设置中断地址向量

MOV AL,0F7H ;写OCW1,只开IR3中断请求,其余屏蔽 OUT DX,AL MOV BYTE PTR DS:[0601H],03H MOV BYTE PTR DS:[0602H],00H STI ;开中断 WATING: JMP WATING ;等待中断,无限循环 WRINTVER:MOV AX,0H ;设定中断向量表子程序 MOV ES,AX MOV DI,002CH

LEA

AX,INTQ3

;IRQ3端口

STOSW

MOV AX,CS STOSW

RET

;中断子程序INTREEUP3

INTREEUP3: CLI MOV AL,DS:[0601H] CALL CONVERS

MOV CALL CMP JNZ MOV

SI,DATA0 ;DATA0存放中断次数 LEDDISP

BYTE PTR DS:[0601H],03H NEXT DX,IOBPT

COMP: ;判断DS:[0602H]里面的值,并跟据结果来进行对应的转

CMP BYTE PTR DS:[0602H],00H ;状态为00,则跳转到SI0 JZ SI0

CMP BYTE PTR DS:[0602H],01H ;状态为01,则跳转到SI1 JZ SI1

CMP BYTE PTR DS:[0602H],02H ;状态为10,则跳转到SI2 JZ SI2

CMP BYTE PTR DS:[0602H],03H ;状态为11,则跳转到SI3 JZ SI3

SI0: MOV AL,22H ;状态00,南北红灯亮,东西绿灯亮 ADD BYTE PTR DS:[0602H],01H JMP PUT ;调用显示子程序

SI1: MOV AL,21H ;状态01,南北绿灯亮,东西黄灯亮 ADD BYTE PTR DS:[0602H],01H JMP PUT ;调用显示子程序

SI2: MOV AL,14H ;状态10,南北绿灯亮,东西红灯亮 ADD BYTE PTR DS:[0602H],01H JMP PUT ;调用显示子程序

SI3: MOV AL,0CH ;状态11,南北黄灯亮,东西红灯亮 MOV BYTE PTR DS:[0602H],00H JMP PUT ;调用显示子程序 PUT:

MOV DX,IOBPT ;输出当前状态,显示红黄绿灯 OUT DX,AL NEXT: MOV AL,20H MOV DX,INTPORT1 OUT DX,AL SUB BYTE PTR DS:[0601H],01H ;计数次数减1

CMP BYTE PTR DS:[0601H],00H

JZ INTRE1 ;时间为0,则跳转到INTRE1,置位为5 JMP EX CONVERS: MOV BH,0H AND AL,0FH MOV BL,AL MOV AL,CS:[BX+DATA2] MOV BX,DATA0 MOV DS:[BX],AL RET

INTRE1: ;时间置位为5s MOV BYTE PTR DS:[0601H],05H

EX: ;中断结束控制方式OCW2,普通中断结束方式

MOV MOV OUT STI IRET

AL,20H

DX,INTPORT1 DX,AL

LEDDISP: ;显示子程序,从左到右一次送数,显示-------- MOV AL,90H MOV DX,CONTPORT OUT DX,AL MOV BYTE PTR DS:[0600H],00 LED1: CMP BYTE PTR DS:[0600H],07H JA LED2 MOV BL,DS:[0600H] MOV BH,0H MOV AL,CS:[BX+SI] MOV DX,DATAPORT OUT DX,AL ADD BYTE PTR DS:[0600H],01H JNZ LED1 LED2: RET

FORMAT: MOV BX,0;格式化内存,将数码管将要显示的字符的编码写入内存

MOV WORD PTR DS:[BX+0500H],5050H ;DATA1 rr ADD BX,2

MOV WORD PTR DS:[BX+0500H],0079H ;E

MOV WORD PTR DS:[BX+0500H],0000H;全熄 ADD BX,2 MOV WORD PTR DS:[BX+0500H],0000H;全熄 ADD BX,2 MOV WORD PTR DS:[BX+0500H],063FH;DATA2 0 1 ADD BX,2 MOV WORD PTR DS:[BX+0500H],4F5BH; 2 3

ADD BX,2

MOV WORD PTR DS:[BX+0500H],6D66H; 4 5

ADD BX,2

MOV WORD PTR DS:[BX+0500H],077DH; 6 7

ADD BX,2

MOV WORD PTR DS:[BX+0500H],6F7FH; 8 9

ADD BX,2

MOV WORD PTR DS:[BX+0500H],7C77H; A B

ADD BX,2

MOV WORD PTR DS:[BX+0500H],5E39H; C D

ADD BX,2

MOV WORD PTR DS:[BX+0500H],7179H; E F

ADD BX,2

MOV WORD PTR DS:[BX+0500H],4040H; - -

ADD BX,2

MOV WORD PTR DS:[BX+0500H],4040H; - -

ADD BX,2

MOV WORD PTR DS:[BX+0500H],4040H; - -

ADD BX,2

MOV WORD PTR DS:[BX+0500H],4040H; - -

ADD BX,2

RET

CODE ENDS

END START

4. 运行结果展示

交通灯初始化,数码管显示--------

交通灯运行

5. 课程设计心得体会

1)微机原理是一门很有趣的课程,任何一个计算机系统都是一个复杂的整体,学习计算机原理是要涉及到整体的每一部分。讨论某一部分原理时有要涉及到其它部分的工作原理。这样一来,不仅不能在短时间内较深入理解计算机的工作原理,而且也很难孤立地理解某一部分的工作原理。所以,在循序渐进的课堂教学过程中,我总是处于“学习了一些新知识,弄清楚一些原来保留的问题,又出现了一些新问题”的循环中,知道课程结束时,才把保留的问题基本搞清楚。

2)此次实习可以说是获益匪浅。通过查阅了很多资料,了解了许多汇编程序的思想,扩展了自己的视野,不再仅仅局限于书本中几条简短的程序,而且更重要的是明白写程序的态度:仔细谨慎,精益求精。在程序中添加了黄灯闪烁,更加醒目。另外加入能够实现各路口绿灯显示时间不同,适应在主干道和支线路口中使用。在系统加电调试中,针对一些问题,熟练掌握了根据原理分步测试,将错误之处缩小的最小范围内。

3)而且在设计中,把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。

4)之前学习微机原理,汇编语言这两门课时,我都只是在emu8086上面编译,调制,运行,只是普通的编程,但是,这次课程设计是在dvcc上面

进行编译,调试,与解调。更接近于实际一些。期间遇到了一些问题,如端口的选择,obj文件找不到,但是通过杨老师的耐心讲解与自己的探索,终于找到了解决的办法。发现问题独立思考解决问题,这是在科学探索里面最基本的机制。

5)另一个我觉得比较重要的问题就是时序的问题,在学习微机原理与接口技术这门课的时候,因为课堂上只是对基本知识进行讲解,因此对实践中非常重檐的时序就没进行过多的提及。但是,其实,时序是非常重要的,这一点,在我对硬件进行调试的时候才逐渐的发觉。

6)通过本次课程设计,我对汇编语言也获得了更深层次的理解。汇编语言是一个最基础最古老的计算机语言。语言总是越基础越重要,在重大的编程

项目中应用最广泛。就我的个人理解,汇编是对寄存的地址以及数据单元进

行最直接的修改。而在某些时候,这种方法是最有效,最可靠的。比如,在当今的战争中,首先就是运用这方面的知识来修改地方的系统程序。让地方的卫星偏离轨道,从而不能发现目标。其威力可见一斑。

然而,事物总有两面性,有优点自然缺点也不少。其中,最重要的一点就是,汇编语言很复杂,对某个数据进行修改时,本来很简单的一个操作会用比较烦琐的语言来解决,而这些语言本身在执行和操作的过程中,占有大量的时间和成本。在一些讲求效率的场合,并不可取。汇编语言对学习其他计算机起到一个比较、对照、参考的促进作用。学习事物总是从最简单基础的开始。那么学习高级语言也当然应当从汇编开始。学习汇编语言实际上是培养了学习计算机语言的能力和素养。个人认为,学习汇编语言对学习其他语言很有促进作用。


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn