§ 6.1 接口的基本概念一、概述
1,接口 —— CPU与输入 /输出设备之间 协调动作的硬件电路。
2,接口的功能 (作用 )—— 起传送数据的 桥梁 作用。
① 地址译码 —— 以寻址某一外设,和指定的外设交换信息。
② 数据寄存和缓冲 —— 用以消除处理器与外设在“定时”或数据处理速度上的差异。
CPU I/O接口 外设
③ 信息转换 —— 因为计算机与外设的信息格式可能不同,以使两者相容;如正负逻辑转换,串 /并联间的转换,TTL电平与其他电平转换。
④提供 命令译码和状态信息 —— 以实现对外设的控制与监测。如设备,准备好,,数据缓冲器,空,。
握手联络信号 。
⑤ 定时控制 —— 提供时序控制功能,以满足外设在时序控制方面的要求。
3,一般组成 —— 由功能要求,可得接口电路的主要组成部分,即由,各种寄存器+控制电路 。
二、接口控制原理因为接口主要控制数据传送,所以接口控制即对数据传送的控制。
1,数据传送方式 —— CPU与外设的信息交换称为 通信,
基本的通信方式(即数据传送方式)有两种:
① 并行通信(并行数据传送) —— 数据的所有位同时发送。
如机器内部各部件之间都是并行传送。数据有多少位就要有同样数量的传送线。它速度快,
但线路多,只适用于 短距离传送 (小于 100英尺)
↑↑↑↑↑↑↑↑
D7D6D5D4D3D2D1D0
② 串行通信(串行数据传送) —— 数据一位一位的顺序传送。 如远程终端通信,远程计算机之间的通信,通常借用通信电路(如电话线)来传送数据。一般网的通信,网络上的数据流都是串行的。
串行通信只要一条数据传输线。 它线路少,但速度慢,控制设备复杂(需并 -串 -并转换),适用于 远距离通信 (大于 100英尺)。
由于一根线传送所有位,收发双方必须遵守统一的 通信规程(通信协议) 。串行通信中,有两种最基本的通信方式,同步通信 和 异步通信 。
在异步通信中,CPU与外设之间必须有两项规定:
字符格式和波特率。
D7D6D5D4D3D2D1D0→
ⅰ ) 字符格式 —— 每个串行数据由一个起始位 0+数据位( 5,6,7,8位) +[奇偶效验位 ]+停止位 1 组成?
称为一帧。
常用的两种格式:
LSB MSB
← 0 D0 D1 D2 D3 D4 D5 D6 奇偶 1
← 0 D0 D1 D2 D3 D4 D5 D6 D7 1
起始位 —— ∵ 空闲时,通信线路上视有逻辑,1”,
所以以,0”表示起始位。
数据位 —— 先发低位,后发高位 。数据可以是 5位,
6位,7位,8位,PC通信中常用 7位或 8位,取哪一种数据格式由软件决定。
常用一般通信格式
(字符通信)
一般微机中数据通信格式
奇偶校验位 —— 奇偶校验位主要用于纠错检测,即加上一位 1或 0,使数据中具有奇或偶数个,1”。
停止位 —— 最后发停止位,1”,以标志一帧传送结束,标志位可以是 1位,1.5位或 2位个,1”。
例如,字符通信,偶检验的格式:
如:‘ A’?7位 ASCII码为 41H
LSB MSB 偶校验
← 0 1 0 0 0 0 0 1 0 1
如:‘ 4’?7位 ASCII码为 34H
← 0 0 0 1 0 1 1 0 1 1

