陈再清
十六位单片机MCS-96X序列内部的硬件构造比八位单片机MCS-51系列复杂,使得外围接口电路也变得复杂,主要体现在片外的总线配制方面。51系列单片机的总线片内、片外均为八位,不存在配制问题。而MCS-96片内是十六位结构,片外的数据总线可以配制成十六位,构成全十六位机;也可以配制成八位,构成准十六位机。当然,后者的性能会有所下降。而片外的数据总线又可分为程序存储器(ROM或EPROM)数据总线和数据存储器(RAM)数据总线,它们可以单独配制成十六位或八位,由此搭配而成的方式较多。可见,片外数据总线的配制成了十六位单片机外围接口中最复杂的部分。必须说明的是:这里所指的总线都是数据总线,因为不管片内片外,地址线均为十六位。在MCS-96中,以片内无程序存储器的芯片80C196XX(如80C196KB等)价格最低廉,故应用也最广。
1.与系统总线有关的几条控制线
系统总线的各种配制是依赖MCS-96的有关几条控制线(输入或输出脚)与芯片配置寄存器CCR的有关设置共同来实现的。它们是:
(1)地址总线分离控制线 ALE / ADV 地址片的锁存信号,高电平有效的 ALE,或低电平有效的ADV。
(2)读控制线 RD 从片外读取指令或数据时,RD低电平有效,而且总是按“字”进行。
(3)写控制线 WRL 和 WRH或 WR、BHE、A0向片外数据存储器写入数据时,有写高位字节、写低位字节、同时写高位和低位字节(一个字)三种写入方式。根据总线配置的方式的不同,会出现不同的控制信号。
(4)总线宽度选择线 BUSWIDTH 为0时选择八位;为1时选择十六位。但它还须与芯片配置寄存器CCR的D1位联合进行控制。
(5)取指信号线 INST80C196KB还输出一根取指信号线,平时该线输出低电平,只有在向片外取指时变为高电平(在地址有效期内)。利用这一特性可以将片外的程序存储空间和数据存储空间分开(类似51系列的PSEN信号线),使总的存储空间比原来的多出一倍。
(6)准备就绪信号线READY80C196为了适应片外慢速存储器或外设的时序要求,在正常执行的状态周期中插入等待周期,是否等待或等待多久由CCR寄存器的D5、D4位确定。
为了使单片机能实现多种总线配置方案,满足存储器的接口要求和就绪控制,所有可供灵活选择的信息都集中在芯片配置寄存器CCR中。有关该寄存器内各位功能请见前期的“准十六位单片机8098及80C198”一文中的表2。
外部数据总线的宽度不光与CCR 的D1位有关,还与控制线BUSWIDTH 的状态有关,两者的关系,如表 1所示。只有当D1=1,BUSWIDTH=1 时,数据总线宽度才为十六位。显见,当D1=1时,由BUSWIDTH的状态就可以单独决定总线的宽度,这可以通过地址线译码或程序运行来设定,使总线宽度随着功能的需求而进行动态的改变。
2.MCS-96外部数据总线的四种控制方式
(1)标准总线方式当CCR D2=1,CCR D3=1 时,80C196提供写信号WR、BHE 和地址锁存信号ALE。当总线宽度为十六位时(BUSWIDTH=1),须由WR、BHE和地址线A0通过译码电路获得WR HIGH、WR LOW信号,用来分别写偶单元字节(低位字节)和奇单元字节(高位字节)。当总线宽度为八位时(BUSWIDTH=0),只须用WR信号就可。地址线送出时,ALE变高,其下降沿作为外部地址的锁存信号。
(2)写选通方式 当CCR D1=1,且总线宽为十六位时( BUSWIDTH=1),WR、BHE 被WRL、WRH替代,分别向偶单元和奇单元写入一个字节。当总线宽度为八位时(BUSWIDTH=0),只使用WRL便可。地址锁存信号仍为ALE。写选通方式比标准方式的外部接口要简单,不需要译码电路,便可直接输出写信号。
此外还有地址有效选通方式,地址有效写选通方式以1、2两种较为常用。单片机还会因片内是否有程序存储器而使外部的系统总线有所区别。当内部有程序存储器时(ROM、EPROM等),其外部总线只涉及数据存储器(RAM),结构显然要简单。
外部程序存储器和数据存储器的数据总线并不要求使用相同的宽度,可以分别使用八位和十六位,这两者又会出现四种搭配方式:①八位总线程序存储器 + 八位总线数据存储器;②十六位总线程序存储器 + 八位总线数据存储器;③十六位总线程序存储器 + 十六位总线数据存储器;④八位总线程序存储器 + 十六位总线数据存储器。其中第四种通常不用。限于篇幅,下面仅以③为例进行说明。
十六位总线程序存储器 + 十六位总线数据存储器 其电原理图见图1,这是一种全十六位机,我们采用了最常见的80C196KB。它的封装采用68脚的PLCC结构。本电路的总线方式为写选通方式,芯片配制寄存器CCR的内容为:11111011B(FBH),其意是:无保密,不等待,地址信号线ALE,写选通信号WRL和WRH,数据总线宽度十六位,BUSWIDTH=1。
采用写选通方式,写信号线由标准方式的WR、BHE 自动转换为WRL、WRH,并直接对存储器进行写控制。它的取指及数据的读、写都是十六位的字操作(写数据时还可以单独由WRL或WRH分别对IC6或IC7进行字节操作)。故运行速度是最快的。
在器件的选用上,由于很难找到十六位的地址锁存器,这里用两片八位的地址锁存器IC2、IC3串级使用,分别用于低八位、高八位的地址锁存,这是一种价廉物美的方式,使用上也方便。同样的原因,十六位的程序存储器也采用了这种方式,用两片八位的EPROM芯片IC4、IC5串级使用,分别用于低八位(偶单元)的程序存储和高八位(奇单元)的程序存储。由于程序存储空间为16K×16位,存储芯片只能用两片27128。地址区间为0000~7FFFH。
对于数据存储器,也是用两片八位的RAM芯片IC6、IC7串级使用,IC6、IC7应用62128型号,该型号难找,此处用62256代替,将该片的地址脚A14接地即可。地址区间为8000~FFFFH。
必须说明的是:经IC2、IC3锁存器输出的地址线A0~A15中,A0必须空出,而将A1~A14依次接到IC4、IC5的地址脚A0~A13上。原因是取指时每次读一个字(IC4、IC5各读一个字节,且两片的地址相同),给出的地址必须能包含IC4低位字节(偶单元)和IC5高位字节(奇单元)。采用上述接法可以选中一个字中对应的低位字节和高位字节,并通过AD0~AD7和AD8~AD15读入到单片机内。
对于数据存储器,地址线A0也空出不用,A1~A14依次分别接到数据存储器IC6、IC7的A0~A13脚。不过,写数据存储器时,有三种写法:①可以写一个字(WRL、WRH同时变低),写低八位字节(WRL变低),写高八位字节(WRH变低)。
它的地址译码由地址线A15控制,为低时选通程序存储器IC4、IC5;为高时通过反相器D选通数据存储器IC6、IC7。图2给出了相应的时序图。
因IC4、IC5分别为偶单元和奇单元的存储芯片,应将目标代码文件依序分成0、2、4、6……2N(偶单元文件)和1、3、5、7……2N+1(奇单元文件)两个文件,并分别固化到IC4、IC5中。
CCR芯片配置寄存器参数写入法CCR是一个特殊的专用寄存器,无法通过对内部RAM的访问来改变CCR的内容,而该寄存器的内容对总线的设置又至关重要。80C196KB复位后不是从0000H开始运行,而是从2080H开始运行,而程序固化的起始地址却是从2000H开始。在2000~2079H单元中,除少数被定义外,大部分被保留下来用于未来的产品开发。其中有一个特殊的单元2018H称之为芯片配置字节(CCB),这个单元属于程序存储区的范围,应事先对其内容进行设置编程。当系统复位且只有复位时,CCB的内容才被自动装载到芯片配置寄存器CCR中,由此可见,CCR的内容是通过CCB的间接方式写入的。
2018H(CCB)单元的编程方法虽有几种,但最方便的莫过于使用编辑器来进行。因为编辑器一般都有CCB的设置界面,操作者只须依总线的需要进行设置,再将它与已编制好的源程序一起进行汇编,获得目标程序,再进行固化就可以了。而编辑器的种类很多,功能也不尽相同,工作的平台也不相同,但我们总可以在集成调试软件界面的主菜单—子菜单中,找到一个有关的设置界面,其中有五项是对CCB参数的设置。从1~5依次是总线宽度设置、写控制线设置、地址选通设置、等待周期设置、保密设置。它们依次对应于CCR中的D1、D2、D3、D4、D5、D6D7。下述的具体设置对应于图1总线的写选通方式。
设置完毕后,再将欲汇编的源程序调入窗口进行汇编,通过后,则刚才设置的内容已写入到2018H中。我们可以通过反汇编窗口进行查看,将程序区向前移至2018H单元,可以看到其内容是11111011(FBH)。
奇、偶单元固化文件的获取当程序存储器采用十六位数据总线时,如前面所述,必须将原来的固化文件一分为二,构成对应的偶(低八位)固化文件和奇(高八位)固化文件,并分别固化到偶(低八位)程序存储器IC4和奇(高八位)程序存储器IC5中。注意:这里所说的固化文件是指能用于程序存储器固化的可执行的二进制文件,而不是其它的文本文件。这类文件的后缀是 . ROM或 . BIN。 后缀为 .OBJ文件属格式机器码,这里不能使用。
采用编辑器可以很方便地获得固化文件,但要将固化文件(暂取名为:FILE.ROM)一分为二获得对应的偶文件(暂取名为:FILE(0).ROM)和奇文件(暂取名为:FILE(1).ROM),几乎所有的编辑器都无能为力。这需要我们自己动手编制软件才能完成。
首先,我们应先由FILE.ASM文件获取二进制固化文件FILE.ROM。获取该文件有多种方法,也可以采用编辑器。我们将文件的名称定为:FILE.ROM,记住文件的长度(字节数),将该文件放在某个子目录下(如C:A96FILE.ROM)。
下面,我们用C语言和BASIC语言各编制出一个程序(程序见本刊网站),用于将固化文件一分为二获得对应的奇、偶文件,这两个程序的效果是相同的,读者可以根据自己熟悉的语言选用一种。以C语言程序为例说明其使用方法,将上面的二进制文件FILE.ROM的长度填入程序的第8行(a=XX)*[1],再将文件名及路径填入第10、16、17、18、25、32行*[2]。然后运行该程序。运行通过后,退出菜单界面,便可显示原二进制固化文件FILE.ROM及偶文件FILE(0).ROM和奇文件FILE(1).ROM的内容(以十六进制方式显示,便于查看)。读者可将三个文件进行核对,正确与否一看便知。在子目录A96下即可获得对应的奇、偶文件。图3给出了C语言程序的简易流程图,BASIC语言程序的流程图与图3大同小异,只是某些过程顺序有些改动,该程序填入文件长度(第2行*[1])和文件名及路径(第3、4、5行*[2]),运行后将直接显示上述三个文件的十六进制值。将偶文件和奇文件分别固化到IC4 和 IC5中,并分别插入各自的插座,不可插错。
运行C语言程序时,有时需要连续运行两次方能获得对应的奇偶文件,而BASIC程序可以一次到位。