实验一 8255并行接口实验

并行接口单元由一片 8255 8255 8255 组成,其复位信号已连接到系统复位上,如下图所示。

在这里插入图片描述

上机实验

实验目的

  1. 学习利用并行接口芯片 8255 8255 8255 构成并行接口电路的基本方法;
  2. 熟悉掌握并行接口芯片 8255 8255 8255 的基本性能、硬件连接和初始化编程方法。

实验内容

编写一个基本输入输出程序,使 8255 8255 8255 A A A 口为输入, B B B 口为输出,完成拨动开关到数据灯的数据传输。

要求:数据灯的显示随开关动态改变。

实验原理

8255 内部结构

8255 8255 8255 可作为单片机与多种外围设备连接时的中间接口电路。

8255 8255 8255 作为 主机与外设的连接芯片

  • 必须提供 与主机连接 的 3 个 总线接口,即数据线、地址线、控制线接口;
  • 同时必须具有 与外设连接 的接口,即 A A A B B B C C C 口;
  • 由于 8255 8255 8255 可编程,所以必须具有 逻辑控制 部分;

因而 8255 8255 8255 内部结构分为 3 个部分:与CPU连接部分、与外设连接部分、控制部分

8255 8255 8255 的内部结构及引脚如图 3-1-1 所示, 8255 8255 8255 工作方式控制字和 C C C 口按位置位/复位控制字格式如图 3-1-2 和图 3-1-3 所示。

在这里插入图片描述
C P U CPU CPU 连接部分:

  • 数据总线 D B DB DB:编号为 D 0 D0 D0 D 7 D7 D7,用于 8255 8255 8255 C P U CPU CPU 传送 8 位数据。
  • 地址总线 A B AB AB:编号为 A 0 A0 A0 A 1 A1 A1,用于选择 A A A B B B C C C 口与控制寄存器。
  • 控制总线 C B CB CB:片选信号 C S CS CS、复位信号 R E S E T RESET RESET、写信号 W R WR WR、读信号 R D RD RD。当 C P U CPU CPU 要对 8255 8255 8255 进行读、写操作时,必须 先向 8255 8255 8255 发片选信号 选中 8255 8255 8255 芯片,然后发读信号或写信号 8255 8255 8255 进行读或写数据的操作。

在这里插入图片描述

A 0 A0 A0 A 1 A1 A1 接口是 8255 8255 8255 并行接口芯片的地址选择线,用来选择 8255 8255 8255 P A PA PA 口、 P B PB PB 口、 P C PC PC 口和控制寄存器。

  • A 1 = 0 A1=0 A1=0 A 0 = 0 A0=0 A0=0 时, P A PA PA 口被选择;
  • A 1 = 0 A1=0 A1=0 A 0 = 1 A0=1 A0=1 时, P B PB PB 口被选择;
  • A 1 = 1 A1=1 A1=1 A 0 = 0 A0=0 A0=0 时, P C PC PC 口被选择;
  • A 1 = 1 A1=1 A1=1 A 0 = 1 A0=1 A0=1 时,控制寄存器被选择。

这样, C P U CPU CPU 可以通过两根地址线来访问 8255 8255 8255 的四个端口

与外设连接部分:
A A A B B B C C C 口:编号分别为 P A 0 PA0 PA0 P A 7 PA7 PA7 P B 0 PB0 PB0 ~ P B 7 PB7 PB7 P C 0 PC0 PC0 ~ P C 7 PC7 PC7,用于 8255 8255 8255 向外设输入输出 8 位并行数据

控制器部分

8255 8255 8255 将 3 个通道分为两组,即 P A 0 PA0 PA0 P A 7 PA7 PA7 P C 4 PC4 PC4 P C 7 PC7 PC7 组成 A A A 组, P B 0 PB0 PB0 P B 7 PB7 PB7 P C 0 PC0 PC0 P C 3 PC3 PC3 组成 B B B 组。

  • A A A 组控制器:控制 A A A 口与上 C C C 口的输入与输出。
  • B B B 组控制器:控制 B B B 口与下 C C C 口的输入与输出。