起始位 停止位
ⅱ ) 波特率 —— 即数据传送速率的规定,即每秒钟传送多少 bit。
例,数据传送的速率是 120字符 /秒,而通信的数据格式如上所述( 10个 bit位)。
则传送波特率:
10 * 120 = 1200 位 / 秒 = 1200 波特,即
1200b/ s
如以太网的最大传送速率为 100Mb/ s ;又如 Chinanet的通信速率为 9600b/ s~ 2Mb/ s。
2,CPU与外设数据传送控制方式(传送控制方式) —— I/O控制方式
1)程序直接控制传送方式 —— 由程序来控制主机和外设之间的数据交换。
根据外设的特点又可分为:
无条件传送方式 —— 又称同步方式在不需要查询外设的状态,即 已知外设已准备好或不忙时,可直接用 IN 或 OUT 指令与外设交换数据。此时接口简单,适用于 CPU 与外设同步工作的情况。
如实验中,基本 I/O实验,
用的是无条件传送方式;
但实际应用中使用较少。
查询传送方式(即条件传送) —— CPU 与外设不同步时,很难保证执行输 入 /输出 时,外设是准备好的,
在数据传送前,程序首先要测试外设的状态,只有在状态信息满足条件时,才能进行传送。所以接口中除正常的 数据 传送(数据端口)外,还必须传送 状态 信息(状态端口)。
查询方式,CPU 与外设信息的交换方式 —— 称为 应答方式,状态信息即,联络”信息 。接口处于被 动状态。
输入状态信息
Ready?
输入数据读状态
Busy?
输出数据
N Y
查询式输入流程 查询式输出流程
2) 程序中断传送方式
上述查询方式中,CPU要不断的查询外设的状态,未准备好则等待,不能做别的操作,
浪费了 CPU的时间。因为很多外设速度较慢,它们输 入 / 输出 一个数据速度很慢,在此过程中,
CPU可执行大量的指令,为了提高 CPU的效率,
可采用中断方式。
即由 CPU启动外设工作,然后执行主程序,
当外设准备好后,向 CPU发出中断请求,CPU暂停主程序的执行,转去中断处理服务,然后返回。
在何时交换数据,接口是主动的。
3) DMA方式 —— 直接存贮器存取传送方式
以上方式均需 CPU 参与 I /O 数据传送,即程序控制(即 IN,OUT 指令)传送。而 DMA方式的基本思想是在外设和存贮器之间开辟直接的数据交换通道。
由 DMA 硬件装置控制,直接由外设和内存之间传送数据,而不通过 CPU。通常用于高速外设、成批交换数据。
如 PC机中磁盘(软、硬)与内存交换数据,则使用了 8237 DMA控制器。
在实际的计算机系统中,以上几种数据传送方式都使用。实际应用中,几种方式均可使用。如 A /D 实验中:延迟等待(无条件传送)、查询、中断,若使用高速 A /D 也可用 DMA 方式直接将数据送内存。
三,CPU 与外设之间的接口信息
1,地址 — 经译码以选定不同的端口。
2、数据 — 8位,16位,32位数据。
3、状态 — 输入 / 输出设备的状态。
4、控制信息 — 由 CPU发出的控制信号,如启动或停止外设工作。
如输入设备是否准备好,输出设备是否空(是否忙)等注,状态、控制信息与数据是不同性质的信息,必须分别传送。通常数据占一个端口,状态或控制公用一个端口。
CPU I /O
地址数据状态控制
§ 6.2 输入输出指令和输入输出地址译码在进行输入 / 输出操作时,和存贮器相似,也要对
I/O进行寻址,也要完成两种选择:片选 — 选择 I/O
接口芯片,字选 — 选择该芯片中的某一寄存器(具体端口)。
CPU访问 I/O端口有两种基本寻址方式,存贮器映象方式和独立编址方式。
接口中被主机直接访问的一些寄存器常称之为 端口 。一个接口常有多个端口。
如数据口,状态口,命令口。
一,存贮器映象 I /O寻址方式
① I /O端口与存贮器公用 同一个地址空间 。如:
此时存贮器与 I /O的区别 存贮器 →
只是所占用的地址不同。
I /O →
② CPU对 I /O端口的输入 / 输出和对存贮器读 / 写都是用访问存贮器 传送 指令(如 MOV),而无需专用输入 /
输出指令。
③ 对 I /O访问的 控制信号,也是用对存贮器读 / 写控制信号。
如 MC6800微机,MCS— 51单片机就是采用存贮器映象方式。
前 32K
后 32K
二,I /O独立编址方式?I /O端口和内存单元 各自编址,其地址相同也无妨。
I /O端口的地址空间与存贮器 地址空间是独立的,分开的,即 I /O口地址不占用存贮器地址空间。
CPU对 I /O的输入 / 输出是用 专门的输入 / 输出指令,
而不能用存贮器传送( MOV)指令。
对 I /O访问的 控制信号 是用专门的 I /O控制信号( IOR,
IOW)。
如 8088 /8086,Z80等采用 I /O端口寻址方式。
64K
存储器
1K
I/ O
三、输入 /输出指令
1,直接端口寻址指令
IN ACC,PORT
OUT PORT,ACC
2,间接端口寻址指令
IN ACC,DX
OUT DX,ACC
* IN表示将一个字节或一个字的数据从输入端口传送到
AL或 AX中 ;OUT表示将一个字节或一个字的数据从 AL或
AX传送到输出端口中,
*直接端口寻址,端口地址由指令中的 8位立即数指定,
间接端口寻址端口地址由 DX内容确定,所以 直接寻址地址为 00H~0FFH,256个端口;间接端口寻址可寻址 64K个端口,即端口地址> 0FFH时,则应使用 DX间址 。
例,MOV AL,99H
OUT 63H,AL;将 99H传送到 63H端口 例例,MOV DX,260H
OUT DX,AL;将 AL中内容传送到
260H 端口四、对 I /O端口寻址的译码方法
译码目的?地址选择 (地址分配),必须进行 片选 和 字选 。通常采用两级译码方法,高位地址译码作为片选,以选择某一组端口(某一片 I /O)。 低位地址译码以选择片内寄存器
(即具体端口)。
PC机的 I /O端口地址译码只用 低 10位地址
( A0~A9) 。 210 = 1024 个口地址。
典型的译码电路?74LS138( 3:8译码器),
P193、图 5- 5。
例,PC机系统板的 I /O译码
138
AEN —— G1 y0 —— DMA控制器 8237 000~01FH
A9 —— G2B y1 —— 中断控制器 8259 020~03FH
A8 —— G2A y2 —— 定时 /计数器 8253 040~05FH
A7 —— C y3 —— 并行口 8255 060~07FH
A6 —— B y4 —— DMA页面寄存器 080~09FH
A5 —— A y5 —— NMI非屏蔽寄存器 0A0~0BFH
A9A8A7A6A5A4A3A2A1A0
0 0 0 0 0 X X X X X?000~ 01FH
0 0 1 1 1 X X X X X?0E0~ 0FFH
* 所有 I /O译码必须有 AEN( Address Enable 地址允许 ) 参与译码。 AEN=1,DMA控制三总线,进行 DMA传送。 AEN=0开启 I /O系统 。
* 部分译码,如 y0?DMA的 CS,地址 000~01FH,
而 A3~A0?DMA的 A3~A0端片内译码,而 A4并未参与译码,所以 地址有重叠 。
例,打印机译码
A3
A4
A5
A6 & 378H~37FH
A8 片选为高电平有效 CS
A9
A7 &
AEN
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 1 0 1 1 1 1 X X X?378H~ 37FH
例,彩色 /图形显示器控制器
138
A9 & G1
A8
AEN G2A y7 3D0H~3DFH
A5 G2B MC6845的 CS
A7 C
A6 B
A4 A
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 1 1 1 0 1 X X X X?3D0H~ 3DFH
以上译码电路仅为片选信号,低位地址由各芯片内部实现二次译码,以寻址具体寄存器(端口)。
I /O译码:
地址(理论上为 A15~A0,实践 PC为
A9~A0);
AEN参与 控制,AEN= 0开启译码器 ;
若地址有限,IOR /IOW 可参与译码控制以区分读 /写端口,如 P205,图 6— 4所示:
A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 0 1 1 1 1 1 X X X
以上都是直接利用低位 AB线参与再次译码?
直接地址译码 ; 实际应用中,当端口地址不够用时,可利用低位 DB线参与再次译码?间接端口地址译码 ; 以选择多个 I/O端口地址,如 P206,
图 6— 6所示 。
10 0001 0001?211H
74LS175是四 D触发器
由 D2,D1,D0及 IOR,IOW再译码?将一个地址变为 16个 I /O端口地址。
这种电路可节省系统地址空间,但必须把地址作为 DB输出寄存在 175中,所以多使用一条
OUT指令输出 DB做地址。
MOV DX,211H
MOV AL,00000000B
OUT DX,AL

