AT89C51单片机是ATMEL公司设计生产的与MCS51内核兼容的51系列单片机之一,该系列单片机以其优越的性能和成熟的技术在控制和自动化应用领域占有着较大的市场;除此以外,51单片机有着计算机系统中经典的总线结构,即:数据总线、地址总线和控制总线。
在实际应用中,单片机的4个端口中,P0口通常是作为地址/数据总线复用;P2口作为高8位地址总线,高8位地址线在有多余I/O的情况下,配合外部的组合逻辑电路一起构成外部总线译码使用;P3口通常作为第二功能使用,则提供给用户使用的I/O仅仅是P1口。在多数应用场合下是不能满足要求的,因此51单片机系统就或多或少地需要进行系统扩展。另外,由于其内部的RAM只有128 B,在使用C语言进行程序设计时显得比较不足,必要时需进行外部RAM扩展,方法与扩展外部I/O相同。实际应用中,使用总线方法可以较容易地实现51单片机外部的I/O、RAM、LCD、ADC、DAC等等外设的操作,以弥补51单片机片内外设的不足。
1 MCS51单片机系统的四要素
1.1 51单片机系统的启动
MCS51单片机上电正常工作,需具备以下四点:
(1)电源。AT89S51系列单片机的第40引脚为VCC,外加电压5 V工作电压,另外,单片机的第20引脚是GND,须连接到系统的地。
(2)复位电路。任何处理器都需要在上电时进行自身的复位,51单片机也不例外,上电复位电路是较为简单可靠的电路之一,不可缺少。复位电路如图1所示,该图为带上电复位及手动复位两种结合,二极管D1在系统瞬间掉电能帮助系统快速放电,使系统重新复位,以提高系统的可靠性。
(3)振荡电路。如图2所示,51单片机的第18脚和第19脚为两个外接振荡的引脚,是内部振荡方式的典型电路, 外接的33 pF电容可以提高振荡的稳定性。
(4)EA。AT89S51单片机内部有4 KB的程序存储器,不需要外部的ROM空间,如果不够可以选择AT89S52或其他内部存储器更大的单片机,所以接高电平,即:不使用外部ROM,只使用内部的存储器。
1.2 MCS51单片机系统的存储器结构
MCS51单片机的存储器分为片内和片外两个部分,即:内部的ROM/RAM和外部的ROM/RAM,编写程序时必须清楚每一个存储单元的用途和功能,这样才能更好地进行系统存储器资源的分配。51单片机的另一个特点是外部的RAM空间和I/O空间共用外部的64 KB空间,因为外部总线的地址线为16 bit,所以能够访问的最大地址空间为64 KB。51单片机系统在进行外部扩展时,所有外设的地址都分布在这64 KB的地址范围内,对于RAM来说,地址是连续的;而对于LCD、ADC等等部件,地址是不连续的。
1.3 51单片机的中断系统
AT89S51单片机为用户提供了可屏蔽中断源有5个,分别是:外部中断0(入口地址为:0003H)、外部中断1(入口地址为:000BH)、定时器0(入口地址为:0013H)、定时器1(入口地址为:001BH)和串行中断(入口地址为:0023H);不可屏蔽中断为复位(入口地址为:0000H)。51系列单片机的其他型号所提供的中断个数不尽相同,所有的单片机都包括上述这6个最基本的中断源,不同公司生产的51内核单片机中断源上有略微的区别。
1.4 51单片机的总线结构
由于51单片机真正可以作为双向I/O口应用的只有P1口,假设系统需要扩展外部的键盘,I/O就所剩无几了。因此,MCS51单片机应用系统设计都不可避免地需要进行系统的扩展,而I/O的扩展则是与系统总线紧密结合的。由于MCS51单片机的外部RAM和I/O口是统一编址的,因此,可以把单片机外部64 KB RAM空间的一部分作为扩展外围I/O口的地址空间。这样,单片机系统就可以把额外的RAM空间用来进行I/O空间的扩展,使用总线方式对外设进行访问[1]。
本文重点之一是介绍采用具有三态缓冲的74HC244芯片和输出带锁存的74HC573芯片来扩展一个4×4的小键盘,缓冲器和锁存器分别占用外部I/O空间中的两个地址。而无论是访问外部的RAM空间还是I/O空间,在进行汇编语言编程时都是通过MOVX指令来实现读写的。在使用C语音进行单片机程序设计时,虽然语言改变了,但是C语言程序反汇编后,访问外部仍然使用的是MOVX指令。因此,分析过程及使用中,都是以汇编语言为例进行扩展设计的。
2 MOVX指令的执行过程
MOVX指令是51单片机访问片外外设的唯一指令,与外部RAM或I/O空间进行数据的读写或者ADC和DAC等都需要使用这条指令。MCS51单片机外部RAM的地址空间为64 KB,地址总线为16 bit,访问外设可执行4条汇编指令:(1)MOVX A,@DPTR;(2)MOVX @DPTR, A;(3)MOVX A, @RI; (4)MOVX @RI, A。其中DPTR为16 bit地址寄存器,地址高8 bit存于DPH,地址低8 bit存于DPL,Ri(i=0,1)是8 bit寄存器,作为地址指针时仅存低8 bit地址。
MCS51执行上述指令时分为两个阶段:首先,是从程序存储器中取出指令代码,并进行译码;然后,执行对外设数据的读写操作。在这两个阶段中,P0口在指令执行过程中是分时复用口,指令前半个周期,低8 bit地址由地址锁存允许信号ALE控制一个8 bit的锁存器输出,接着输出8 bit数据至外部数据总线,P2口在此过程中一直输出高8 bit地址。
由上所述,假设使用R0和R1对外设的进行间接寻址方式的访问,那么可看作是一种页面寻址,将外部的64 KB空间分成了256页,每一页有256 B地址。寄存器P2的当前值决定了当前的页地址。MCS51单片机在复位时,P2端口寄存器数值为FFH,若程序运行中没有改变P2中的值,则R0和R1只能对FF00H~FFFFH范围的外部的间接寻址,即对第255个页面进行访问。往外部空间写1 B时序图如图3所示。
因此,使用DPTR作为数据指针或者是RI,都可以实现对外部64 KB空间的访问。而指令都是使用MOVX,可见MCS51单片机系统中,MOVX指令有着非常重要的作用。
3 时序分析及系统扩展
MCS51单片机的外部总线时序扩展主要包括外部的译码电路、锁存电路等组合逻辑电路,形成整个系统的外部总线,即:数据总线、地址总线、控制总线。
译码电路采用常用的74系列3/8线译码器74LS138,该芯片的A、B、C分别接地址的最高3位,即A13、A14、A15,译码电路如图4所示;138的使能端E3接高电平,E1和E2接的是EN_138,该信号是由单片机系统的读写信号经过组合得来的,当系统对外部的总线进行读写时,读/写信号其中一个为低电平,使得EN_138控制信号输出为一个低电平脉冲信号,此时,3/8线译码器的输出Y0~Y7其中一个也会输出一个低电平脉冲,用此脉冲就可以有效地对外部设备进行片选。逻辑电路如图5所示。
通过这样的组合后就可以在总线上数据有效的时间内,通过74LS138的Y0~Y7控制外设的片选,实现有效的数据读写。尤其是在扩展外部I/O口使用的74系列的逻辑电路芯片时,这个方法尤为重要,因为这类芯片没有外部的读/写信号,只能通过单片机外部的组合逻辑电路输出一个读/写信号宽度的脉冲用以控制此类I/O芯片。若外设信号控制信号为低电平脉冲,则刚好与3/8线译码器的输出匹配,此时直接相连即可;若外设控制信号需要的是高脉冲信号,则必须在3/8线译码器的输出外面再加一级反相器电路,常用的反相器为74LS04。
以写数据往外设为例,得到的时序流程如图6所示。读数据的时序与写数据一致,只是将写信号换成读信号。
4 I/O扩展实例
4.1 行列键盘扩展
如前所述,51单片机供用户使用的I/O只有P1端口的8个引脚,远不能满足系统的需求,这样就必须通过总线的方法进行外部I/O扩展。在这里需要注意的是,51单片机系统外部I/O空间是和外部的RAM空间共用外部64 KB空间的。使用74LS573和74LS244分别进行行列的扩展,其中573锁存行信号,244读回数据,扩展了端口,实现了4×4的矩阵式行列扫描键盘,如图7所示。在此程序略,主要介绍扩展的方法。
图8所示为4×4矩阵键盘连接图。
4.2 大于64 KB空间的扩展
MCS51单片机是8位的微控制器,外部地址总线共16 bit地址,能访问的空间共为64 KB,但是如果系统中所有的外设加起来需要的地址空间超过64 KB时(如128 KB、256 KB的RAM或者需要更多的I/O空间等情况出现)就需要使用P1口或者是P3口不使用的I/O口进行线选法译码或者译码法进行额外的扩展来实现。
这种情况在单片机系统中经常会遇到,本文中介绍一种基于分页原理的扩展方法。51单片机系统虽然只有16条地址总线,在系统需要较大的RAM或I/O空间时,可以将系统中空余的I/O口作为额外的外部地址使用,例如:使用P1.0时进行线选法译码时,就可以扩展外部的128 KB空间。当P1.0为低电平时,选择第1个64 KB空间;当P1.0为高电平时, 选择第2个64 KB空间。
以此类推,假设有更多的空间需求时,还可使用专用译码器进行译码,来进行更多的选择