8255 三种工作方式

8255 8255 8255 可编程外围接口芯片是 I n t e l Intel Intel 公司生产的通用并行 I / O I/O I/O 接口芯片,它具有 A A A B B B C C C 三个 8 位的并行输入/输出接口,用 + 5 V +5V +5V 单电源供电,能在以下三种方式下工作:

  • 方式 0 0 0基本输入/输出方式
  • 这种方式下, A A A B B B C C C 端口都可以设定为输入或输出,各端口的输入/输出可以构成 16 种组合。
  • 这种方式适用于 无条件或查询方式的数据传送
  • 方式 1 1 1选通输入/输出方式
  • 这种方式下, A A A B B B 端口可以作为数据端口, C C C 端口的一部分可以作为控制和状态信号端口。
  • 这种方式适用于 中断控制方式的数据传送
  • 方式 2 2 2双向传送方式
  • 这种方式下,只有 A A A 端口可以工作在这种方式,它可以实现双向的数据传送,即既能发送数据也能接收数据。 C C C 端口的一部分也用作控制和状态信号端口。
  • 这种方式 适用于中断控制方式,并通过时序控制数据的输入/输出

8255 控制字

在这里插入图片描述

8255 8255 8255 并行接口芯片的 工作方式控制字 来确定,控制字是由 C P U CPU CPU 写入 8255 8255 8255 的控制寄存器中的一个字节

控制字有两种格式,

  • 一种是用来 选择工作方式和 I/O 方向的方式选择控制字,写入的地址是 8255 8255 8255 控制口的地址 A 1 A 0 = 11 A1A0=11 A1A0=11)。
  • 另一种是用来 单独对端口 C C C 的每一位进行置位或复位操作的置位/复位控制字

在这里插入图片描述

实验步骤

(1)关闭实验箱电源。

(2)实验接线如图3-1-4 所示,按图连接实验线路。

(3)编写实验程序,经编译、链接无误后装入系统。

(4)运行程序,拨动开关,同时观察 L E D LED LED 显示,验证程序功能。

在这里插入图片描述

关于系统总线的 X A 1 XA1 XA1 X A 2 XA2 XA2 连接 8255 8255 8255 A 0 A0 A0 A 1 A1 A1

  • 系统总线的 X A 1 XA1 XA1 X A 2 XA2 XA2 接口是 系统总线的地址选择线,用来 选择系统总线上的不同设备或芯片
  • 8255 8255 8255 并行接口芯片的 A 0 A0 A0 A 1 A1 A1 接口是 8255 8255 8255地址选择线,用来 选择 8255 8255 8255 P A PA PA 口、 P B PB PB 口、 P C PC PC 口和控制寄存器

当使用 8255 8255 8255 并行接口芯片时,需要将系统总线的 X A 1 XA1 XA1 X A 2 XA2 XA2 接口与 8255 8255 8255 A 0 A0 A0 A 1 A1 A1 接口相连,从而 实现系统总线和 8255 8255 8255 并行接口芯片之间的地址匹配和数据传输

具体来说,当系统总线上的某个设备(如 C P U CPU CPU)要访问 8255 8255 8255 并行接口芯片时,它 需要在系统总线上发出一个地址信号,这个地址信号的:

  • 最低两位 X A 1 XA1 XA1 X A 2 XA2 XA2)用来确定要访问的是 8255 8255 8255 并行接口芯片的哪个端口( P A PA PA 口、 P B PB PB 口、 P C PC PC 口或控制寄存器),
  • 而其他位用来确定要访问的是哪个 8255 8255 8255 并行接口芯片(因为可能有多个 8255 8255 8255 并行接口芯片连接在系统总线上)。

这时,系统总线上的 X A 1 XA1 XA1 X A 2 XA2 XA2 信号会传递给 8255 8255 8255 并行接口芯片的 A 0 A0 A0 A 1 A1 A1 接口,从而使得 8255 8255 8255 并行接口芯片能够识别出自己是否被选中,以及被选中后要访问的是哪个端口。