INC AL
OUT DX,AL
作业,P234,2,
Y0
Y1
在此输出的不是数据,
而是地址。
§ 6.3 PC的系统总线
主机和外设交换数据?即 输入 /输出 ;利用
DOS系统功能 INT 21H,和 BIOS功能调用,可实现 对各种标准外设的 输入 /输出 。此时,可不考虑输入 /输出设备的 特性,也不必了解数据的 传送方式,只要按子程序的约定方法调用标准子程序即可。但实际应用上往往不全是标准的 接口设备,而是 自行设计接口 。此时则 利用 I/O指令 实现输入 /输出操作,则应了解内部细节,内部 结构 。
PC系统结构 可描述为:
PC机的输入 /输出能力强,主要表现在其输入 /输出的地址空间的分配和 I/O通道的 设计上。
总线接口 —— CPU系统,产生系统三总线。
I/O通道 (扩展槽) —— 外设和主机 连接的通道,每个槽均为 62个插脚的插座,本质 就是提供了 系统总线 —— PC
总线。用户开发接口,就是利用该总线。
实际的 PC设计中仅使用 A9-A0低 10位 AB作为
I/O端口地址,210= 1024个端口地址,即
000H~ 3FFH,但实际上 PC系统已占用大部分地址,用户自己开发接口时,一定要 避口已用地址,以免发生 地址冲突 。
一,系统 I/O端口地址分配大致:
000H~ 1FFH( A9=0) 512个口地址为系统板占用。
200H~ 3FFH( A9=1 ) 512个口地址为
I/O扩展槽占用。 自行开发接口在此部分 寻找空闲地址 。
∴ 设计前应了解系统 I/O端口分配。详细分配查手册。具体机器有些区别。
二、系统总线
PC机有极强的扩充能力,主要表现在其系统总线的设计上。系统总线是把微机各部分连接起来的公共通道。系统总线的性能直线关系到计算机的总统性能,系统总线随着 CPU的不断升级发展,也在不断更新和发展。
IBM PC机的 I/ O扩展槽的 62个信号线,本质上就是系统总线?PC总线,后修改为 80286微机的 系统 总线,即
PC AT总线,后定名为?( 16位) ISA总线,后继续发展为 80386/ 80486的 系统总线?EISA总线 ( 32位 ISA总线)。
ISA总线,结构简单,成本低,价格便宜,主要 用于低速外设 。随着高速外设的发展,92年就推出了 PCI总线
外部设备互连 局部总线,它是介于 CPU总线和系统总线之间的一级总线。它一则直接面向 CPU总线,另一则面向系统总线。局部总线离 CPU更近,所以通过它与
CPU之间的 数据传送速率大大加快 。
PCI总线?传输速率高,多总线共存(通过
PCI-ISA/ EISA桥接组件芯片,将 PCI总线与
ISA/ EISA总线桥接,构成一个分层次的多总线系统),独立于 CPU,自动识别与配置的外设。
I/O扩展槽,即 62芯插座,它适用于未来的发展,便于扩展开发系统。连到插座上的 62个信号线?PC系统总线。
用户自己开发的接口,都是插入此扩展槽,与系统连接。
62根信号线。参见 P208、图 6- 8的 AB槽。注意,元件面为 A面,
A1~ A31,焊接面为 B面,B1~ B31.
信号可分为五类:
①地址总线,20位地址。 ②数据总线,8位数据线。
③控制总线,22根。 ④时钟与复位,3根。
⑤地源与地线,8根+保留 1根。
一般用户接口设计最常用的是,地址线 ﹑ 数据线 ﹑ AEN(地址允许),IOR﹑ IOW﹑ RESET﹑ CLK﹑ IRQ9(中断请求)、电源。
三,I/O通道及总线信号
§ 6.4 数字通道接口
当 CPU与外设 交换的信息为数字量 时?该接口为数字通道接口。
由时序可知,数据是不可能长时间地“停留”在数据总线上的。且 CPU和外设速度上的差异,因此,数据交换中常使用锁存器或寄存器,三态缓冲器件,将数据锁存或隔离。 一般输出需要锁存,输入需要三态缓冲隔离。
外设输入的数据和状态都要经过三态缓冲器和数据总线送到 CPU。通常,挂在总线上的缓冲器都有 三态输出 能力,当需要传送数据时,才有允许信号开门,将数据送往数据总线。
常用的三态缓冲器芯片有:
74LS245?8总线发送/接收器,非反相三态输出。
可双向传送 。
74LS244?8总线缓冲器,非反相三态输出。只能 单向传送 。内部由二组三态门组成,每组 4个三态门,
共输出允许 G。
一.三态缓冲器功能表
A( 1A,2A) 数据输入
Y( 1Y,2Y) 数据输出
G( 1G,2G)= L,A?Y输出允许
还有很多缓冲器,主要区别是输出反相或不反相以及开门信号 G是高电平或低电平有效。
锁存器与触发器的区别?锁存器 →当允许端 G有效时,
Q输出将跟随数据 D输入,此时它好比一个“直通门”;
一旦允许失效时,锁住此时的数据信息。
触发器?由边沿触发,如在时钟有上升沿,Q输出为 D输入状态。
寄存器?寄存器可由触发器构成,也可由锁存器构成。
常用芯片:
74LS373?8D(透明)锁存器。
二.寄存器?用来锁存或寄存 CPU输出的数据和命令或地址。
74LS374?8D触发器,三态输出,共输出控制,
共时钟。
8个触发器都是边沿触发器,即在时钟正跳变时,Q输出将为 D输入的逻辑状态。
一位逻辑图 功能表输出控制 时钟 输入 输出
OE CLK D Q
L ↑ H H
L ↑ L L
L L X Q0
H X X Z
∴ 又称 三态缓冲寄存器 。即数据进入寄存器后并不立即从寄存器输出,要经过三态缓冲器才能输出。此类三态缓冲寄存器既 可作数据输入寄存器,又可作数据输出寄存器。
373,374实际上是由寄存器和三态缓冲器组成。
D7 ~D0 8个 数据输入端,Q7 ~Q0 8个 数据输出端。
和 374的区别:无三态输出控制。
273只能作为输出寄存器,不能作输入寄存器 。
功能表清除 时钟 输入 输出
CLR CLK D Q
L X X L
H ↑ H H
H ↑ L L
H L X Q0
74LS273- 8D触发器,共时钟,带清除端 。
一位结构
缓冲器和寄存器的使用主要注意好几个控制信号:
244的 允许端 G,一般应接一负脉冲将数据输入端传送至输出端送 DB,执行 IN指令时,由 P187 I/O时序可知,产生端口地址信号和 IOR信号,将此两信号接至 G端即可。
三、缓冲器和寄存器的应用- 缓冲器常 用作输入接口和寄存器常 用作输出接口。
IN AL,port
273的 CLK应出现正跳变 时,将 D传到 Q。
执行 OUT指令时,由时序知,产生端口地址信号和
IOW信号。将此两信号接到 CLK端即可。
OUT port,AL
教材中直接使用 P.211的图 6- 12的 PS0,PS1等信号直接作为上述控制信号。是因为在 PS译码中,已加入 IOR,
IOW信号。
简例 1,采集 8个开关的状态(或 8位数字仪表)?简单输入接口。
接口电路控制程序
MOV DX,PORT
IN AL,DX
B800H

