在实际生活中,交通信号灯控制着交通的秩序安全。本微机原理课程设计就是模拟实际十字路口交通灯的运行规则,用汇编语言来设计交通信号灯。
本次设计主要是实现对十字路口交通信号灯的控制而进行的编程,用8255A的A口控制东西方向的交通灯,用8255A的B口控制南北方向的交通灯。当程序正常运行时,依次为东西方向的绿灯和南北方向的红灯亮,通过延时程序进行一段延时后,东西方向的绿灯灭后东西方向的黄灯闪3次,随后东西方向的红灯和南北方向的绿灯亮并进行延时,延时后,南北方向的黄灯闪3次,之后同理往复循环。用8255A的C口控制紧急情况时东西、南北方向的红、黄、绿灯的亮灭,通过读C口输入的数据并进行测试查询,从而对紧急情况进行及时处理。
十字路口交通信号灯设计充分利用了可编程的并行接口芯片8255A各引脚的功能,选定工作方式0,通过改变控制字来实现交通信号灯的状态转换。另外,通过调用延时子程序来实现交通信号灯某一状态的持续,调用循环子程序来实现对交通信号灯状态循环的控制,通过控制开关来实现紧急情况下各路口红灯全亮的功能。综合各部分功能来实现较为完善的程序,运行程序来模拟十字路口交通信号灯。
关键词:可编程的并行接口8255A,延时,循环,测试,
1 设计任务描述
1.1 设计目的
(1) 查阅可编程并行芯片8255或其他相关资料;
(2) 用简单的输入输出端口等硬件,配合延时和控制程序控制灯的亮灭。
1.2 设计要求
(1) 利用微机原理试用箱,采用两组红,黄,绿发光二极管来模拟A,B两路交差路口的信号控制;
(2) 按实际交通灯控制规程控制。
1.3 增加功能
(1) 延时程序。
(2) 中断程序。
(3) 当路口发生事故时,强行A,B路口红灯全亮。
2 设计思路
本次微机原理设计的题目是交通信号灯,它是通过对8255芯片和LED发光二极管的连接设置来模拟交通信号灯的控制,使红黄绿三色灯按照正常交通规则亮灭;并应用中断控制器8259对交通灯在发生事故情况下进行强制控制。
十字路口交通信号灯的工作原理是在正常情况下以8086/8088的CPU与8255芯片相连接来实现的。8255芯片包括四个口,即A口、B口、C口和控制口。通过对其控制端口写入控制字,来设定8255的工作方式,在本设计中,使8255工作于方式0,将A口和B口都设置为输出,C口设置成输入。其中A口控制南北方向的交通灯, B口控制东西方向的交通灯。当程序正常运行时,依次为东西方向的绿灯和南北方向的红灯亮,通过延时程序进行一段延时后,东西方向的绿灯灭后东西方向的黄灯闪3次,随后东西方向的红灯和南北方向的绿灯亮,延时后,南北方向的黄灯闪3次,之后同理进行循环。
当CPU在执行正常程序时,按动KK1通过8259向CPU发出中断请求,CPU先要关中断,把其正在执行的程序压到已定义好的堆栈段当中,将中断程序MIR7的偏移地址和段地址取出放在源变址当中,然后在开中断,执行中断程序,强制东西方向和南北方向的红灯全亮。利用8255的C口接收KK2的单次脉冲来进行还原。中断程序执行完后关中断,让压在堆栈段中的程序出栈,CPU继续执行出栈的程序。
3 设计原理流程图
交通灯工作流程图 中断服务程序流程图
4 主要器件及其简介
4.1 可编程的并行接口8255
4.1.1 8255的引线图
图4.1.1. 8255引脚图
其中主要引脚介绍如下:
1)与外部设备端相连的引脚
(1)PA0~PA7:为A端口的输入/输出引脚。
(2)PB0~PB7:为B端口的输入/输出引脚。
(3)PC0~PC7:为C端口的输入/输出引脚。
2)与CPU相连的引脚
(1)RESET:复位信号,低电平有效。当RESET信号来到时,所有内部寄存器都被清零,同时3个数据端口被自动设为输入端口。
(2)D7~D0:双向数据信号线,用来传送数据和控制字和系统数据总线相连。
(3):为片选信号线,只有当CS有效时,信号RD与信号WR才对8255有效。
(4):为写信号线,CPU通过OUT指令使其有效,与其他信号线一起实现对8255接口的写操作,将数据或状态信息从CPU中写入8255。
(5):为读出信号线,CPU通过IN指令使其有效,与其他信号线一起实现对8255接口的读操作,将数据或状态信息从8255中读到CPU。
(6)A0、A1:端口选择信号线,8255内部有3个数据端口和1个控制端口,共4个。
4.1.2 8255内部结构
图4.1.2 8255A的内部结构
1)数据总线缓冲器:这是一个双向三态的8位数据缓冲器,它是8255与微机系统数据总线的接口。输入输出的数据、CPU输出的控制字以及CPU输入的状态信息都是通过这个缓冲器传送的。
2)三个端口A,B和C:A端口包含一个8位数据输出锁存器和缓冲器,一个8位数据输入锁存器。B端口包含一个8位数据输入/输出锁存器和缓冲器,一个8位数据输入缓冲器。C端口包含一个8位数据输出锁存器和缓冲器,一个8位数据输入缓冲器(输入没有锁存器)。
3)A组和B组控制电路:这是两组根据CPU输出的控制字控制8255工作方式的电路,它们对于CPU而言,共用一个端口地址相同的控制字寄存器,接收CPU输出的一字节方式控制字或对C口按位复位字命令。方式控制字的高5位决定A组的工作方式,低3位决定B组的工作方式。对C口按位复位命令字可对C口的每一位实现置位或复位。A组控制电路控制A口和C口上半部,B组控制电路控制B口和C口下半部。
4)读写控制逻辑:用来控制把CPU输出的控制字或数据送至相应端口,也由它来控制把状态信息或输入数据通过相应的端口送到CPU。
4.1.3 8255的控制字
8255有三种工作方式:方式0、方式1、方式2。可以通过在控制端口中设置控制字来决定它的工作方式。8255有两个控制字分别控制分别是:方式选择控制字和端口C按位置置位/复位控制字。方式选择控制字的第7位总是1,而端口C按位置位/复位控制字的第7位总是0。所以第7位称为区分两个控制字的标志位。
1)方式选择控制字
图4.1.3 方式选择控制字
2)端口C按位置置位/复位控制字
图4.1.4 端口C按位置置位/复位控制字
4.1.48255的工作方式
8255的工作方式主要有工作方式0、工作方式1和工作方式2。其中端口A可以工作在三种方式中的任一种;端口B只能工作在方式0和方式1;端口C通常作为控制信号使用,配合端口A和端口B的工作。在模拟流水线控制的设计中只用到了工作方式0,如表4.1所示。
表4.1 8255在方式0下的输入输出组合
序号 | 控制字 | A口 | C口上半部 | B口 | C口下半部 |
1 | 80H | 出 | 出 | 出 | 出 |
2 | 81H | 出 | 出 | 出 | 入 |
3 | 82H | 出 | 出 | 入 | 出 |
4 | 83H | 出 | 出 | 入 | 入 |
5 | 88H | 出 | 入 | 出 | 出 |
6 | H | 出 | 入 | 出 | 入 |
7 | 8AH | 出 | 入 | 入 | 出 |
8 | 8BH | 出 | 入 | 入 | 入 |
9 | 90H | 入 | 出 | 出 | 出 |
10 | 91H | 入 | 出 | 出 | 入 |
11 | 92H | 入 | 出 | 入 | 出 |
12 | 93H | 入 | 出 | 入 | 入 |
13 | 98H | 入 | 入 | 出 | 出 |
14 | 99H | 入 | 入 | 出 | 入 |
15 | 9AH | 入 | 入 | 入 | 出 |
16 | 9BH | 入 | 入 | 入 | 入 |
工作方式1,既选通输入输出方式。在这种方式下,A口和B口仍作为数据的输出口和输入口,同时还要利用C口的某些位作为控制和状态信号。
工作方式2,又称双向输入输出方式。这种方式只有8255的口A才有。在A口工作于双向输入输出方式时,要利用C口的5条线才能实现。因此,B口只能工作在工作方式0或工作方式1,而C口剩下的3条线可以作为输入输出线使用或B口方式1下的控制线。
4.2 中断控制器8259
4.2.1 8259的引线图
图4.2.1. 8255引脚图
1)中断控制器8259外部共有28个引脚:
D0-D7是数据线,是片选端,是写入端,是读出端。
14脚接地,28脚接+5V电源。
CAS0-CAS2是级联控制线。
IR0-IR7为中断请求输入端。
是中断响应输入信号。
INT为8259的中断请求输出信号,可以直接接到CPU的INTR输入端。
2)中断控制器8259内部
中断控制器内部有组成部分:
1数据总线缓冲器
2读写逻辑
3级联缓冲器比较器
4控制逻辑
5中断屏蔽寄存器(IMR)
6中断请求寄存器(IRR)
7优先级分析器(PR)
8⑧中断服务寄存器。
4.2.2 8259的内部控制字
8259工作之前必须通过CPU来命令它。CPU命令分为两大类:一类是初始化命令字(ICW),主要是为了让8259处于初始化状态;另一类是操作命令字(OCW),使初始化的8259去执行具体的某种操作方式。
1)初始化命令字
①初始化命令字ICW1
②初始化命令字ICW2
8086/88模式下,仅用ICW2提供不同中断源的中断向量码。当中断响应时,根据中断向量表获得入口地址。
③初始化命令字ICW3
该命令字用于多片8259的级联。
④初始化命令字ICW4
0 | 0 | 0 | SFNM | BUF | M/S | AEOI | PM |
1:8086/88模式
0:8080/85模式
1:自动EOI
0:非自动结束
0X:非缓冲方法
10:缓冲方式/从属片
11:缓冲方式/主控片
1:特殊全嵌套方式
0:一般嵌套方式
2)操作命令字OCW
对8259初始化之后,该芯片就进入工作状态,准备好接收IR端进入的中断请求。
①操作命令字OCW1
它用于设置对8259中断的屏蔽操作。该八位的操作字的某一位为1时,它就屏蔽相对应的IR输入。
②操作命令字OCW2
该命令字用来设置优先级是否循环、循环的方式及中断结束的方式。
5源程序清单及注释
SSTACK SEGMENT STACK ;定义堆栈段
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,SS:SSTACK
START:
MOV AL,H
MOV DX,06H
OUT DX,AL ;将8255控制字设置为10001001
;A、B口输出 C口输入 工作方式0
PUSH DS
MOV AX,0000H
MOV AX,OFFSET MIR7 ;取中断入口地址
MOV SI,003CH ;中断矢量地址
MOV [SI],AX ;填IRQ7的偏移矢量
MOV AX,CS ;段地址
MOV SI,003EH
MOV [SI] , AX ;填IRQ7的段地址矢
CLI
POP DS
;初始化8259
MOV AL,13H
OUT 20H,AL ;写ICW1 (需要ICW4,单片使用,边沿触发)
MOV AL,08H
OUT 21H,AL ;写ICW2
MOV AL,01H
OUT 21H,AL ;写ICW4(从片,非自动EOI,8086/8088)
MOV AL,7FH
OUT 21H,AL ;写OCW1 开放IR7
STI ;将1赋给IF,开中断
RED: MOV AL,22H
MOV DX,00H
OUT DX,AL ;南北方向红灯亮
MOV DX,02H
OUT DX,AL ;东西方向红灯亮
CALL DELAY ;调用延时程序DELAY
NORMAL: STI
MOV AL,88H
MOV DX,02H
OUT DX,AL ;东西方向绿灯亮
MOV AL,22H
MOV DX,00H
OUT DX,AL ;南北方向红灯亮
CALL DELAY ;调用延时程序DELAY
MOV AL,00H
MOV DX,02H
OUT DX,AL ;东西方向绿灯灭
CALL DELAY1 ;调用延时程序DELAY1
MOV CX,0005H ;将黄灯闪烁次数设为5
RECALL1:MOV AL,44H
MOV DX,02H
OUT DX,AL ;东西方向黄灯亮
CALL DELAY2
XOR AL,AL
OUT DX,AL ;东西方向黄灯灭
CALL DELAY2 ;调用延时程序DELAY2
LOOP RECALL1
MOV AL,88H
MOV DX,00H
OUT DX,AL ;南北方向绿灯亮
MOV AL,22H
MOV DX,02H
OUT DX,AL ;东西方向红灯亮
CALL DELAY
CALL DELAY ;两次调用延时程序DELAY,南北方向设为主干道
MOV AL,00H
MOV DX,00H
OUT DX,AL ;南北方向绿灯灭
CALL DELAY1 ;调用延时程序DELAY1
MOV CX,0005H ;将黄灯闪烁次数设为5
RECALL2:MOV AL,44H
MOV DX,00H
OUT DX,AL ;南北方向黄灯亮
CALL DELAY2 ;调用延时程序DELAY2
XOR AL,AL
OUT DX,AL ;南北方向黄灯灭
CALL DELAY2 ;调用延时程序DELAY2
LOOP RECALL2
JMP NORMAL ;无条件跳转到NORMAL,实现循环
MIR7: STI
PUSH DS
PUSH AX
MOV AL,22H
MOV DX,00H
OUT DX,AL ;事故发生时强制南北方向红灯亮
MOV DX,02H
OUT DX,AL ;事故发生时强制东西方向红灯亮
NEXT: MOV DX, 04H
IN AL, DX
TEST AL,01H
JZ NEXT
MOV AL,20H ;OCW2 关中断
OUT 20H,AL
POP AX
POP DX
STI ;开中断
IRET ;中断返回
DELAY: PUSH CX ;延时程序DELAY
MOV BX,008FH
T1:MOV CX,1000H
T2:NOP
NOP
LOOP T2
DEC BX
CMP BX,0000H
JNZ T1
POP CX
RET
DELAY1: PUSH CX ;延时程序DELAY1
MOV CX,0FFFFH
T3:NOP
NOP
LOOP T3
POP CX
RET
DELAY2: PUSH CX ;延时程序DELAY2
MOV CX,0F900H
T4:PUSH AX
POP AX
LOOP T4
POP CX
RET
CODE ENDS
END START
6 实际接线图
设计总结
短短一周的微机原理课程设计已经过去了。虽然时间短暂,但我学到了很多东西使我更加深刻的理解了我所学的知识,并且能在实际中应用他们,也使我更深的理解了什么是一分耕耘,一分收获!
在课程设计以前,可以说我对微机原理似懂非懂,有的时候拿来一个完整的程序都不能完全理解。而现在,我已经完全掌握了以前老师所讲的芯片的主要功能和使用方法。并能用自己的思路设计出想要的程序,这么大的反差就是源于此次课程设计。可以这么说,此次课程设计使我获益匪浅!
一分耕耘,一分收获,没有认真的学习,当然不会掌握,没有认真了解芯片的功能,又如何在具体应用中发挥他们应有的作用呢?在课堂上,王老师的耐心细致地讲解使我掌握了这次设计中所选用的最重要芯片8255的主要功能。在课程设计开始时,我首先对正常情况下的交通灯控制进行了编程。对其控制字的编写,根据程序的实际需要,我将10001001赋值给8255控制口,对其工作方式进行了设定。根据实际交通灯的亮灭情况,我对8255进行了相关的编程。为了使交通灯了亮灭情况跟接近实际,我利用延时程序通过对其中参数的设定,完成了交通灯的控制及显示。出于实际情况考虑,我将南北方向设为主干道。根据老师的提示,课程设计的扩展我考虑的是对于紧急事故是需要对交通灯进行强制控制,而要实现这个功能,可以选用中断控制器8259,因此我又对8259进行了相关编程控制。本来以为再课堂上学习的知识已经足够用,可在编写程序的时候才发现自己所学的东西掌握的很不扎实,经常在编写程序时候漏掉一些细节,导致在程序运行时候出现了很多低级错误,多亏同组同学的检查及帮助,我才顺利完成了设计程序的编写。
在调试过程中,虽然对程序已经十分熟悉,但还是出现了很多问题,首先是加载不成功。经过修改,其中因为马虎出现的小问题,程序终于通过了编译、链接、加载,但当运行时却怎么都无法显示预期的效果。我百般思索,反复检查,都没有发现错误。上午上机时间都快结束了,我还是没有找出原因,焦急的我根本没有心思离开。这是组长过来帮我修改我的程序,对程序进行逐条分析,并将我程序出现的问题缩小的最小,最后终于发现由于是我粗心,把一根线给接错了,导致不能出现应有的效果。再有就是延迟的时间,我自己设定的时间过于短,使黄灯的闪烁频率太快,通过对参数的修改,程序在运行后终于达到了我预期的效果。亲自编写了一个稍微长一点的程序之后,才知道编一个程序真的很不容易,但在同时不管是在自己的知识掌握程度上,还是在对自己耐心的考验上,我自己都有很大的收获!
答辩的时候我是第一个,不知道老师会问些什么,因此做了一些必要的准备工作。但是心里多少还是有些紧张。答辩在我看来应该是很轻松的事情,可谁想却成了最糟糕的环节,老师的提问让我不知道如何回答,自己的紧张情绪也暴露出了我自己的知识很不扎实。明明很简单的问题当时大脑确是一片空白,有些答非所问,在问我最基本的端口输入输出时,竟然说反了,还有就是关于整个程序的执行过程,自己做出来的程序自己却不能跟老师解答。让我经历了上大学以来最失败的答辩,不过通过答辩我也认识到了自己的很多不足,知道了自己还应该在考试前好好复习一下所学的知识,确保自己在考试时候出现类似的问题。
课程设计过去了。在这里我要感谢所有在课程设计中帮助过我的王老师,以及我们班的同学们,没有你们的帮助,我不能这么顺利地完成我的课程设计,谢谢你们在我程序编写及在调试过程中给予我的关心与帮助!而对与我自己,不仅学习了相关的微机原理知识,也从中明白了许多道理,更重要的是在课程设计中发现了自己存在的不足,激励我在以后的学习中更加的努力。实践,让我更加多的掌握所学的知识,运用所学的知识。
参考文献
[1] 王庆利.微型计算机原理及应用.西安:西安电子科技大学出版社,2009.
[2] 朱玉春,王志军.微机原理及接口技术.大连:大连理工大学出版社,2004
[3] 贾金玲.微型计算机原理与接口.重庆:重庆大学出版社,2001.
[4] 陈金华.可编程序控制器应用技术.北京:电子工业出版社,1995.
[5] 胡学林.可编程序控制器教程(实训篇).北京:电子工业出版社,2004.
[6] 仇玉章,冯一兵..微计算机技术(第二版)实验与辅导教程.北京:清华大学
出版社,2003.
[7] 郑学坚,周斌,马力妮..微型计算机原理及应用实验指导(第二版).北京:清华大学出版社,2003.
设计小组评语
设计题目 | 十字路口交通灯设计 | ||
设计组编号 | 第八组 | 设计组组长 | 蔡 倩 |
设计组组员 | 评 语 | ||
蔡倩 | 作为本组组长,在设计中能认真负责的组织各组员投入到设计当中。并且能调动各组员的积极性,做到合理分工组织。在设计期间积极查找资料,在编程中勤于思考,具体设计中能起到模范带头作用,积极与组员合作解决程序调试中遇到的问题。 | ||
赵阳 | 该组员在设计中能积极投入于其中,认真研究编写程序,遇到问题能积极发问,积极与组长讨论,解决设计中遇到的各种问题。团队精神可佳。尤其对程序调试中的细节问题能做到细致认真。 | ||
刘野 | 该同学是一个非常优秀的组员,做事认真,善于思考,有团队意识,能主动完成自己所担任的任务,实践知识较强,对程序的操作及其熟练。能极 积投入到设计当中。 | ||
岳海龙 | 作为组员,能紧跟集体步伐,刻苦努力的研究程序,认真操作演练和研究接线图。在调试程序中对自己遇到的不明白知识能做到积极攻破,在老师和组长的帮助下专研程序的每一个细节。 |