【举个例子】

	EQU CONTROL 0646H
	
	MOV AL,090H    ;方式字    
	MOV DX,CONTROL ;找到8255控制口的地址
    OUT DX,AL      ;方式字送控制口
  • 首先,MOV AL,090H 这条指令是将 090H 这个方式字存入 A L AL AL 寄存器中,这个方式字是用来设置 8255 8255 8255 的工作方式的。
  • 然后,MOV DX,CONTROL 这条指令是将 CONTROL 这个常量存入 D X DX DX 寄存器中,这个常量是 8255 8255 8255 的控制寄存器的地址,本实验中它是 0646H
  • 最后,OUT DX,AL 这条指令是将 A L AL AL 寄存器中的数据(即 090H)送到 D X DX DX 寄存器中的地址(即 0646H)对应的 I / O I/O I/O 设备(即 8255 8255 8255)上。

那么,OUT DX,AL 这条指令是怎么实现的呢?

  • 首先, C P U CPU CPU 会将 D X DX DX 寄存器中的内容(即 0646H)送到地址总线上,同时将 A L AL AL 寄存器中的内容(即 090H)送到数据总线上。
  • 然后,系统总线的译码器来识别这个 I / O I/O I/O 地址(0646H),并产生相应的信号来选择相应的 I / O I/O I/O 设备。
  • 按照 8255 8255 8255 标准配置,这里当系统总线上发出地址信号时,译码器会根据地址信号的高位来产生一个 C S CS CS 信号,用来选择哪一个 8255 8255 8255;同时,地址信号的低两位会直接作为 XA1=1XA2=1 的信号,用来选择控制寄存器。

【WARNING】

  • 这里 0646 H 0646H 0646H 的低两位是 X A 1 = 0 XA1=0 XA1=0 X A 2 = 1 XA2=1 XA2=1,这样会使 A 0 = 0 A0=0 A0=0 A 1 = 1 A1=1 A1=1,导致选通的是 P B PB PB 而不是控制端口,使得控制字传输到 B B B 口而非控制端口,这就会出错;
  • 可是实验指导书和实验结果都证明是没错的,可能的原因,我猜是因为唐都实验箱的配置和 8255 8255 8255 并行接口芯片的标准配置不同。唐都实验箱可能对 8255 8255 8255 并行接口芯片进行了一些修改,使得它的控制寄存器的地址不是 0646H,而是其他的地址(最低两位是 1,满足 A1=1A0=1 的条件从而选通控制口)。

连线参考图(注,本实验中 C S CS CS 连接 I O Y 1 IOY1 IOY1):

在这里插入图片描述

实验代码

;8255并行接口实验----总结四句话
;1. 送控制口方式字
;2. A口输入
;3. B口输出   
;4. 注意输入输出中间加延迟

PORTA EQU 0640H ;input ,为什么是0640H,见代码解释2
PORTB EQU 0642H ;output
CONTROL EQU 0646H

CODE SEGMENT
ASSUME CS:CODE

START:  
	MOV AL,090H  ;方式字,见代码解释1
    MOV DX,CONTROL ;找到8255控制口的地址
    OUT DX,AL  ;方式字送控制口
P:          
	MOV DX,PORTA ;找到8255的输入口A口
	IN AL,DX ;读入A口信号

    ;调用子程序 起延时作用
    ;因为一个脉冲很短,但是灯的亮与不亮有时间间隔,需要延迟时间  !!!
	CALL DELAY

	MOV DX,PORTB ;找到8255的输出口B口
	OUT DX,AL ;送给B口信号让D0-D7控制数据灯的亮灭
	JMP P
              
DELAY:	
	PUSH CX
	MOV CX, 0F00H
AA2:	
	PUSH AX
	POP  AX
	LOOP AA2
	POP  CX
	RET

CODE ENDS
END START

