一.扩展的I/O接口功能
扩展的I/O接口电路主要应满足以下功能要求:
1.实现和不同外设的速度匹配
大多数外设的速度很慢,无法和us量级的单片机速度相比。单片机在与外设间进行数据传送时,只有在确认外设已为数据传送做好准备的前提下才能进行数据传送。
2.输出数据锁存
与外设比,单片机的工作速度快,数据在数据总线上保留的时间十分短暂,无法满足慢速外设的数据接收。所以在扩展的I/O接口电路中应有输出数据锁存器,以保证输出数据能为慢速的接收设备所接收
3.输入数据三态缓冲
数据总线上可能“挂”有多个数据源,为使传送数据时不发生冲突只允许当前时刻正在接收数据的I/O接口使用数据总线,其余的I/O接口应处于隔离状态,为此要求O接口电路能为数据输入提供三态缓冲功能。
二.端口的编址
介绍I/O端口编址之前,首先要弄清楚/O接口和I/O端口的概念
I/O接口是单片机与外设间的连接电路的总称。
I/O端口(简称I/O口)是指I/O接口电路中具有单元地址的寄存器或缓冲器。一个I/O接口芯片可以有多个I/O端口,如数据口,命令口,状态口。当然,并不是所有的外设都一定需要3种端口齐全的I/O接口。
每个I/O接口中的端口都要有地址,以便AT89S52通过读写端口来和外设交换信息。常用的I/O端口编址有两种方式:独立编址方式与统一编址方式
1.独立编址
I/O端口她址空间和存储器地址空间分开编址。优点是I/O地址空间和存储器地址空间相互独立,界限分明。但需要设置一套专门的读写I/O端口的指令和控制信号。
2.统一编制
把I/O端口与数据存储器单元同等对待。I/O端口和外部数据存储器RAM统一编址。因此外部数据存储器空间也包括I/O端口在内。
优点是不需专门的I/O指令。缺点是需要把数据存储器单元地址与I/O端口的地址划分清楚,避免数据冲突。
三.I/O数据的传送方式
为了实现和不同外设的速度匹配,必须根据不同外设选择恰当的I/O数据传送方式。I/O数据传送方式有: 同步传送、异步传送和中断传送。
1. 同步传送
同步传送又称无条件传送。当外设速度和单片机的速度相比拟时,常采用同步传送方式,典型的同步传送是单片机和外部数据存储器之间的数据传送
2.查询传送
又称有条件传送(也称异步式传送)。通过查询外设“准备好”后,再进行数据传送。优点是通用性好,硬件连线和查询程序简单,但工作效率不高。
3.中断传送
为了提高单片机对外设的工作效率,通常采用中断传送方式,即利用AT89S51单片机本身的中断功能和I/O接口的中断功能来实现IO数据的传送单片机只有在外设准备好后,才中断主程序的执行,从而进入与外设数据传送的中断服务子程序,进行数据传送。中断服务完成后又返回主程序断点处继续执行。因此,采用中断方式可以大大提高单片机的工作效率。
四.I/O接口电路----82C55
目前常用的外围I/O接口芯片有:
(1) 82C55----可编程的通用并行接口电路(3个8位I/O口);
(2)81C55---可编程的IO/RAM扩展接口电路(2个8位IO口,1个6位I/O口,256个RAM字节单元,1个14位的减法计数器)。
这里只介绍82C55:
1.82C55的引脚及其内部结构
引脚:
D7~D0: 三态双向数据线,与单片机的PO口连接,用来与单片机之间传送数据信息
CS*:片选信号线,低电平有效,表示本芯片被选中
RD*:读信号线,用来读出82C55端口数据的控制信号
WR*:写信号线,用来向82C55写入端口数据的控制信号
Vcc: +5V电源
PA7~PA0:端口A输入/输出线
PB7~PB0:端口B输入/输出线
PC7~PCO:端口C输入/输出线
A1、A0:地址线,用来选择82C55内部的4个端口
RESET:复位引脚,高电平有效
内部结构:
82C55内部结构见图,包括3个并行数据输入/输出端口,两种工作方式的控制电路,一个读/写控制逻辑电路和一个8位数据总线缓冲器。图9-2中左侧的引脚与单片机相连,右侧的引脚与外设连接。各部件的功能如下:
(1)端口PA,PB,PC
82C55有3个8位并行口PA、PB和PC,它们都可选为输入/输出工作模式但在功能和结构上有些差异。
PA口:一个8位数据输出的锁存器和缓冲器;一个8位数据输入的锁存器。
PB口:一个8位数据输出的锁存器和缓冲器;一个8位数据输入的缓冲器。
PC口:一个8位数据输出的锁存器;一个8位数据输入的缓冲器。
通常PA口、PB口作为输入/输出口,PC口既可作为输入/输出口,也可在软件的控制下,作为两个4位端口,作为端口PA、PB选通方式操作时的状态控制信号。
(2)A组和B组控制电路
这是两组根据AT89S52单片机写入的“命令字”控制82C55工作方式的控制电路。A组控制PA口和PC口的上半部 (PC7~PC4);B组控制PB口和PC口的下半部 (PC3~PCO),并可使用“命令字”来对端口PC的每-位实现按位置“1”或清“0”
(3)数据总线缓冲器
数据总线缓冲器是一个三态双向8位缓冲器,作为82C55与系统总线之间的接口,用来传送数据、指令、控制命令以及外部状态信息。
2.工作方式选择控制字及端口PC置位/复位控制字
向82C55控制寄存器写入两种不同的控制字。首先来介绍工作方式选择控制字。
(1)工作方式选择控制字
82C55的端口有如下3种基本工作方式:
(1)方式0一基本输入/输出;
(2)方式1一选通输入/输出;
(3)方式2一双向传送 (仅PA口有此工作方式)。
端口的3种工作方式由写入控制寄存器的方式控制字来决定。方式控制字的格式如图所示。最高位D7=1,为本方式控制字的标志,以便与后面介绍的端口PC口置位/复位控制字相区别(端口PC置位/复位控制字的最高位D7=0)
3个端口中PC口被分为两个部分,上半部分随PA口称为A组,下半部分随PB口称为B组。其中PA口可工作于方式0、1和2,而PB口只能工作在方式0和1。
(2)PC口按位置位/复位控制字
8位中的任何一位,可用一个写入82C55控制口的置位/复位控制字来对PC口按位置“1”或清“0”,这一功能主要用于位控。PC口按位置位/复位控制字的格式如图所示。
3.82C55的三种工作方式
(1)方式0
方式0是基本输入/输出方式。方式0下,单片机可对82C55进行I/O数据的无条件传送。例如,单片机从82C55的某一输入口读入一组开关状态,从82C55输出控制一组LED指示灯的亮、灭。实现这些操作,并不需要任何条件,外设的IO数据可在82C55的各端口得到锁存和缓冲。因此,82C55的方式0称为基本输入/输出方式。
方式0下,3个端口都可以由软件设置为输入或输出,不需要应答联络信号。方式0基本功能如下:
(1)具有两个8位端口 (PA、PB)和两个4位端口 (PC的上半部分和下半部分);
(2)任何端口都可以设定为输入或输出,各端口的输入、输出共有16种组合。
82C55的PA口、PB口和PC口均可设定为方式0,并可根据需要,向控制寄存器写入工作方式控制字(见图9-3),来规定各端口为输入或输出方式。
(2)方式1
方式1是采用应答联络的输入/输出工作方式。PA口和PB口皆可独立地设置成这种工作方式。方式1下,PA口和PB口通常用于IO数据的传送,PC口用作PA口和PB口的应答联络信号线,以实现采用中断方式来传送I/O数据PC口的PC7~PC0的应答联络线是在设计82C55时规定好的,其各位分配如图9-5和图9-7所示,图中,标有I/O的各位仍可用作基本输入/输出,不作应答联络用。
•方式1输入
当任意端口工作于方式1输入时,各应答联络信号如图9-5所示。其中STB*与IBF为一对应答联络信号。图9-5中各应答联络信号的功能如下:
STB*----是由输入外设发给82C55的选通输入信号,低电平有效。
IBF----输入缓冲器满,应答信号。82C55通知外设已收到外设发来的且已进入输入缓冲器的数据,高电平有效。
INTR----由82C55向单片机发出的中断请求信号,高电平有效。
INTEA----控制PA口是否允许中断的控制信号,由PC4的置位/复位来控制。
INTEB----控制PB口是否允许中断的控制信号,由PC2的置位复位来控制。
工作流程如下:
外设向PC4询问(0信号),是否能传数据,并且将数据传到PA7~PA0寄存器中(暂存),如果寄存器存满了,PC5向两端发送1信号,并且PC4的信号变为1信号,这时PC4的信号变为1,则INTEA也会输出1,经过与门后,1&1=1,则INTRA也会输出1,再经过1个非门,产生低电平的外部中断响应,使单片机进入中断。最后D0~D7将数据传到P0.7~P0.0
•方式1输出
当PA口、PB口按照方式1输出时,应答联络信号如图9-7所示。
OBF*与ACK*构成了一对应答联络信号,图9-7中各应答联络信号的功能如下:
OBF*:端口输出缓冲器满信号,低电平有效,它是82C55发给外设的联络信号,表示单片机已经把数据输出到82C55的指定端口,外设可以将数据取走。
ACK*:外设的应答信号,低电平有效。表示外设已把82C55端口的数据取走。
工作流程如下:
首先单片机通过P0将数据存到82C55的D0~D7口,PC1发出选通信号,数据从82C55发送到输出外部设备中,外部设备收到后,发送应答信号,上面的选通也就结束了,返回到1信号,PC1也会向内部输出”1“信号,应答完毕后,INTEB也会向内部输出一个“1”信号,这样再通过与门1&1=1,通过非门,通知单片机发送结束,单片机产生中断响应。
(3)方式2
只有PA口才能设定为方式2。图9-9所示为方式2下的工作过程示意图。方式2实质上是方式1输入和方式1输出的组合。在方式2下,PA7~PA0为双向I/O总线。当作为输入端口使用时,PA7~PA0受OBFA*和IBFA控制,其工作过程和方式1输入时相同;当作为输出端口使用时,PA7~PA0受OBFA*ACKA*控制,其工作过程和方式1输出时相同。
方式2特别适用于像键盘、显示器一类的外部设备,因为有时需要把键盘上输入的编码信号通过PA口送给单片机,有时又需要把单片机发出的数据通过PA口送给显示器显示。
4.AT89S52单片机与82C55的接口设计
(1)硬件接口电路
图9-10所示为AT89S52单片机扩展一片82C55的电路图。图中74LS373是地址锁存器,P0.1、P0.0经74LS373与82C55的地址线A1A0连接;P0.7经74LS373与片选端相连,其它地址线悬空;82C55的控制线RD*、WR*直接与AT89S52单片机的RD*和WR*端相连:单片机的数据总线P0.0~P0.7与82C55的数据线D0~D7连接。
(2)82C55各端口地址的确定
图9-10中82C55只有3条线与单片机的地址线相接,片选端CS*、端口地址选择端A1、A0,分别接与P0.7、P0.1、P00相连的8 D锁存器的输出端Q7、Q1、Q0,其他地址线全悬空。显然只要保证P0.7为低电平时,即可选中82C55;若P0.1、P0.0再为“00”,则选中82C55的PA口。同理P0.1、P0.0为“01”、“10”、“11”分别选中PB口、PC口及控制口。
若端口地址用16位表示,其他未用端全设为“1”(也可把无用端全设为“0”,但一般习惯上把未用端置“1”),则82C55的PA、PB、PC及控制口地址分别为FE7CH、F57DH、 FF7EH、FF7FH6
(3)软件编程
[例9-4]要求82C55工作在方式0,且PA口作为输入,PB口、PC口作为输出,则程序如下:
[例9-5]对端口PC的置位/复位
82C55的PC口8位中的任意一位,均可用指令来置位或复位。例如,如果想把PC口的PC5置“1”,相应的控制字为00001011B=0BH(关于82C55的PC置位/复位的控制字说明见图9-4)。程序段如下:
五.I/O接口电路----利用74LSTTL电路扩展并行I/O口
在单片机应用系统中,有些场合需要降低成本、缩小体积,这时采用TTL,CMOS电路锁存器或三态门电路也可构成各种类型的简单输入/输出口。通常这种I/O都是通过P0口扩展。由于P0口只能分时复用,故构成输出口时,接口芯片应具有锁存功能; 构成输入口时,要求接口芯片应能三态缓冲输入,而数据的输入、输出则由单片机的读/写信号控制。
图9-12所示为一个利用74LS244(缓冲输入驱动器)和74LS273(8D锁存器) 芯片,将P0口扩展成简单的输入/输出口的电路。
74LS244和74LS273的工作受单片机的P2.0、3条控制线控制。
74LS244作为扩展输入口,它的8个输入端分别接8个按钮开关。74LS273的输出端接8个LED发光二极管,以显示8个按钮开关状态。当某条输入口线的按钮开关按下时,该输入口线为低电平,读入单片机后,其相应位为“0”,然后再将口线的状态经74LS273输出,某位低电平时二极管发光从而显示出按下的按钮开关的位置。
该电路的工作原理如下:
当P2.0=0,RD*=0(WR*=1)时,选中74LS244芯片,此时若无按钮开关按下,输入全为高电平。当某开关按下时则对应位输入为“0”,74LS244的输入端不全为“1”,其输入状态通过PO口数据线被读入AT89S51单片机片内。
当P2.0=0,WR*=0(RD*=1) 时,选中74LS273芯片,CPU通过PO口输出数据锁存到74LS273,74LS273的输出端低电平位对应的LED发光二极管点亮。
总之,在图9-12中只要保证P2.0为“0”,其他地址位或“0”或“1”即可如地址用FEFFH(无效位全为“1”,或用0000H(无效位全为“0”)都可。
由以上程序可以看出,对于所扩展接口的输入/输出就像从外部RAM读/写数据一样方便。图9-12仅仅扩展了两片,如果仍不够用,还可扩展多片74LS244、74LS273之类的芯片。但作为输入口时,一定要求有三态输入缓冲功能,否则将影响总线的正常工作。
六.I/O接口电路----用AT89S52单片机的串行口扩展并行口
AT89S52单片机串行口的方式0用于I/O扩展。在方式0时,串行口为同步移位寄存器工作方式,其波特率是固定的,为fosc/12 (fosc为系统的振荡器频率)。数据由RXD端(P3.0)输入,同步移位时钟由TXD端 (P3.1)输出。发送、接收的数据是8位,低位在先。
1.用74LS165扩展并行输入口
74LS165的时钟禁止端 (第15脚) 接地,表示允许时钟输入。当扩展多个8位输入口时,相邻两芯片的首尾 (QH与SIN) 相连。
图9-13所示为串行口外接两片74LS165扩展两个8位并行输入口的接口电路。
74LS165是8位并行输入串行输出的寄存器。当74LS165的S/L*端由高到低跳变时,并行输入端的数据被置入寄存器;当S/L=1,且时钟禁止端(第15脚)为低电平时,允许TXD (P3.1)移位时钟输入,这时在时钟脉冲作用下,数据由右向左方向移动。
在图9-13中,TXD(P31)作为移位脉冲输出与所有74LS165的移位脉冲输入端CP相连;RXD(P3.0)作为串行数据输入端与74LS165的串行输出端QH相连;P1.0与S/L*相连,用来控制74LS165的串行移位或并行输入;
上面程序中串行接收过程采用的是查询等待的控制方式,如有必要,也可改用中断方式。从理论上讲,按图9-13方法扩展的输入口几乎是无限的,但扩展越多,口的操作速度也就越慢。
2.用74LS164扩展并行输入口
图9-14所示为串行口外接两片74LS164扩展两个8位并行输出口的接口电路。74LS164是8位串入并出移位寄存器。
当AT89S52单片机串行口工作在方式0的发送状态时,串行数据由P3.0(RXD)送出,移位时钟由P3.1 (TXD)送出。在移位时钟的作用下,串行口发送缓冲器的数据一位一位地从P3.0移入74LS164中。需要指出的是,由于74LS164无并行输出控制端,因而在串行输入过程中,其输出端的状态会不断变化,故在某些应用场合,在74LS164的输出端应加接输出三态门控制以便保证串行输入结束后再输出数据。