MCS-51单片机有4个并行的I/O口,分别为P0口、P1口、P2口和P3口,4个并行I/O口在单片机的使用中非常重要,可以说对单片机的使用就是对这4个口的使用。这4个并行I/O口除了作为基本的并行I/O口使用,还常作为其他功能使用,如P0口经常作为地址/数据复用总线使用[1], P2口作为高8位地址线使用,P3口用作第二功能(定时计数器、中断等等)使用。这样,单片机只有P1口作为基本的并行I/O口使用,如果在单片机的使用中对并行I/O口需求较多,对于并行I/O口的扩展就非常重要了。下面通过具体的实例(8位流水灯设计)来给出几种不同的并行I/O口扩展方法。
为了更好地说明以下几种不同的并行I/O口扩展方法,假设利用单片机实现流水灯的设计。采用单片机的P1口设计流水灯,电路如图1所示。
由图1可知,8只LED直接连接在单片机的P1口上,通过对单片机进行编程即可以实现8只发光二极管产生流水灯。
1 使用单片机的串行口扩展并行I/O口
单片机有一个全双工的串行口[2],这个口既可以用于网络通信,也可以实现串行异步通信,还可以作为移位寄存器使用。当单片机的串行口工作在模式0时,若外接一个串入/并出的移位寄存器(74LS164),就可以扩展一个8 bit并行输出口;若外接一个并入/串出的移位寄存器(74LS165),就可以扩展一个8 bit并行输入口。如图2所示,单片机外接一个串入/并出的移位寄存器(74LS164),这样就可以扩展8 bit并行输出口。
当单片机的串行口工作在模式0(作为移位寄存器使用)时需要注意:单片机原来的串行通信引脚RXD和TXD在这种工作方式下给出新的定义,原来用于串行接收数据的引脚RXD在这种工作模式下既可以接收也可以发送数据; 原来的串行发送引脚TXD在这种工作模式下则作为移位寄存器的脉冲输入端使用(通常接时钟端)。
单片机和串入/并出移位寄存器74LS164的连接:单片机的串行通信接收引脚RXD连接到串入/并出移位寄存器74LS164的输入引脚;单片机的串行通信发送引脚TXD连接到串入/并出移位寄存器74LS164的脉冲输入端;串入/并出移位寄存器74LS164的输出引脚连接8只发光二极管。这样,选择单片机的串行口工作模式0,通过通信引脚RXD发送实现流水灯的串行数据,然后通过74LS164转换成并行数据后传送给发光二极管,即可实现流水灯。这里需要注意74LS164数据的转换时间问题。
从图2可以看出,同样设计一个8位流水灯,采用上述方法只需要使用单片机的两个串行通信引脚RXD和TXD就可以完成。此时,对于P3口的其他位可以作为第二功能使用(定时、中断等)。
2 使用8255A(或8155)扩展并行I/O口
可编程并行接口芯片8255A[3]有3个并行的I/O口,分别为PA、PB和PC,这3个并行I/O口都可以通过编程决定它们的工作情况。8255A与单片机的连接如图3所示。
从图3中可以看出单片机与8255A的连接情况,利用单片机的P0口来分时传送地址和数据:P0口与8255A的8 bit数据线连接,用来传送数据和8255A的编程控制字;P0口连接地址锁存器74LS373输入端,74LS373的输出端连接8255A 的地址线A0、A1和片选信号CS。通过A0、A1(即P0.0、P0.1)的4种不同组合(00~11)选择8255的3个并行的I/O口之一和控制口。这样,通过对单片机和8255A编程,即可实现流水灯。
从图3可知,利用这种方法扩展I/O口一次可以扩展3个并行的I/O口。
同样,也可以使用可编程并行接口芯片8155来进行并行I/O口的扩展。8155有两个8 bit和一个6 bit的并行I/O口,同时它还有256 B的静态RAM和一个14 bit的计数器。
3 使用芯片74LS138扩展并行I/O口
74LS138 为3 线~8 线译码器,可将地址输入端(A、B、C)的二进制编码在输出端Y0~Y7对应地以低电平译出。比如:ABC=110时,则Y6输出端输出低电平信号。74LS138与单片机的连接如图4所示。
图4中,单片机的引脚P2.5、P2.6和P2.7分别连接74LS138的3个输入端A、B和C,74LS138的8个不同的输出端Y0~Y7分别连接8只发光二极管。这样,A、B和C的8种不同组合(000~111)分别选择74LS138的8个不同的输出端Y0~Y7, 即可实现流水灯。
4 几种扩展并行I/O口方法比较
使用单片机的串行口扩展并行I/O口时,单片机与串入/并出的移位寄存器(74LS164)连接比较简单,只需连接串行发送或接收引脚和移位脉冲引脚即可。但是这种扩展方法只能扩展一个8 bit并行I/O口,若需扩展更多的并行I/O口时就需要更多的移位寄存器芯片;在使用这种方法扩展并行I/O口时,需要了解串入/并出移位寄存器74LS164和并入/串出移位寄存器74LS165芯片的工作原理,还需要了解单片机的串行工作方式0工作模式。同时,如果单片机工作时需要进行串行通信,则这种方法就不能使用了。
使用并行接口芯片8255A扩展并行I/O口时,单片机与8255A的连接比较复杂,需要考虑数据线、地址线和控制线之间的连接,同时需要根据地址线的连接情况给出8255A各个并行I/O口的正确地址及8255A控制口的地址。另外,需要对8255A的编程控制字的定义及写入方法有很好的了解。但是这种扩展方法可以同时扩展3个8 bit并行I/O口,在需要扩展多个并行I/O口时此种方法比较好。
使用芯片74LS138扩展并行I/O口时,单片机与74LS138的连接比较简单,只需连接3个引脚即可。这种扩展方法也只能扩展一个8 bit并行I/O口,若需扩展更多的并行I/O口就需要更多的3线~8线芯片。但是,如果在单片机扩展其他的芯片时不需要使用高位的3根地址线(即P2.5~P2.7),则这种方法就能很好地把这3根地址线利用起来。
参考文献
[1] 李朝青, 刘艳玲. 单片机原理及接口技术(第4版)[M]. 北京:北京航空航天大学出版社,2013.
[2] 梅丽凤.单片机原理及接口技术(修订本)[M].北京:清华大学出版社,2011.
[3] 胡汉才. 单片机原理及其接口技术[M]. 北京:清华大学 出版社,2010.