关于代码的解释

  1. 由题目,基本输入输出程序,就是选择 8255 8255 8255 的方式 0 0 0 8255 8255 8255 A A A 口为输入, B B B 口为输出,因此方式字是 10000000 B 10000000B 10000000B 90 H 90H 90H
    拨动开关控制数据灯的显示,这里说明我们 读进来的是开关信号,输出到数据灯进行显示。所以 8255 8255 8255 A A A P A 0 − P A 7 PA0-PA7 PA0PA7 连接开关及 L E D LED LED 显示单元的 K 0 − K 7 K0-K7 K0K7 8255 8255 8255 B B B P B 0 − P B 7 PB0-PB7 PB0PB7 连接 D 0 − D 7 D0-D7 D0D7 ,如下图所示:

在这里插入图片描述
2. 由表3-1-1已经知道, 8255 8255 8255 实验控制端口地址,但是为什么端口地址是这个呢? 这与 C S CS CS 片选地址连接的 I O Y IOY IOY 有关

  • C S CS CS 连接 I O Y 0 IOY0 IOY0 ,那么地址从 0600 H 0600H 0600H 开始, P A PA PA 口端口地址是 0600 H 0600H 0600H P B PB PB 口端口地址是 0602 H 0602H 0602H P C PC PC 口端口地址是 0604 H 0604H 0604H C O N T R O L CONTROL CONTROL 控制口的端口地址是 0606 H 0606H 0606H
  • C S CS CS 连接 I O Y 1 IOY1 IOY1,那么地址从 0640 H 0640H 0640H 开始到 0646 H 0646H 0646H,就是本实验中所采用的。
  • C S CS CS 连接 I O Y 2 IOY2 IOY2 ,那么地址从 0680 H 0680H 0680H 开始到 0686 H 0686H 0686H

根据下图中 系统总线的 I O Y 1 IOY1 IOY1 8255 8255 8255 单元的 C S CS CS 接线可知, P A PA PA 口端口地址为 0640 H 0640H 0640H P B PB PB 口端口地址为 0642 H 0642H 0642H C O N T R O L CONTROL CONTROL 控制口端口地址为 0606 H 0606H 0606H

在这里插入图片描述
3. 8255 8255 8255初始化,如下:

  • 方式字送控制口,程序段:
	MOV AL,090H  ;方式字
    MOV DX,CONTROL ;找到8255控制口的地址
    OUT DX,AL  ;方式字送控制口
  • 输入输出口,程序段:
	MOV DX,PORTA ;找到8255的输入口A口
	IN AL,DX ;读入A口信号
	
	CALL DELAY

	MOV DX,PORTB ;找到8255的输出口B口
	OUT DX,AL ;送给B口信号让D0-D7控制数据灯的亮灭
  1. 出入是对于接口而言,比如 IN从接口进来,方向是从接口 P O R T A PORTA PORTA 到内部的寄存器 A L AL AL 。汇编中 IN 语句的数据传送方向是从右到左,即 D X DX DX 传送到 A L AL AL
	MOV DX,PORTA ;找到8255的输入口A口
	IN AL,DX ;读入A口信号

OUT从接口出去,方向是从内部的寄存器 A L AL AL 到外部接口 P O R T B PORTB PORTB。汇编中 OUT 语句的数据传送方向也是从右到左,即 A L AL AL 传送到 D X DX DX

	MOV DX,PORTB ;找到8255的输出口B口
	OUT DX,AL ;送给B口信号让D0-D7控制数据灯的亮灭
  1. 注意这里,如果端口地址是 8 b i t 8bit 8bit,可以直接输出到这个端口地址而不用先把端口地址送到 D X DX DX,但是 如果端口地址是 16 b i t 16bit 16bit,如本实验中 8255 8255 8255 的端口地址均为 16 b i t 16bit 16bit,那么必须先把端口地址送到 D X DX DX,再进行 INOUT 操作

