由于外部设备种类繁多,工作速度差异也很大,比如有低速的继电器、键盘,也有高速的ADC等,并且外部设备的信号多种多样,传送距离也不尽一致,因而CPU和外部设备之间的数据传送比存储器复杂,需要在CPU和外部设备之间设置I/O接口电路,对数据传送进行协调。
单片机与外部设备之间传送的信息包括数据信息、控制信息和状态信息。相应地,I/O接口电路中通常包含有可被CPU寻址的寄存器,用来保存输入输出数据信息,称为端口,可分为数据端口、控制端口和状态端口。端口的寻址在系统扩展中已有介绍。
I/O接口电路可采用中小规模集成电路芯片和可编程接口电路芯片。
外部设备分为输入和输出设备两种,故又称为输入/输出(I/O)设备。输入设备用于向计算机输入信息,例如人们只要按动键盘上的按键就可以向CPU送入数据或命令,A/D转换器也可以把模拟量变成数字量输入计算机;输出设备用于输出程序和运算结果,例如CRT(阴极射线管)能把输出信息显示在荧光屏上,D/A转换器把CPU处理后的数字信息还原为模拟量,以对被控对象进行实时控制。因此,键盘和A/D转换器属于输入设备,CRT和D/A转换器属于输出设备。由于CPU和外部设备间所传信息的性质、传送方式、传送速度和电平各不相同,因此CPU和外部设备之间不是简单地直接相连,而必须借助于I/O接口这个过渡电路才能协调起来。这和不同直径的自来水管需用“异型接头”连接的情形一样。
(1)对外部设备的选择。
MCS-51单片机采用总线结构形式,存储器、各种外部设备接口都挂在同一总线上。CPU与外部设备之间的数据交换都是通过I/O接口和数据总线来进行的。因此,单片机在进行I/O操作时,每一时刻只允许被选中的I/O接口与数据总线接通,而其他未被选中的接口应呈现高阻状态,与数据总线隔离。
可见,单片机采用分时数据传送方式完成对外部设备的选择。
(2)数据传送速度的匹配。
由于各种外部设备工作速度不一,单片机的数据I/O操作只能以异步方式进行。单片机通过接口电路传递外部设备状态信息,在确认外部设备数据准备就绪的前提下,才进行数据的传送。
(3)数据的缓冲和锁存。
为保证单片机和外部设备交换数据的正确性,接口电路在数据输出时应将数据锁存,而在数据输入时应给予缓冲。
(4)信息转换。
不同的外部设备可能有不同的信息类型、电平、数制等,接口电路需要对这些信息进行转换,提供单片机所要求的信息种类。
计算机系统中CPU通过I/O接口与外部设备之间的数据传送方式有4种,即无条件传送、查询传送、中断传送和直接存储器存取(Direct Memory Access,DMA)。单片机主要采用前3种方式。
(1)无条件传送方式。
无条件传送也称为同步程序传送。采用这种方式的前提是外部控制过程的各种运作时间是固定并且已知的,即外部设备总处于“就绪”状态。这样,在进行数据传送时,CPU不必查询外部设备的状态,随时可以与其进行数据I/O操作。
无条件传送方式的电路硬件和软件都很简单,外部设备通过三态缓冲器挂接在数据总线上,在CPU读信号和地址译码有效时选通;CPU输出数据经锁存器接至外部设备,在CPU写信号和地址译码有效时锁存数据。此方式适用于具有常驻或缓慢变化数据信号的外部设备(如机械开关、LED等),或速度很快、与CPU可同步工作的外部设备(如DAC等)。
(2)查询传送方式。
查询方式是条件传送,在外部设备状态为“就绪”或满足条件时,CPU才进行数据的I/O操作。
此方式电路简单,但由于需要等待查询,会占用CPU大量时间,数据传送效率较低,一般用于单通道和小规模计算机系统。
(3)中断方式。
中断方式不同于查询方式下CPU的主动查询。在中断方式下,CPU可工作于任何状态,外部设备在准备就绪后,主动通知CPU即请求中断;若CPU同意中断申请,则停止正在运行的程序,转入中断服务程序,执行相应的数据I/O操作。
在多任务的应用系统中,采用中断方式可大大提高系统效率。
不同的处理器对I/O口的访问方式是不同的,有的处理器(如80x86系列CPU)访问I/O口采用专门的指令,还有专门的I/O控制线。MCS-51单片机把存储器和I/O口统一编址,使用相同的读/写指令。
对I/O口功能的扩展,可以利用简单的TTL电路或MOS电路,也可以使用结构较为复杂的可编程接口芯片。TTL电路有54系列军品级器件、民品74LS系列;MOS电路中常用CMOS电路,如74HC系列。典型的可编程接口器件是Intel公司及其兼容的接口芯片:可编程并行接口(8155、8255)、可编程通用同步/异步通信接口(8251)、可编程定时器/计数器(8253)、可编程中断控制器(8259)及可编程键盘显示接口(8279)等。这些接口芯片与MCS-51单片机的信号线及时序是相适应的,并且都是用扩展片外数据存储器的并行总线进行访问(用MOVX类指令)的,因此与之接口非常方便。这类芯片的接口方法和典型电路也很容易查询到。
常用的扩展方法有两个:一是可以将I/O口作为片外数据存储器单元来看待,即与片外RAM统一编址;另一个是利用专门的控制线来分别选通I/O口和数据存储器。这里,仅介绍利用简单的TTL电路或CMOS电路扩展I/O口的方法。
与片外RAM统一编址是指把扩展的I/O口挂接在片外数据存储器空间,因而I/O口的输入、输出指令也就是片外数据存储器的读/写指令。其特点是:数据传输利用的是P0口,因此扩展接口均是8位口,传输数据简便;可以通过地址译码得到大量的I/O口,根据使用“@Ri”或“@DPTR”而有所区别。
使用这种方法扩展的输入口与输出口之间的对比见表8-1。
表8-1 扩展输入口与输出口的对比
扩展口类型 |
使用指令 |
选通信号 |
信号流向 |
数据状态 |
可使用器件 |
输入口 |
MOVX A,@Ri MOVX A,@DPTR |
外部设备流向累加器 |
将静态数据输入缓冲 |
74HC244、74HC373等 | |
输出口 |
MOVX @Ri,A MOVX @DPTR,A |
累加器流向外部设备 |
将数据输出锁存 |
74HC273、74HC377等 |
扩展输入口的器件应具有三态的特性,而扩展输出口的器件应具有锁存的特性。
此方法一般是通过MCS-51单片机P1口的I/O口线来选择外部I/O或RAM。这时,虽然CPU的地址、数据和读/写信号对于I/O和RAM是等同的,但通过P1口线状态的不同可以把二者区分开来。
扩展8KB数据存储器同时扩展一个输入口的电路如图8-1所示。由于扩展的外部设备仅用于输入,故CPU读操作时,需要区别存储器和外部设备。图8-1中,当P1.0=0且有效时,选通片外数据存储器6264,其地址范围为0000H~1FFFH;而当P1.0=l且有效时,选通输入口,口地址可为任意值。
电路中用具有三态特性的74HC373作为输入接口芯片,采用中断方式来读取外部设备输入。外围设备向单片机送数据时,选通信号连接在74HC373的锁存允许端口上,在选通信号的下降沿将发来的数据锁存,同时在低电平期间向CPU发出中断申请。
图8-1 扩展片外数据存储器和输入口电路
根据电路,可写出相应的程序段。在中断服务程序中,由P0口读入锁存器中的数据存入片外数据存储器6264从2000H开始的单元中。主程序初始化部分和中断服务程序如下。
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中断0入口地址
LJMP INTP
MAIN: CLR IT0 ;外部中断0设为低电平触发
MOV DPTR, #2000H ;设置数据区首地址
SETB EX0 ;允许外部中断0
SETB EA ;CPU开中断
…… ;执行其他任务或等待
ORG 1000H ;中断服务程序
INTP: SETB P1.0 ;指向输入口
MOVX A, @DPTR ;输入口数据读入累加器
CLR P1.0 ;指向6264
MOVX @DPTR,A ;存入数据区
INC DPTR ;调整数据指针
RETI ;中断返回