通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。
控制LED灯,按照十字路口红绿灯的原理亮灭显示:
(1) 东西方向车辆放行x秒钟。即东西方向的绿灯和南北方向的红灯同时点亮x秒钟。
( 2) x秒钟后,东西方向的绿灯熄灭,黄灯闪烁4次,以警示车辆将切换红绿灯。此时南北方向仍维持红灯点亮。
(3) 东西方向的黄灯闪烁4次后,转为南北方向放行x秒钟。即东西方向的红灯和南北方向的绿灯同时点亮x秒钟;
(4) 南北方向放行x秒钟后,转为南北方向的绿灯熄灭,黄灯闪烁4次,以警示将切换红绿灯。此时东西方向维持红灯点亮。
(5)南北方向的黄灯闪烁4次后,再转为东西方向车辆放行秒。如此循环重复。
(6)当出现紧急情况时将红灯设置为全亮,以限制路况,及时解决交通事故。
本次微机原理设计的题目是交通信号灯,它是通过对8255芯片和LED发光二极管的连接设置来模拟交通信号灯的控制,使红黄绿三色灯按照正常交通规则规律地亮灭。交通信号灯由8255芯片控制的,用发光二极管来模拟实际生活中的交通灯,当出现紧急情况时将红灯设置为全亮,以限制路况,及时解决交通事故;当出现交通高峰期时还可以延长信号灯控制的时间。
8255芯片包括四个口,即A口、B口、C口和一个控制口。通过对其控制端口赋予一定的控制字,来设定8255的工作方式,在本设计中,使8255工作于方式0,即基本输入输出方式,并将A口和B口都设置为输入,C口设置成输出。其中,A口与模拟紧急情况的开关连接,当发生紧急情况时将开关关合,红灯全亮,处理事故;当事故解除后,将开关断开,又恢复正常交通情况。B口控制黄灯的亮灭,黄灯闪烁时,红灯亮,绿灯全灭,闪烁的黄灯的位置与绿灯保持一致。C口控制红绿灯,红绿灯分东西南北四个方向,通过将控制字写入到控制口中,强制使与C口相连的LED显示管亮或灭,也就是模拟了实际情况中交通信号灯的控制。
4.1.1 8255的引线图
图4.1 8255引脚图
其中主要引脚介绍如下:
图4.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。
8255有三种工作方式:方式0、方式1、方式2。可以通过在控制端口中设置控制字来决定它的工作方式。8255有两个控制字分别控制分别是:方式选择控制字和端口C按位置置位/复位控制字。方式选择控制字的第7位总是1,而端口C按位置位/复位控制字的第7位总是0。所以第7位称为区分两个控制字的标志位。
1)方式选择控制字
图4.3 方式选择控制字
2)端口C按位置置位/复位控制字
图4.4 端口C按位置置位/复位控制字
8255的工作方式
8255的工作方式主要有工作方式0、工作方式1和工作方式2。其中端口A可以工作在三种方式中的任一种;端口B只能工作在方式0和方式1;端口C通常作为控制信号使用,配合端口A和端口B的工作。在模拟流水线控制的设计中只用到了工作方式0,如表4.1所示。
序号 |
控制字 |
A口 |
C口上半部 |
B口 |
C口下半部 |
1 |
80H |
出 |
出 |
出 |
出 |
2 |
81H |
出 |
出 |
出 |
入 |
3 |
82H |
出 |
出 |
入 |
出 |
4 |
83H |
出 |
出 |
入 |
入 |
5 |
88H |
出 |
入 |
出 |
出 |
6 |
89H |
出 |
入 |
出 |
入 |
7 |
8AH |
出 |
入 |
入 |
出 |
8 |
8BH |
出 |
入 |
入 |
入 |
9 |
90H |
入 |
出 |
出 |
出 |
10 |
91H |
入 |
出 |
出 |
入 |
11 |
92H |
入 |
出 |
入 |
出 |
12 |
93H |
入 |
出 |
入 |
入 |
13 |
98H |
入 |
入 |
出 |
出 |
14 |
99H |
入 |
入 |
出 |
入 |
15 |
9AH |
入 |
入 |
入 |
出 |
16 |
9BH |
入 |
入 |
入 |
入 |
表4.1 8255在方式0下的输入输出组合
工作方式0,又称为基本工作方式。在此方式下,可分别将A口的8条线,B口的8条线,C口高4位对应的4条线和C口的低四位对应的四条线定义为输入或输出。故它们的输入输出共有16种不同的组合。
工作方式1,既选通输入输出方式。在这种方式下,A口和B口仍作为数据的输出口和输入口,同时还要利用C口的某些位作为控制和状态信号。
工作方式2,又称双向输入输出方式。这种方式只有8255的口A才有。在A口工作于双向输入输出方式时,要利用C口的5条线才能实现。因此,B口只能工作在工作方式0或工作方式1,而C口剩下的3条线可以作为输入输出线使用或B口方式1下的控制线。
DATA SEGMENT ;数据段定义
XX DB 0
DATA ENDS ;数据段定义结束
SSTACK SEGMENT STACK ;堆栈段定义
DW 50 DUP(?)
SSTACK ENDS ;堆栈段定义结束
CODE SEGMENT ;代码段定义
ASSUME CS:CODE,DS:DATA,SS:SSTACK
START: MOV AX,DATA
MOV DS,AX
MOV DX,06C6H ;8255初始化:控制口地址送DX
MOV AL,90H ;工作方式选择,A入B出
OUT DX,AL ;控制字送入控制口
L1: MOV DX,06C4H ;C口地址送入DX
MOV AL,10100101B
OUT DX,AL ;24红灯亮,13绿灯亮
CALL DELAY2 ;红绿灯延时时间
CMP XX,1
JZ PAUSE ;检查是否有紧急情况
AND AL,10100000B
OUT DX,AL ;24红灯亮,熄灭绿灯
MOV CX,0004H ;设置循环次数,即黄灯闪的次数
L2: MOV DX,06C2H ;B口地址送入DX,控制黄灯
MOV AL,00000101B
OUT DX,AL ;13黄灯亮
CALL DELAY1 ;调用DELAY1
AND AL,00000000B
OUT DX,AL ;熄灭黄灯
CALL DELAY1 ;调用DELAY1
CMP XX,1
JZ PAUSE ;检查是否有紧急情况
LOOP L2
MOV DX,06C4H ;C口地址送入DX
MOV AL,01011010B ;13红灯亮,24绿灯亮
OUT DX,AL
CALL DELAY2
MOV CX,0004H ;设置循环次数,即黄灯闪的次数
L3: MOV DX,06C2H ;B口地址送入DX
MOV AL,00001010B
OUT DX,AL ;24黄灯亮
CALL DELAY1 ;调用DELAY1
AND AL,00000000B
OUT DX,AL ;熄灭黄灯
CALL DELAY1 ;调用DELAY1
CMP XX,1
JZ PAUSE ;检查是否有紧急情况
LOOP L3
PAUSE: MOV DX,06C0H ;A口地址送入DX
IN AL,DX ;读A口数据
TEST AL,80H ;测试最高位是否为1,最高位模拟紧急情况
;1为紧急情况,0为一般情况
JZ L1 ;为0紧急情况结束,红绿灯重新正常工作
MOV DX,06C4H ;C口地址送入DX
MOV AL,11110000B
OUT DX,AL ;紧急情况,红灯全亮
JMP PAUSE ;紧急情况时,红灯一直保持全亮
DELAY1 PROC NEAR ;DELAY1定义
PUSH CX
PUSH DX
PUSH AX ;压入堆栈,保存数据
MOV XX,0 ;为XX赋值0,只有在非紧急情况需要延时
MOV CX,8000H ;设置循环次数,控制延时时间
L4: MOV DX,06C0H ;A口地址送人DX
IN AL,DX ;读A口数据
TEST AL,80H ;测试最高位,检查是否有紧急情况
JZ L5 ;为0循环执行L4,有非0跳出程序返回,
;之后进入PAUSE检查是否有紧急情况
MOV XX,1 ;为XX赋值1,出现紧急情况
JMP L6 ;无条件转移到L6
L5: LOOP L4 ;循环执行L4
L6: POP AX
POP DX
POP CX ;弹出保存的数据
RET ;返回
DELAY1 ENDP ;DELAY1定义结束
DELAY2 PROC NEAR ;DELAY2定义
PUSH CX
PUSH DX
PUSH AX ;压入堆栈,保存数据
MOV CX,0010H
L7: CALL DELAY1 ;调用DELAY1
LOOP L7 ;循环执行L8
POP AX
POP DX
POP CX ;弹出保存的数据
RET ;返回
DELAY2 ENDP ;DELAY2定义结束
CODE ENDS ;代码段定义结束
END START ;程序结束