下面举例一个 8 b i t 8bit 8bit 端口地址 60 H 60H 60H

	MOV AL,80H 	;1000 0000B,是LED7亮,其他灯灭
	OUT 60H,AL 	;A口地址为60H,且为输出口,把控制灯亮灭的信号送A口输出

本实验中,读开关信号,控制数据灯亮灭,所以 A A A 口连接的开关信号 K 0 − K 7 K0-K7 K0K7 就是输入口, B B B 口连接的数据灯亮灭的 D 0 − D 7 D0-D7 D0D7 就是输出口,假如 A A A 口读进来的开关信号全是高电平 11111111 B 1111 1111B 11111111B,即开关全打开,那么数据灯就全亮

扩展实验一

实验题目

在基础实验上增加如下功能:
若开关 K 7 K7 K7~ K 0 K0 K0 均为高电平,则程序退出。

实验代码

PORTA EQU 0640H ;input
PORTB EQU 0642H ;output
CONTROL EQU 0646H

CODE SEGMENT 'CODE'
	ASSUME CS:CODE
START:	
	MOV AL,90H ;方式字,A口输入B口输出
	MOV DX,CONTROL
	OUT DX,AL	;初始化8255控制字

BEGIN:	
	MOV DX,0640H ;A口输入开关信号
	IN AL,DX
	MOV DX,0642H ;B口输出数据灯亮灭信号
	OUT DX,AL

	CMP AL,0FFH	;1111 1111B ,K7-K0均为高电平,比较AL和0FFH相等时跳转到EXIT
	JZ  EXIT
	JMP BEGIN

EXIT:	
	MOV AL,00H	;关所有灯
	MOV DX,0642H
	OUT DX,AL
	
	MOV AH,4CH
	INT 21H
	
CODE ENDS
END START

关键代码段解读

	CMP AL,0FFH	;1111 1111B ,K7-K0均为高电平,比较AL和0FFH相等时跳转到EXIT
	JZ  EXIT
	JMP BEGIN
  • 这里展示了如何用汇编语言表示 if-else,通过 CMP 语句对 A L AL AL 0 F F H 0FFH 0FFH 进行比较,这条语句不会改变 A L AL AL 的值,但是把 A L AL AL 0 F F H 0FFH 0FFH 相减(比较是用相减结果是否为零来看是否相同的),如果结果为 0 0 0 会影响标志位 Z F = 1 ZF=1 ZF=1 Z F ZF ZF 是零标志位, Z F ZF ZF 的值为 1 1 1 时代表结果全零,反之不全为 0 0 0)。
  • JZ 则是 Z F = 1 ZF=1 ZF=1 时跳转,这里即 CMP 比较的两者相等时跳转到其后的 EXIT,否则继续 BEGIN 循环。因为 CMP 比较结果会影响标志位 Z F ZF ZF,比较的两者相等时, Z F = 1 ZF = 1 ZF=1JZ 跳转。

扩展实验二

实验题目

编写程序实现如下功能:
K 0 K0 K0 为高电平时,数据灯高 4 4 4 位亮;
K 0 K0 K0 为低电平时,数据灯低 4 4 4 位亮。

实验代码

PORTA EQU 0640H ;input
PORTB EQU 0642H ;output
CONTROL EQU 0646H

CODE SEGMENT 'CODE'
	ASSUME CS:CODE
	
START:	
	MOV AL,90H ;方式字,A口输入B口输出
	MOV DX,CONTROL
	OUT DX,AL	;初始化8255控制字

HIGH:	
	MOV DX,0640H
	IN AL,DX

	AND AL,00000001B	;只保留K0其他位归零
	CMP AL,00H	;K0为0时跳转到LOW 让低4位数据灯亮
	JZ LOW
	
	MOV AL,0F0H   ;K0为1时让高4位数据灯亮
	MOV DX,0642H
	OUT DX,AL
	JMP HIGH

LOW:	
	MOV AL,0FH	;K0为低电平,数据灯低4位亮
	MOV DX,0642H
	OUT DX,AL
	JMP HIGH

	MOV AH,4CH
	INT 21H