B860H
如若只检测一个开关的状态,则只需要一个三态门?
若开关 K为 OFF(断开)状态,则置 TEMP单元为 0;若开关 K为 ON(闭合)状态,则置 TEMP单元为 1。
接口电路 控制程序
TEMP DB?
MOV DX,380H
IN AL,DX
TEST AL,80H
JZ ON
OFF,MOV TEMP,0
JMP EXIT
ON,MOV TEMP,1
EXIT,ret

XX80H
简例 2、控制 8只发光二极管的亮与灭?简单输出接口 。
接口电路 控制程序
MOV AL,0FH
MOV DX,PORT
out dx,al
loop $
NOT AL
OUT DX,AL
loop $
对应位为 1则亮,
为 0则灭。
若只控制一个 LED闪烁。
控制程序
MOV DX,380H
NEXT,MOV AL,01H
OUT DX,AL
CALL DELAY
MOV AL,00H
OUT DX,AL
CALL DELAY
MOV AH,11
INT 21H
CMP AL,0
JZ NEXT
RET
接口电路简例 3,输入 8个开关的状态,并用 LED对应显示开关的状态?输入/输出接口。
控制程序
MOV DX,380H
IN AL,DX
OUT DX,AL
此电路是端口地址相同的接口。
用 IOR/ IOW来区分。亦可用不同的端口地址。
如 PS0(380H)?1G,
2G,PS1(384H)
CLK
欲监视某设备的状态,若发现该设备异常
( 0?1),则发出报警信号(红灯亮),一旦恢复正常,则撤除报警信号(红灯灭)。
此时应设计一 查询式 输入 /输出接口。
LOP:MOV DX,PORT
MOV AL,00H
OUT DX,AL
WAT:IN AL,DX
TEST AL,01H
JZ WAT
OUT DX,AL
WT1:IN AL,DX
TEST AL,01H
JNZ WT1
JMP LOP
作业,P234,10.
例 1、七段发光二极管显示器接口设计
⑴,LED显示器 是小型微机系统中 常用的输出装置 。 7段 LED显示器由 7个条形发光二极管和一个圆点发光二极管组成。由各管的亮暗组合成数字或符号。发光二极管有一端连接在一起,
构成了共阴极或共阳极显示器,以阴极为例。
⑵,静态显示接口?显示方式可分为 静态显示方式和动态显示方式。
若要显示,5”字? 。 f b
则数据为:即字形代码。 g
dp g f e d c b a e c
0 1 1 0 1 1 0 1→6DH
若要显示,0” →3FH ( 段码 ) d
a a
控制程序段:
MOV DX,260H
MOV AL,6DH ; 若送 0,则熄灭
OUT DX,AL
以上只是显示一位,若显示六位,则需 6个 I/O口
( 6个 273),若要显示不同数字符号,要用不同的口地址。静态显示 N位,则需 N× 8根 I/O口线。
( 3),动态显示接口
静态显示占有用 I/O资源较多,所以在多位显示的实际应用中都使用动态显示方式。
在多位 7段 LED显示时,为了简化电路,降低成本,将所有的 段选端并联在一起,由一个输出寄存器作 I/O口,
称为 段选 寄存器;而所有 共阴极点连在一起,由一个输出寄存器作 I/O口,称为 位选 寄存器;所以 8位显示器的接口只需两个 8位 I/O口。由于所有的段选码皆由一个 I/O
口控制,所以在每一个瞬间,只有一位显示。只要 控制显示器逐个循环点亮 ;适当选择循环速度,利用人眼
“视觉暂留”效应,使其看上去好象多位都在显示一样。
→扫描显示方式。
动态显示控制 6位显示器的接口- P.212.
图中反相器和与非门只是为增加驱动能力。
电路等效为:
要使 LED亮,段选码 Q输出为 0。相应的位选码 Q输出为 1。
欲显示,7”,
则 段选码为 78H。
由此可推得十进制数字 0- 9的段选码为( P212):
40H,79H,24H,30H,19H,12H,02H,78H,
00H,18H。
从左至右的位选码,20H,10H,08H,04H,02H,
01H。
Q5 Q4 Q3 Q2 Q1 Q0
1 0 0 0 0 0 左一位亮
0 1 0 0 0 0 左二位亮
0 0 1 0 0 0 左三位亮
0 0 0 1 0 0 左四位亮
0 0 0 0 1 0 左五位亮
0 0 0 0 0 1 左六位亮
在程序中,循环送出相应的段选码,位选码,显示一位,延时,再显示下一位。 →达到动态显示。
如从键盘输入 6位 BCD数送图示显示器显示的程序:
IBF DB 7,?,7 DUP(?)
SEGPT DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,18H
LEA DX,IBF
MOV AH,10 键入待显示 BCD数
INT 21H
MOV DX,0B840H
MOV AL,00H
OUT DX,AL
AGAN0:LEA SI,IBF+2 ;设 BCD数地址指针
MOV AH,20H ;置左一位的位码
MOV BH,0
AGAN1:MOV BL,[SI] 取 BCD真值 →BX
AND BL,0FH
定义段码表
MOV AL,SEGPT[BX]
MOV DX,B840H 输出相应的段码
OUT DX,AL
MOV AL,AH
MOV DX,B800H 输出相应的位码
OUT DX,AL
MOV CX,100 延时
LOOP $
INC SI ;修改地址指针
SHR AH,1 ;修改位码
AND AH,AH
JNZ AGAN1 键入的 6位数显示完吗
MOV AH,0BH
INT 21H
CMP AL,0
JE AGAN0
RET
例 2,按键和键盘接口设计。
在计算机应用系统中为了控制系统的工作状态,以及向系统中输入数据,一般设有按键或键盘。如复位键,功能键,数字键等。按键是 常用的输入装置。
键按下+5v
( 1)、目前,无论是按键或键盘都是利用机械触点的闭合,
断开过程产生一个电压信号。但机械点的闭合,断开,均会产生 抖动,抖动时间 10ms-20ms。
因为抖动可能导致错误的读入,所以通常应 去抖动 。
去抖动方法可用软、硬两种方法实现:
软件? 软件延时,即从检测到有键按下,执行一个 10ms~20ms的延时程序,去抖动。
硬件? 用 R-S触发器去抖动 。
( 2),独立式按键接口 —— 每一个按键独立用一根 I/O口线,根据 I/O口线的状态确定开关状态。需缓冲器隔离。如需输入 8个开关状态?AL
按键输入低电平有效。
MOV DX,PORT
IN AL,DX
CMP AL,0FFH
JE NOKEY
YESKEY:

