伊万卡·特朗普的屁股:用8255实现IO口扩展

来源:百度文库 编辑:中财网 时间:2024/04/28 16:36:06

 1. 8255 的电路结构和功能

8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 8255作为主机与外设的连接芯片,提供与主机相连的3个总线接口:数据线、地址线、控制线接口。同时具有与外设连接的接口A、B、C口。

 1)与CPU连接部分

根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C口及控制寄存器,故地址线为两根A0~A1。此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。各信号的引脚编号如下:

(1)数据总线DB:编号为D0~D7,用于8255与CPU传送8位数据。

(2)地址总线AB:编号为A0~A1,用于选择A、B、C口与控制寄存器。

(3)控制总线CB:片选信号 、复位信号RST、写信号、读信号。当CPU要对8255进行读、写操作时,必须先向8255发片选信号 选中8255芯片,然后发读信号或写信号对8255进行读或写数据的操作。

2)与外设接口部分

根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。各通道的引脚编号如下:

(1)A口:编号为PA0~PA7,用于8255向外设输入输出8位并行数据。

(2)B口:编号为PB0~PB7,用于8255向外设输入输出8位并行数据。

(3)C口:编号为PC0~PC7,用于8255向外设输入输出8位并行数据,当8255工作于应答I/O方式时,C口用于应答信号的通信。

3)控制器

8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。如图7.5所示,相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下:

(1)A组控制器:控制A口与上C口的输入与输出。

(2)B组控制器:控制B口与下C口的输入与输出。

2. 8255芯片引脚与CPU的连接

1)数据总线DB引脚

8255的数据总线DB有8根:D0~D7。因为AT89C52用其P0口作为数据总线口,所以AT89C52与8255数据线连接为:AT89C52的P0.0~P0.7与8255的D0~D7连接。

2)地址总线AB引脚

8255的地址线AB有两根:A0~A1。A0、A1通过74HC373锁存器与AT89C52的P0.0、P0.1连接。A1A0取00~11值,可选择A、B、C口与控制寄存器。

3)控制总线CB

片选信号CS:由P2.5~P2.7经138译码器Y7产生。若要选中8255,则Y7必须有效,此时P2.7P2.6P2.5=111。由此可推知各口地址如下:

A口:111x~x00=E000H(当x~x=0~0时)。

B口:111x~x01=E001H(当x~x=0~0时)。

C口:111x~x10=E002H(当x~x=0~0时)。

控制口: 111x~x11=E003H(当x~x=0~0时)。

其中,x~x表示取值可任意,以各口地址不唯一。为了今后叙述方便,后面程序中8255的地址将全部使用E000H~E003H。

注意:此处要说明的是单片机与8255的连接方法是多种多样的,8255各口地址也随连接方式而变化。因此,读者在使用不同单片机系统时,8255的各口地址不会是上面所推导的E000H~E003H,本书仅是为了介绍一种具体的连接方法而导出上面的地址,这一点请读者一定要注意。读者在使用其他单片机系统时,只要将所用单片机系统8255各口地址做相应替换即可。

(1)读信号RD\:8255的读信号RD\与AT89C52的RD\相连。

(2)写信号WR\:8255的写信号WR\与AT89C52的WR\相连。

(3)复位信号RST:8255的复位信号RST与AT89C52的RST相连。

4)3个通道引脚

(1)A口的8个引脚PA0~PA7与外设连接,用于8位数据的输入与输出。

(2)B口的8个引脚PB0~PB7与外设连接,用于8位数据的输入与输出。

(3)C口的8个引脚PC0~PC7与外设连接,用于8位数据的输入与输出或通信线。

3.  8255初始化程序举例

【例7.1】  按照8255与AT89C52的连接图对8255初始化编程:

(1)A、B、C口均为基本I/O输出方式。

(2)A口与上C口为基本I/O输出方式,B口与下C口为基本I/O输入方式。

(3)A口为应答I/O输入方式,B口为应答I/O输出方式。

#include

#include

#define COM8255 XBYTE[0xe003]                     

#define uchar unsigned char

void init8255(void) { 

COM8255=0x80;                                

 

}

void main(void) {

}