CODE ENDS
END START

关键代码解读

	AND AL,00000001B	;只保留K0其他位归零
	CMP AL,00H			;K0为0时跳转到LOW 让低4位数据灯亮
	JZ LOW
  • 这里只需要保留 K 0 K0 K0 位即可,由 K 0 K0 K0 位的值来控制数据灯的亮灭,因此让读进来的 A L AL AL 01 H 01H 01H 相与即可得到 K 0 K0 K0 的值。
  • CMP 比较 A L AL AL 00 H 00H 00H,如果相等,说明 K 0 K0 K0 0 0 0,否则 K 0 K0 K0 1 1 1
  • 再根据 K 0 K0 K0 高电平时点亮数据灯高 4 4 4 位,就送 B B B 0 F 0 H 0F0H 0F0H 信号; K 0 K0 K0 低电平时点亮数据灯低 4 4 4 位,就送 B B B 0 F H 0FH 0FH 信号。

扩展实验三

实验题目

编写程序实现如下功能:
K 1 K 0 = 00 K1K0=00 K1K0=00 时,数据灯全部熄灭;当 K 1 K 0 = 01 K1K0=01 K1K0=01 时,数据灯低 4 4 4 位亮;
K 1 K 0 = 10 K1K0=10 K1K0=10 时,数据灯高 4 4 4 位亮;当 K 1 K 0 = 11 K1K0=11 K1K0=11 时,数据灯全亮。

实验代码

PORTA EQU 0640H ;input
PORTB EQU 0642H ;output
CONTROL EQU 0646H

CODE SEGMENT 'CODE'
	ASSUME CS:CODE
	
START:	
	MOV AL,90H   ;方式字,A口输入B口输出
	MOV DX,CONTROL
	OUT DX,AL	 ;初始化8255控制字

A:	
	MOV DX,PORTA
	IN AL,DX

	AND AL,03H	;只保留K1K0其他位归零
	
	CMP AL,00H	;K1K0为00时跳转 
	JZ A00
	CMP AL,01H	;K1K0为01时跳转  
	JZ A01
	CMP AL,02H	;K1K0为10时跳转  
	JZ A10
	CMP AL,03H	;K1K0为11时跳转  
	JZ A11
	
A00:
	MOV AL,00H	;全熄灭
	MOV DX,PORTB
	OUT DX,AL
	JMP A
A01:	
	MOV AL,0FH	;低四位亮
	MOV DX,PORTB
	OUT DX,AL
	JMP A
A10:	
	MOV AL,0F0H	;高四位亮
	MOV DX,PORTB
	OUT DX,AL
	JMP A
A11:	
	MOV AL,0FFH	;全亮
	MOV DX,PORTB
	OUT DX,AL
	JMP A

B:	MOV AL,0FH
	MOV DX,PORTB
	OUT DX,AL
	JMP A

	MOV AH,4CH
	INT 21H
	
CODE ENDS
END START

关键代码解读

	AND AL,03H	;只保留K1K0其他位归零
	
	CMP AL,00H	;K1K0为00时跳转 
	JZ A00
	CMP AL,01H	;K1K0为01时跳转  
	JZ A01
	CMP AL,02H	;K1K0为10时跳转  
	JZ A10
	CMP AL,03H	;K1K0为11时跳转  
	JZ A11
  • 这里只需要保留 K 1 K 0 K1K0 K1K0 位即可,由 K 1 K 0 K1K0 K1K0 位的值来控制数据灯的亮灭,因此让读进来的 A L AL AL 03 H 03H 03H 相与即可得到 K 1 K 0 K1K0 K1K0 的值。
  • CMP 分别比较 A L AL AL 00 H 00H 00H 01 H 01H 01H 02 H 02H 02H 03 H 03H 03H,如果相等,就跳转到各自的部分去执行,送 B B B 口相应信号点亮相应的数据灯。
  • 35
    点赞
  • 301
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯水果茶!

谢谢你的水果茶啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值