NOKEY:

( 3),行列式键盘接口 —— 独立式按键电路配置灵活,
软件简单,但每一个键必须占用一个 I/O口线,在按键较多时,I/O口线浪费较大,所以按键较多时一般采用行列式键盘 。一般将若干按键接口组成矩阵式键盘,如
2*2,4*4,4*5,4*6,8*8,可有 4个键,16个键,20个键,
24个键,64个键,可构成数字键,功能键,字符键等,
下面以 4*4的 16键为例:?
行列式键盘电路原理 —— 按键设在行线,列线交点处,
行、列线分别连接到按键开关的两端,列线通过上拉电阻接 +5V,被钳在高电平状态 。若将 行线全部输出低电平,
则读入列端口开关状态,若为 全 1111则无键按下,否则有键按下。当有键入时,再逐行逐列检查,即将行线 依次送低电平 0,检查列输入状态,如果为全 1111,则按键不在此行;否则在此行。且在与 0电平列线相交的那个键即对键盘进行两次扫描 。
对键盘进行编码以确定键值 —— 将 行输出值 和 列输入值 进行编码,按键位置与其对应的编码如下:
如左上键,列输入值,行输出值,( 0为有键入 )
0 1 1 1 0 1 1 1? 77H
所有键的编码如下:
77H B7H D7H E7H
7BH BBH DBH EBH
7DH BDH DDH EDH
7EH BEH DEH EEH
若将该键盘矩阵的按键定义为 (可理解为键值 ):
7 8 9 A 注,此为人为定义 0 1 2 3
4 5 6 B 亦 可定义为其他 4 5 6 7
1 2 3 C 8 9 A B
0 F E D C D E F
若将 16进制数的顺序 0~ F所对应的编码 7EH~ BEH
排成一个数据表。 存放在某数据区,再根据接口电路,
对键盘进行扫描,将所找到的按键的列值和行值组合成一代码,将该代码与数据区的编码表 逐一比较 ;便可确定相应的键值。
如键入 2#键:
7
4
1
0
D3
D2
D1
D0
8 9 A
5 6 B
2 3 C
F E D
D4D5D6D7
如键入 2#键的键译码(键分析)
流程行输出全 0→( 380H)
读( 384H)
Y
N有键入输出行值读入列值
1111?
将行列拚码 BDH→AL
与键表比较查寻相应键值 →BX
显示键值
1111?修改例,用上述扫描法,将其键入的 16进制数显示的程序,
KEYTAB DB 7EH,7DH,0BDH,0DDH,7BH,0BBH,0DBH,77H
DB 0B7H,0D7H,0E7H,0EBH,0EDH,0EEH,0DEH,0BEH
LOP1,MOV DX,B800H
MOV AL,0 将行线全部置 0
OUT DX,AL
定义 0~ F的相应键码表
MOV DX,B840H
I N AL,DX ; 读入列值
AND AL,0F0H ;取高 4位
CMP AL,0F0H ;是否全,1111”
JE LOP1 ;全,1111”则无键入全键盘扫描,
查询有无键入
MOV BX,0 ;置计数初值
MOV AH,77H ;检测键盘的行的输出初值
LOP2,MOV DX,B800H
MOV AL,AH
OUT DX,AL ;输出行值
MOV DX,B840H
IN AL,DX ;输入列值
AND AL,0F0H
CMP AL,0F0H ;是否在本行
JNE LOP3
ROR AH,1 ;本行无键入,则检查下一行
JMP LOP2
逐行扫描
LOP3,AND AH,0FH ; 取行输出值
OR AL,AH ; 与列输入值,组合代码?AL
LOP4,CMP AL,KEYTAB[BX]
JE LOP5
INC BX
JMP LOP4
LOP5,ADD BL,30H
CMP BL,3AH ; 将键值转换为 ASCII字符
JC LOP6 ; 0~9? 加 30H
ADD BL,7 ; A~ F?加 37H
LOP6,MOV DL,BL
MOV AH,2 显示键入的值
INT 21H
RET
将扫描所得的代码与编码表比较寻找输入的 16进制数(键值)? BX
作业,P234,★ 11,▲ 12,13.
思考例,显示器 /键盘接口
D
Q
CLK
273
DB
DB
DB
键盘列输入口
G
Y A
244
273
Q
D
+5v
+5v
位选键盘行输出
A
CLK Q
g a
com段选口
Q
Y
初始化更新显示 DISUP
键盘扫描 DECKEY
键分析译码有键入吗?N
Y
例 3,BCD码拨盘接口设计在计算机应用系统中,除显示,键盘等 人机对话接口 外,还有一种较常用的 拨盘输入,它适合于少量的数据或控制参数的输入。
( 1) BCD码拨盘 —— 拨盘种类很多,作为人机接口使用最方便的拨盘是十进制输入,即可以输入 BCD码。拨盘都具有
0~9十个位置,每个位置都有相应的数字显示,代表拨盘输入的十进制数。每个拨盘都有
5个接点,其中 A为输入控制线,另 4根是 8421码输出线。
当拨盘拨到不同位置时,输入
A分别与 8421线中的某根或某几根接通。
如 键盘输入 控制端 A 输出端 8421线
0 1 0000
1 1 0001
2 1 0010
3 1 0011
4 1 0100
5 1 0101
6 1 0110
7 1 0111
8 1 1000
9 1 1001
输出为 1
表示该线与 A接通
84
21 A +5v
用一片只能表示一位十进制数,用多片可构成多位十进制数。
( 2),单片 BCD码拨盘接口 —— 仅需一个 4位 I/O线端口,A输入端接+ 5V,为了使输出端不与 A接通时亦有确定电平,常将 8421输出端通过电阻拉至低电平。
原理图:
因为 A接高电平 +5V,相应 8421输出高电平,表示接通 A
有效,即 高电平有效,若为低电平,则无效? 此时拨盘输出为 正逻辑 (原码);
控制端 A亦可接低电平 0? 此时 8421输出端经电阻拉至电平+ 5V,拨盘输出的 BCD码为 负逻辑 (反码) 。
如将拨盘拨至 6的位置,执行,MOV DX,260H
拨盘输入程序段,IN AL,DX
(则 AL低 4位 0110 )
( 3) 多片 BCD码拨盘接口在实际应用系统中,要输入多位十进制数,应将 多片
BCD码拨盘拼接 。若按上述接法,N位十进制数拨盘需占用 4× N根 I/O口线,为了减少 I/O线的数量,可将拨盘的 输出线分别通过与非门与 I/O口相连,而每片拨盘的 A端 不直接接+ 5V或地,而是与 I/O口线相连,用来控制选择多片中的任意一片。这样,N位拨盘,只需
4+ N根 I/O口线。
如,8位十进制数输入的拨盘接口如 P218、图 6-
17所示,下图只用 4+ N= 4+ 8= 12根 I/O线。所有 A接 384H输出口,所有 8421输出线,接 8输入与非门,再送 244输入口。
分析一位,如数字 6:
8
4
2
1
0
D3
D2
D1
D0
↓ ↓
原码 0110 反码 1001
A
所以要输入的位 A接 0,
其他接 1
经多输入与非门,见 0为 1(接通位) 全 1为 0(未接通位均为 1)
如:输入 8位十进制数送缓冲区 IBUF,并显示的程序:
注:执行拨盘输入程序之前,各位 BCD拨盘均应拨好数码 →逐位选通读入。
IBUF DB 8 DUP (?)
OBUF DB 9 DUP (?)
MOV BX,0 ;
MOV AH,80H ;
LOP1:MOV DX,384H
MOV AL,AH
NOT AL
OUT DX,AL
MOV DX,380H
IN AL,DX
AND AL,0FH
MOV IBUF[BX],AL
INC BX ;
SHR AH,1 ;
指向缓冲区的下一个数据位修改位选值,指向下一选通位读入一位拨盘的值即一个十进数
→IBUF
输出位选值 0111 1111→
1011 1111→1101 1111…
设输入数据区的初始位移量设位选初值
AND AH,AH
JNZ LOP1
MOV SI,OFFSET IBUF +7
MOV DI,OFFSET OBUF +7
MOV CX,8 ;
LOP2,MOV AL,[SI]
ADD AL,30H
MOV [DI],AL
DEC SI
DEC DI
LOOP LOP2
MOV OBUF + 8,’$’
MOV DX,OFFSET OBUF
MOV DX,9
INT 21H
设循环计数将数字 →字符指向两缓冲区的末地址
8位读完吗?
显示
§ 6.5 模拟通道接口
作用:模拟信号 模拟通道 数字信号例,被测对象 传感器 电信号 放大 模拟信号 A/D
数字信号 计算机 数字信号 D/A 模拟信号(控制)
下面介绍两种最常用的 D/A,A/D与微机的接口 。
一、数模转换器 DAC与微机的接口
1,D/A与微机接口时,靠 OUT指令 将待换的 数据送
D/A?输出接口,而 OUT指令送出的数据在 DB上的时间是短暂的,所以需要一个数据 寄存器 暂存数据,供 D/A转换 。 除早期 D/A产品需要外接数据寄存器之外,目前 D/A芯片 内片 带有数据寄存器,所以可直接与微机接口 ( 通常称为与微处理器 完全兼容 ) 。
2,DAC0832—— 8位电流 D/A。内部结构,P222、图 6-21。
由图可知,它由 8位 输入寄存器,8位 DAC寄存器,8位
D/A转换器 及转换控制电路构成。由二级锁存器构成。
3,DAC0832的引脚功能:
① 8位数据输入线?D7~ D0( DI7~ DI0)
② 电流输出端?Iout1,Iout2—— 一般 Iout1接运放的反相输入端,Iout2接模拟地 。
③ 反馈信号输入端?Rfb,反馈电阻在片内 。
④ 允许输入锁存信号?ILE— 高电平有效 。
⑤ 输入寄存器锁存信号?WR1,DAC寄存器写信号?WR2
⑥ 传送控制信号?XFER,以控制 WR2是否起作用。
⑦ 片选信号?CS,输入寄存器选择信号 。
⑧ 参考输入电压?VREF,即基准电压,一般在
-10V~ +10V。
⑨ 模拟地?AGND,整个电路的模拟地必须在某一点与数字地相接 。 数字地?DGND。 通常模数两地相连 。
4,DAC 0832与微机接口
∵ 0832内部有输入寄存器,∴ 可直接与微机接口 。 0832为电流输出型 D/A,要得模拟电压,
必需外加转换电路 。
∵ 内部有两级数据寄存器,∴ 可工作于多种方式?直通方式,单缓冲方式,双缓冲方式?五个控制信号,ILE,CS,WR1,WR2,XFER的连接方式不同 。
① 直通方式
常用于 连续反馈控制的环路 中;只要由一个 ROM连续地向它提供 DAC数据,输出就可以直接跟随输入变化 。 此时 无需 OUT指令启动转换 。
由内部结构的控制部分可知:
此时 IE=1输出 Q
跟随输入 D。
② 单缓冲方式
使两个寄存器的一个始终处于 直通状态,而使另一个 寄存器 受控的锁存器状态 。
常用于 单路应用系统 。
如使第一个寄存器受 PSO,IOW的控制状态;
使第二个寄存器处于直通状态。
输出锯齿波的程序:
MOV DX,380H
MOV AL,O
AGAIN,OUT DX,AL
INC AL?指向下一个数据
PUSH AX
MOV AH,11
INT 21H
CMP AL,0
POP AX
JZ AGAIN
插入廷时,可改变锯齿波周期 。
锁存一个数据无键入则继续锯齿波的数据为 0~ FFH
( 3)、双缓冲方式
两个寄存器都处于受控状态,需要两步写操作来完成,需要两个端口地址以选通
CS和选通 XFER。 这样,
可在 DAC转换输出前一个数据的同时,将下一个数据送到输入寄存器,可提高 D/ A
的转换速度 。 常用于多路应用系统 且要求输出同步的情况 。
输出锯齿波程序:
MOV AL,0
AGAIN,MOV DX,380H 选通输入寄存器,将转
OUT DX,AL 换数据锁存
MOV DX,384H 选通 DAC寄存器,启动
OUT DX,AL D/A转换
INC AL ;修改数据
PUSH AX
MOV AH,11
INT 21H
CMP AL,0
POP AX
JZ AGAIN
无键入则继续
如产生任一周期信号的程序(波型数据无简单规律):
只需在缓冲区存相应数据 —— 如存一个周期的正弦波数据,便可输出正弦波:
BUF DB XX,XX,… MOV DX,384H
COUNT EQU $-BUF OUT DX,AL
START:LEA BX,BUF MOV AX,100
MOV CX,COUNT HERE:DEC AX
AGAIN:MOV DX,380H JNZ HERE
MOV AL,[BX] INC BX
OUT DX,AL LOOP AGAIN
11#功能控制转 START
廷时以改变输出速率
5,10位 D/ A转换接口-- AD7520
AD7520为 10位 D/ A转换器,内部 不带数据锁存器 。
b1~ b10?数据输入线,b1?MSB,b10?LSB。
IOUT1,IOUT2?电流输出,即也是电流型 D/ A,
所以也要转换成电压。
AD7520与微机接口?∵ 自身不带数据锁存器,
∴ 必须 外扩展数据寄存器,∵ 为 10位,∴
要 锁存 10位数据,∵ 只有 8位 DB,∴ 可先锁存高 2位,再锁存 2+ 8位。
完成一个数据转换的程序段:
MOV AH,000000XXB ;设高 2位数据
MOV AL,XXH ;设低 8位数据
MOV DX,PORT0 XCHG AH,AL
XCHG AH,AL MOV DX,PORT1
OUT DX,AL OUT DX,AL
锁存高 2
位在第一个 74中锁存 10位在
74+ 273中启动 D/ A
作业,P235,14,15(用单缓冲方式),
二 ﹒ 模数转换器 ADC与微机接口
1,A/D与微机接口时,靠 OUT指令 启动 A/D转换,
转换结束后,用 IN指令 从 ADC中读取转换数据?输入接口 。 A/D的数据输出端是否能直接与微机 接口,
要看 A/D内部的输出锁存器是否为 三态输出锁存器,
若为三态输出,则可与微机 DB直接相连;若为非三态输出,则应加三态缓冲隔离 。
2,ADC 0808/0809
采用 CMOS工艺制成的 8位 8通道单片 A/D转换器 。
内部结构 P229,图 6-30
注,0808和 0809的区别在于总的不可调误差( 0808
为 +1/2LSB,0809为 +1LSB),所以 0809较便宜。
片内有 8路模拟 开关,模拟开关的地址锁存与译码电路,可选通 8路模拟输入的任何一路单端模拟信号,中间部分:包括比较器,256电阻网,树状开关,逐次逼近寄存器 S·A·R,控制与时序,以实现逐次逼近式 A/D—— 即 8位 A/D。 最后结果由 三态输出锁存器输出 。
3、引脚功能
① IN0-IN7→ 8个通道的模拟电压输入 ( 0~ +5V) 即单极性输入,由通道 ADDA,ADDB,ADDC选择确定 。
② ADDA,ADDB,ADDC→ 模拟通道的地址选择线;
可由 DB选择通道,不占 I/O端口地址;也可由 AB选择通道,须 8个 I/0口地址 。
③ D0-D7→ 数据线输出 。
④ OE→ 输出允许,高电平有效,以打开三态缓冲器,
将数据送 DB,供 CPU读入 。
⑤ ALE→ 地址锁存允许,上升沿有效,锁存三地址线以选通相应通道。
⑥ START→ 启动信号,在模拟通道选通之后,由正脉冲启动 A/D转换 ( START的上升沿使所有内部寄存器清 0,下降沿开始 A/D转换过程 。 )
⑦ EOC→ 转换结束信号,转换时间为 100us。 在 START
之后,A/D开始转换,EOC为低电平,表示正在转换,
一旦转换结束,EOC变为高电平,表示转换结束 。
此信号可作为状态查询信号,或用来申请中断 。
⑧ REF( +),REF( -) → 基准电源输入 。 参考电压的精度直接影响转换结果,要求不高时直接电源 。
⑨ CLK→ 时钟脉冲输入,时钟频率为 640K( ≤ 640K)。
4,ADC0808/0809与微机接口
∵ 内部有数据锁存 三态 寄存器,DB可与 CPU
直接接口 。 所以主要是对模拟通道的选择,转换启动控制和读取结果的控制 。
其通道的选择:可用三根低位地址 AB选择 8个模拟通道,通道端口由地址确定;也可用 DB的低三位来选择 8个通道,通道端口由 AL低三位确定 。 如要选择 IN4则:
MOV AL,04H
MOV DX,380H→ 或 384H
OUT DX,AL
读取转换结果有三种方式:
延时等待方式,查询 EOC方式,中断方式 。
如下图所示为 延时等待方式接口,启动后,
软件延时 100us,再读取结果,EOC不接 。
如,采集 INO通道的一个数据 → AL的程序:
MOV DX,380H 启动 IN0通道,产生 PS,IOW
OUT DX,AL
MOV CX,50 设 PC机 CLK=4·77MHZ,T=210ns
LOOP $ 17T*210ns*50=178500ns≥100us
IN AL,DX ;读取转换结果,产生 PS,IOR
如,对 8路模拟信号进行循环采样,每个通道采集 10个数据分别存入 8个缓冲区,只需在上述程序基础上外加双重循环,内循环控制 8个通道,外循环控制 10个数据。参见 P230COUNT EQU 10
BUF DB COUNT* 8 DUP(?)
MOV BX,OFFSET BUF
MOV CX,COUNT
OLP,PUSH BX ADD BX,COUNT
MOV DX,380H INC DX
ILP,OUT DX,AL CMP DX,388H
PUSH CX JB ILP
LOOP $ POP BX
POP CX INC BX
IN AL,DX LOOP OLP
MOV [BX],AL
如,采用 查询方式,应将 EOC信号经三态门 → 数据总线 Do,且应增加一查询口地址 (如 388H)。
查询方式应区分 数据端口与状态端口,如上图所示是由 A3来区分的,A3= 0,开启数据端口;
A3= 1,开启状态端口。所以数据口为 380H~
387H;状态口为 388H~ 38FH。而启动口可为
380H~ 39FH均可,即只要锁存 AB低三位。
查询程序:
MOV DX,380H 启动 IN0
OUT DX,AL
MOV DX,388H ( A3=1为查询口)
POLL,IN AL,DX
TEST AL,1 查 EOC
JZ POLL 为低则等待
MOV DX,380H EOC为高,则转换结束,
IN AL,DX 读取转换结果为循环或多个通道采集,
改为:
ADD DX,8
或 OR DX,8
或 XOR DX,8
多个通道采集相应改为:
SUB DX,8
或 SUB DX,8
或 XOR DX,8
补充作业:
请画出查询法采集数据的 ADC0809和 PC微机的接口电路;并编写对 8个模拟通道各采集 10
个数据的程序段;已知 8通道的数据口地址为
260H~ 267H,状态口地址为 268H~ 26FH。
P235,★ 17,★ 18.