时间:2024-07-28
周姝颖,林凡强,何凌霄,富 饶
(成都理工大学 信息科学与技术学院,四川 成都610059)
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单片机片内外设的不足。
MCS51单片机上电正常工作,需具备以下四点:
(1)电源。AT89S51系列单片机的第40引脚为 VCC,外加电压5 V工作电压,另外,单片机的第20引脚是GND,须连接到系统的地。
(2)复位电路。任何处理器都需要在上电时进行自身的复位,51单片机也不例外,上电复位电路是较为简单可靠的电路之一,不可缺少。复位电路如图1所示,该图为带上电复位及手动复位两种结合,二极管D1在系统瞬间掉电能帮助系统快速放电,使系统重新复位,以提高系统的可靠性。
(3)振荡电路。如图2所示,51单片机的第18脚和第19脚为两个外接振荡的引脚,是内部振荡方式的典型电路,外接的33 pF电容可以提高振荡的稳定性。
图1 复位电路
(4)EA。AT89S51单片机内部有4 KB的程序存储器,不需要外部的ROM空间,如果不够可以选择AT89S52或其他内部存储器更大的单片机,所以接高电平,即:不使用外部ROM,只使用内部的存储器。
图2 振荡电路
MCS51单片机的存储器分为片内和片外两个部分,即:内部的ROM/RAM和外部的ROM/RAM,编写程序时必须清楚每一个存储单元的用途和功能,这样才能更好地进行系统存储器资源的分配。51单片机的另一个特点是外部的RAM空间和I/O空间共用外部的64 KB空间,因为外部总线的地址线为16 bit,所以能够访问的最大地址空间为64 KB。51单片机系统在进行外部扩展时,所有外设的地址都分布在这64 KB的地址范围内,对于RAM来说,地址是连续的;而对于LCD、ADC等等部件,地址是不连续的。
AT89S51单片机为用户提供了可屏蔽中断源有5个,分别是:外部中断 0(入口地址为:0003H)、外部中断1(入口地址为:000BH)、定时器 0(入口地址为 :0013H)、定时器1(入口地址为:001BH)和串行中断 (入口地址为:0023H);不可屏蔽中断为复位(入口地址为:0000H)。51系列单片机的其他型号所提供的中断个数不尽相同,所有的单片机都包括上述这6个最基本的中断源,不同公司生产的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指令。因此,分析过程及使用中,都是以汇编语言为例进行扩展设计的。
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地址[2]。
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指令有着非常重要的作用。
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所示。
图4 译码电路图
图5 读写信号逻辑电路图
通过这样的组合后就可以在总线上数据有效的时间内,通过 74LS138的 Y0~Y7控制外设的片选,实现有效的数据读写。尤其是在扩展外部I/O口使用的74系列的逻辑电路芯片时,这个方法尤为重要,因为这类芯片没有外部的读/写信号,只能通过单片机外部的组合逻辑电路输出一个读/写信号宽度的脉冲用以控制此类I/O芯片。若外设信号控制信号为低电平脉冲,则刚好与3/8线译码器的输出匹配,此时直接相连即可;若外设控制信号需要的是高脉冲信号,则必须在3/8线译码器的输出外面再加一级反相器电路,常用的反相器为74LS04。
以写数据往外设为例,得到的时序流程如图6所示。读数据的时序与写数据一致,只是将写信号换成读信号[2]。
图6 译码时序
如前所述,51单片机供用户使用的I/O只有P1端口的8个引脚,远不能满足系统的需求,这样就必须通过总线的方法进行外部I/O扩展。在这里需要注意的是,51单片机系统外部I/O空间是和外部的RAM空间共用外部64 KB空间的。使用74LS573和74LS244分别进行行列的扩展,其中573锁存行信号,244读回数据,扩展了端口,实现了4×4的矩阵式行列扫描键盘,如图7所示。在此程序略,主要介绍扩展的方法[3]。
图8所示为4×4矩阵键盘连接图。
图7 扩展外部I/O实现键盘行列扫描
图8 4×4矩阵键盘电气连接图
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空间。
以此类推,假设有更多的空间需求时,还可使用专用译码器进行译码,来进行更多的选择。如此看来,就像其他处理器系统中类似地有着多余16条地址线一样。因此,在MCS51单片机系统中,实现大于64 KB空间的使用是很容易实现的,51单片机系统是使用非常成熟的系统了,而且,这样的使用可以给设计时提供了更多的选择,最大程度地降低设计成本和系统开发的难度,以及开发周期等[4]。
在单片机实验仪上,使用了总线方式进行扩展的模块单元还有LCD显示模块、AD/DA模块、流水灯模块等部分。
表1给出了实验仪上所有的通过总线方式进行外部扩展的单元及其地址和片选信号线,其中,各个模块的访问地址实际上是一个地址的范围,这里只给出一个。没有使用到的地址线默认为0。
表1 实验仪扩展总线地址分配
在使用C语言进行程序设计时,访问外部的总线也是非常方便的,只需要在程序中包含头文件absacc.h。该文件定义了访问外部空间的方法,如进行LCD的设计时,定义下面条语句:
之后,通过对定义的3个地址变量的访问,即可实现对外设的访问,非常方便。因此,在单片机适应的场合,对外设较多的情况之下,只要在速度等要求不高的情况下,采用51单片机也是可以实现高效的控制系统[5]。
通过上述分析及实际应用设计,可以看出MOVX指令在MCS51单片机系统中的重要地位,尤其是进行系统扩展时,其地位显得尤为重要。虽然,现在控制系统多采用了C语音进行设计,但是万变不离其宗,了解和掌握单片机系统底层的指令系统及其应用方法是非常重要的。只要使用外部总线扩展,本文提到的逻辑扩展方法都是非常可行的,而这些都是建立在对MOVX指令的使用和研究上。因此可以说,掌握了MOVX指令的使用,就掌握了MCS51单片机系统总线及时序扩展的方法。
[1]何立民.单片机应用文集[M].北京:北京航空航天大学出版社,1992.
[2]何立民.单片机高级教程——应用与设计[M].北京:北京航空航天大学出版社,2000.
[3]张毅坤.单片微型计算机原理及应用[M].西安:西安电子科技大学出版社,2002.
[4]胡汉才.单片机原理及其接口技术(第2版)[M].北京:清华大学出版,2004.
[5]谭浩强.C程序设计[M].北京:清华大学出版社,1996.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!