第 9章 单片机接口技术
9.1 I/O接口技术概述
9.2 并行 I/O口的直接应用
9.3 可编程并行通信接口芯片 8255A
9.4 LED显示接口技术
9.5 键盘接口
9.6 8279键盘显示器接口芯片
9.1 I/O接口技术概述
9.1.1 需要 I/O接口电路的原因接口,存储器接口:三总线连接简单
I/O接口,复杂其复杂性主要表现在以下几个方面:
1,外部设备的工作速度快慢差异很大 。
2,外部设备种类繁多,既有机械式的,又有机电式的,
还有电子式的 。 不同种类的外部设备之间性能各异 。
3,外部设备的数据信号是多种多样的 。
既有电压信号,也有电流信号;
既有数字形式,还有模拟形式 。
4,外设的数据传送有近距离的,也有远距离的 。
近距离,并行传送远距离:串行传送 。
传送方式的转换 。
正是由于上述原因,使数据的 I/O操作变得十分复杂,
无法实现外部设备与 CPU进行直接的同步数据传送,而必须在 CPU和外设之间设置一个接口电路,通过接口电路对 CPU
与外设之间的数据传送进行协调 。
因此接口电路就成了数据 I/O操作的核心内容 。
在数据的 I/O传送中,接口电路主要有如下几项功能;
1,速度协调
2,数据锁存在接口电路中需设置数据锁存器,以保存输出数据直至为输出设备所接收 。
3,三态缓冲数据输入时,输入设备向 CPU传送的数据也要通过数据总线,但数据总线是系统的公用数据通道,上面可能,挂,
着许多数据源,工作十分繁忙。为了维护数据总线上数据传送的,秩序,,因此只允许当前时刻正在进行数据传送的数据源使用数据总线,其余数据源都必须与数据总线处于隔离状态。为此要求接口电路能为数据输入提供三态缓冲功能。
4,数据转换
CPU输入,输出信号的形式:并行,数字信号 ( 以电压形式体现 ) 。
包括,模一数转换,数-模转换,
串-并转换,并-串转换等 。
接口电路也就成为 I/O数据传送的核心内容,是计算机中不可缺少的组成部分 。
9.1.2 接口与端口接口:特指计算机与外设之间在数据传送方面的联系 。
其功能主要是通过电路实现的,因此称之为 接口电路 。
在接口电路中应该包含:
数据寄存器,保存输入输出数据状态寄存器,保存外设的状态信息命令寄存器,保存来自 CPU的有关数据传送的控制命令 。
这些寄存器都是可读写的 编址寄存器,对它们像存储单元一样进行编址 。
把接口电路中这些已编址并能进行读或写操作的寄存器称之为端口 ( port),或简称口 。
一个接口电路中可能包括有多个口:
保存数据的数据口,保存状态的状态口和保存命令的命令口等 。
因此一个接口电路就对应着 多个口地址 。
9.1.3 I/O编址方式在计算机中,凡需要进行读写操作的设备都存在编址的问题 。
计算机中两种需要编址的部件,存储器,接口电路 。
对端口编址是为 I/O操作而进行的,因此也称为 I/O编址 。
计算机中常用的 I/O编址有两种方式:
1,独立编址方式独立编址:把 I/O和存储器分开进行编址,即各编各的地址 。
计算机中两个独立的地址空间:存储器地址空间和 I/O
地址空间 。
在使用独立编址方式的计算机指令系统中,除存储器读写指令之外,还有专门的 I/O指令以进行数据的输入和输出操作 。 此外在硬件方面还需要定义一些专用的信号 。
如 Z80,8088/8086的 CPU也采用独立编址方式 。
2,统一编址方式统一编址就是把系统中的 I/O口和存储器统一进行编址 。
在这种编址方式中,把 I/O接口中的寄存器 ( 端口 )
当做存储器单元对待 。
对于 51系列单片机,采用统一编址方式 。
对 I/O口的操作,并不需要单独的指令,用 MOVX指令即可 。
9.1.4 数据总线隔离技术计算机的 I/O操作中,输入输出的数据都要通过系统的数据总线进行传送,要保证正确地进行 I/O操作,就必须解决数据总线的隔离 。
从宏观上看,数据总线连接着多个输入设备和输出设备,还有多个存储单元 。 但在任一时刻,却只能和一个 I/O设备进行数据传送,或者与一个存储单元进行数据传送 ( 对程序存储器只能读出 ) 。 当与一个外设进行数据读入或输出时,要求所有其它不参与的 I/O设备和存储单元必须同总线隔离开来 。
如何使数据传输设备在需要的时候能与数据总线接通,而在不需要的时候又能同数据总线隔开,这就是总线隔离问题 。
解决方法:对于输出设备的接口电路:采用锁存器 。
对于输入设备的接口电路:采用三态缓冲电路或集电极开路电路 。
9.2 并行 I/O口的直接应用应用对象,MCS-51芯片的四个 8位双向口 P0~ P3。
9.2.1 有关 I/O口的操作指令
1,I/O口的数据传送指令
I/O口属于专用寄存器,所以 I/O数据传送都是通过 MOV指令进行的 。
向口输出数据的指令有:
MOV Px,A
MOV Px,Rn
MOV Px,@Ri
MOV Px,direct
向口输入数据的指令有:
MOV A,Px
MOV Rn,Px
MOV @Ri,Px
MOV direct,Px
这些指令用于字节数据的输入输出 。
2,I/O口的位操作指令
MOV ( 位传送指令 )
例如,MOV Px.y,C
CLR ( 位清 0指令 )
例如,CLR Px.y
SETB ( 位置 1指令 )
例如,SETB Px.y
CPL ( 位取反指令 )
例如,CPL Px.y
JB ( 位为 1转移指令 )
例如,JB Px.y,rel
JNB ( 位为 0转移指令 )
例如,JNB Px.y,rel
JBC ( 位为 1转移清 0指令 )
例如,JBC Px.y,rel
3,I/O口其它操作指令由于 I/O口是属专用寄存器之列,因此凡直接寻址方式的指令
,都适用于 I/O口 。
其中有:
ANL ( 逻辑与指令 )
例如,ANL Px,A
ORL ( 逻辑或指令 )
例如,ORL Px,A
XRL ( 逻辑异或指令 )
例如,XRL Px,A
INC ( 加 1指令 )
例如,INC Px
DEC ( 减 1指令 )
例如,DEC Px
DJNZ ( 减 1条件转移指令 )
例如,DJNZ Px,rel
CJNE ( 数值比较转移指令 )
例如,CJNE A,Px,rel
9.2.2 I/O口的直接应用由于 8051的 P0~ P3口输入数据时可以缓冲,输出时能够锁存,并且有一定的带负载能力,所以,在有些场合 I/O口可以直接接外部设备,如开关,LED发光二极管,BCD码拨盘等 。
I/O数据传送方式有:
无条件传送方式,
查询方式中断方式 。
由于这些外部设备在任何时刻都具有,0”或,1”其中一个状态,因此,对于这些设备传送数据经常用无条件传送方式 。
例 1,如图 8-1所示,P1口的每一位分别连接一个发光二极管
LED,要求从左向右循环点亮 LED。 每个 LED持续亮 1s。
参考程序如下:
ORG 5000H
START,MOV A,#01H ; ( A) = 0000,0001,
高电平对应的发光二极管亮
LOOP,MOV P1,A ;从 P1口输出到发光二极管
MOV R1,#10 ;延时,延时时间 1s
DEL1,MOV R2,#200
DEL2,MOV R 3,#126
DEL3,DJNZ R3,DEL3
DJNZ R2,DEL2
DJNZ R1,DEL1
RL A
SJMP LOOP ;循环
END
例 2,图 8-2所示为 8031单片机与开关及 LED发光二极管的接口电路 。 要求 P1.0~ P1.3作为数据输入口输入开关状态,
P1.4~ P1.7作为输出口去驱动 LED,使 LED显示开关的状态
( 输出为,1”使 LED亮,否则,为,0”,LED灭 ) 。 在执行程序时,不断改变开关 K0~ K3的状态,可观察 LED的变化 。
参考程序如下:
ORG 4200H
LOOP,MOV A,#0FH ; P1口为输入,先送 1
MOV P1,A
MOV A,P1 ;输入 P1口状态
ORL A,#0F0H ;屏蔽 A的高半字节
SWAP A ;开关状态到高 4位
MOV P1,A ;开关状态输出
AJMP LOOP ;循环
END
9.2.3 简单 I/O接口的扩展方法简单 I/O接口的扩展包括 输入扩展和输出扩展两个部分 。
1,简单输入接口扩展简单输入扩展只解决数据输入的缓冲问题 。
数据总线要求挂在它上面的所有数据源必须具有三态缓冲功能,因此简单输入扩展实际上就是 扩展数据缓冲器 。
其作用是当输入设备被选通时,使数据源能与数据总线直接沟通;而当输入设备处于非选通状态时,把数据源与数据总线隔离,即缓冲器输出为高阻抗状态 。
图 9-3 三态缓冲器逻辑符号三态缓冲电路就是具有三态输出的门电路,因此也称为三态门 。
( 1) 三态缓冲电路图 9-4 74LS244引脚图
( 2) 简单输入接口扩展的典型电路芯片典型芯片,74LS244和 74LS245,由该芯片构成三态数据缓冲器。
图 9-5 输入口的简单扩展
2.简单输出接口扩展经常使用的三态锁存器是 74LS273,74LS373和 74LS377。
图 9-8 74LS377作输出接口扩展
9.4.1 LED显示器
1,LED显示器工作原理
LED显示器有 共阴极 和 共阳极 两种 。
共阴极就是把发光二极管的阴极连在一起构成公共阴极,使用时公共阴极接地,某端接高电平时才发亮,
如图 9-17( b)。
共阳极则是把发光二极管的阳极连在一起构成公共阳极,使用时公共阳极接十 5V端。某端接低电平时才发亮,如图 9-17( c)。
9.4 LED显示接口技术代码位 D7 D6 D5 D4 D3 D2 D1 D0
显示段 dp g f e d c b a
2,LED显示器接口方式动态扫描的方法多位 LED显示器接口电路需要有两个输出口,其中一个用于输出 8条段控线 ( 有小数点显示 ),另一个用于输出位控线,位控线的数目等于显示器的位数 。
段控口地址,1B08H
位控口地址,1B10H
9.4.2 用三态锁存器作 LED显示接口举例说明如何编写显示子程序。
例:在最左边显示,1”字符的程序:
MOV DPTR,#1B08H ;段码(字形)数据口
MOV A,#06H ;,1”的字形编码
MOVX @DPTR,A ;段码输出到段数据口
MOV DPTR,#1B10H ;字位控制端口
MOV A,#20H ;最左边 LED亮
MOVX @DPTR,A ;输出到字位口
RET
如果显示,123456”就要采用动态显示。通常在片内 RAM
中设置显示缓冲区,其单元个数与 LED显示器位数相同。假定六个显示器的缓冲单元是 40H~ 45H,对应的 LED为从左到右。那么动态显示子程序如下:
DS1,MOV R0,# 40H ;置显示缓冲单元首址
MOV R2,#20H ;字位口初值
DS2,MOV DPRT,#1B08H ;段数据口地址
MOV A,@R0 ;得到要显示的数字口
ACALL TABLE ;查字形代码
MOVX @DPRT,A ;输出到段口
MOV DPRT,#1B10H ;字位控制端口 向 LED
位锁存器输出
MOV A,R2 ;
MOVX @DPTR,A ;送位控制端口
MOV R3,#0FFH ;延时
DJNZ R3,$
INC R0 ;显示缓冲单元加 1
CLR C
MOV A,R2
RRC A ;最末一位是否显示完毕?
MOV R2,A ;如未完,则继续向下显示
JNZ DS2 ;显示
SJMP DS1 ;如完毕,从头显示
TABLE,INC A ;查表,取字形代码
MOVC A,@A+PC
RET
DB 3FH,06H,5BH,4FH
DB 66H,6DH,7DH,07H
DB 7FH,6FH,40H
9.5 键盘接口键盘分编码键盘和非编码键盘 。
编码键盘,由专用的硬件译码器识别 。
非编码键盘,靠软件识别 。
9.5.1 键盘结构键盘可分为独立式联接式和行列式(矩阵式)
两类。每一类按其译码方法又都分为编码键盘和非编码键盘。
1.独立式非编码键盘接口及处理程序
2.行列式键盘接口及工作原理常用的键识别方法有两种:一种是常用的逐行(或逐列)
扫描查询法,另一种是速度较快的线反转法。
现以 4行 × 8列键盘为例说明行扫描识别键的全过程。
( 1) 测试是否有键按下:
① 单片机 I/O 口向所有列线输出低电平 。 即向列口写入 00H。
② 然后输入各行线状态,即读输入口的字 。
③ 比较:若行线状态全为高电平,则表明无键按下;
若行线状态中有低电平,则表明有键按下 。
( 2) 消抖动
( 3) 扫描键盘以确定被按键的物理位置如图 8-25( a)所示,假定 A键被按下,这时键盘矩阵中 A点处的行线和列线相通。
0 1 11 1 1 11
1
1
1
1 A
(a)
+5V
输出口输口入
0 1 11 1 1 11
1
1
1
1 A
(b)
+5V
输出口输口入
0 1 11 1 1 11
1
1
0
1 A
(c)
+5V
输出口输口入
( 4) 计算键码如果在图 8-24中,键号是按从左到右,从上到下的顺序编排的,按这种编排规律,各行的首键号依次是 00H,08H、
10H,18H,如列线按 0~ 7的顺序编号,则可选用键码的计算公式为:
键码 = 首键号 十 列号
00H 01H 02H 03H 04H 05H 06H 07H
08H 09H 0AH 0BH 0CH 0DH 0EH 0FH
10H 11H 12H 13H 14H 15H 05H 17H
18H 19H 1AH 1BH 1CH 1DH 1EH 1FH
( 5) 等待键释放
9.5.2 8255作键盘接口结合 TSC51-196实验开发系统,在此介绍利用线翻转法实现 8255A作键盘接口 。
线翻转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式,编程使行线全部送低电平,然后读入列线值,此时如果某键被按下,则必定会使某列线值为 0。
此后,编程使两个并行端口改变方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,
那么在闭合键所在行线上的值必定为 0。
这样,当一个键被接下时,必定可以读到一对唯一的行线值和列线值,将这两个值组合起来即为键值。
图 9-26 线反转法的键盘接口图 9-26给出了 24个键,其中 8~ F键接到第一行,行线为 PB0,行值为 110B,只取低 3位,为 06H,而 0~ 7键接到第二行,行线为 PB1,行值为 101B。而 0,8两个键的列线接到 PA0,列值为 FEH,故 0字键键值为 05FEH,而 8字键的健值为 06FEH,F字键的键值为 067FH,其余各键键值可自行求出。
为使键盘的识别更加醒目,当按下 0~ F键时让发光二极管显示同样的数字,发光管用 C口并加非门驱动。例如
0FH,显示为 00001111,l代表亮。
程序如下:
ST_ADDR EQU 4000H
PA EQU 1B00H
PB EQU PA+1
PC EQU PB+1
PCTL EQU PC+1
ORG S T_ADDR
LJMP START
TABLE,DW 06FEH,06FDH,06FBH,06F7H,
06EFH,06DFH,06BFH,067FH
DW 05FEH,05FDH,05FBH,05F7H,
05EFH,05DFH,05BFH,057FH
CHAR,DB 08H,09H,0AH,0BH,0CH,
0DH,0EH,0FH ;字符表
DB 00H,01H,02H,03H,04H,
05H,06H,07H
ORG ST_ADDR+200H
START,MOV 42H,#0F0H
STA1,MOV DPTR,#PCTL
MOV A,#82H
MOVX @DPTR,A
LINE,MOV DPTR,#PC;将字符码从 C口输出到发光二极管显示
MOV A,42H
MOVX @DPTR,A
MOV DPTR,#PA;从 A口输 出全零到键盘的列线
CLR A
MOVX @DPTR,A
MOV DPTR,#PB ;从 B口读入键盘行线值
MOVX A,@DPTR
MOV 40H,A ;行线值存于 40H单元中
ORL A,#0F8H;只有低三位行线值有效 。 取反后如为全零则表示没有闭合键,继续扫描,否则往下执行
CPL A
JZ LINE
MOV R7,#10H ;有键按下,延时 10ms去抖动
DEL0,MOV R6,#0FFH
DEL1,DJNZ R6,DEL1
DJNZ R7,DEL0
MOV DPTR,#PCTL;重置控制字,三个口均为方式 0,A口设为输入,B口设为输出,C口仍为输出
MOV A,#90H
MOV @DPTR,A
MOV A,40H ;刚才读入的行线值取出从 B口送出
MOV DPTR,#PB
MOVX @DPTR,A
MOV DPTR,#PA ;从 A口读入列线值
MOVX A,@DPTR
MOV 41H,A ;列线值存于 4lH单元
CPL A ;列线值取反,如为 0表示没有键按下
JZ LINE
MOV DPTR,#TABLE
MOV R7,#10H ; R7中置计数值为 16,
MOV R6,#00H ; R6中放偏移量初值
TT,MOVX A,@DPTR
CJNE A,40H,NN1
INC DPTR
MOVX A,@DPTR
CJNE A,41H,NN2
MOV DPTR,#CHAR
MOV A,R6
MOV A,@A+DPTR
MOV 42H,A
BBB,MOV DPTR,#PCTL
MOV A,#82H
MOVX @DPTR,A
AAA,MOV A,42H
MOV DPTR,#PC0
MOVX @DPTR,A
MOV DPTR,#PA
CLR A
MOVX @DPTR,A
MOV DPTR,#PB
MOVX A,@DPTR
ORL A,#0F8H
CPL A
JNZ AAA
JMP STA1
NN1,INC DPTR
NN2,INC DPTR
INC R6
DJNZ R7,TT
JMP BBB
END