上一讲介绍了8031单片机最小系统,有的读者会问,既然它可以工作了,那我能不能编个程序让它执行呢?我们说光有这个最小系统是不能把程序编到存储器中的。为了实现这一目的,还需要在最小系统基础上配备一些数据、地址置入装置(如常见的键盘、开关等)、数据显示装置(如LED数码管、LED发光二极管、电视等)和其它的辅助装置。TD-I(无线电爱好者天地-I)型单片学习机就是配备了数据、地址开关、LED发光二极管口显示电路及其它控制开关的最小单片机学习系统。
TD-I型机电路简单,没有一般学习开发系统常带有的监控(本机管理)程序,所以初学者可以直接面对这个单片机实际电路,了解单片机硬件电路是怎样工作的。该机的数据、地址置入电路采用了开关。所以该机也易于初学者对数据、地址等2进制信息产生感性认识。用该机可以编制简短的程序(不超过1kB),以了解指令的功能和用法。该机电路简单、价格低廉,专供单片机初学者进行学习之用,而用该机进行开发就显得力不从心了,这时应选择开发功能较强的学习开发装置。
TD-I型机电路原理
图1是TD-I型机的电路原理框图。该机实际上包括两套主要电路:单片机电路和手动编程电路,它们共用随机存储器RAM6116。当手动编程器接管RAM6116后(即S1置于“RD/WR”位置),我们可以通过地址和数据置入开关向RAM6116中写入指令(S2置于“WR”位置),或者通过地址开关读出指定地址中的指令(S2置于“RD”位置)。当单片机电路接管了RAM6116后(S1置于“RUN”位置),它们就组成了一个8031最小系统,可以执行RAM6116中的指令了。从图1框图中还可以看到一个口显示电路,它用来指示数据总线(7D~0D)或8031的P1口(7P1~0P1)的高低电平状态。当进行手动编程时,口显示电路指示数据总线的状态;当最小系统工作时,口显示器用来显示P1口的高低电平状态。

从图1中看出,74LS244、74LS257、74LS258等集成电路相当于“开关”。74LS244的控制端G-为低电平时,该“开关”接通;反之,G-为高电平时,则“开关”断开。74LS257和74LS258的控制端A-/B为高电平时,“二选一开关”倒向B口;反之,A-/B为低电平时,该“二选一开关”倒向A口。当S1置于“RD/WR”位置时,3个74LS257的控制端A-/B呈低电平,这时74LS257开关接通A口。这样,RAM6116的控制总线和地址总线(9A~0A)就与手动编程电路相应总线接通,即手动编程电路接管RAM6116。同时,74LS258的控制端A-/B也呈低电平,其A口与8个LED发光二极管相连,口显示电路指示数据总线的状态。这时进行手动编程,口显示器就会指示数据总线状态了。若是进行写入操作,把S2置“WR”位置,由于S1接“RD/WR”,“WR”端呈低电平,S2接“WR”后74LS244的控制端G-也呈低电平,这时数据总线与数据置入开关相通,故口显示器此时显示数据置入开关状态。这时我们置好地址置入开关,按一下S3,RAM6116的写控制端WR-变为低电平(同时V9也闪亮一下),数据(指令)便写入到RAM6116的指定存储单元。当要读出RAM6116数据时,可以把S2置于“RD”位置。此时74LS244控制端G-为高平,断开数据总线与数据置入开关的联系,也就是口显示电路不再显示数据置入开关的状态了。RAM6116的控制端WR-为高电平,不允许进行写入操作。而输出允许端OE-为低电平有效,这时RAM6116可以送出地址置入开关所指定的存储单元的数据到数据总线,并由口显示器显示出来。当把S1扳向“RUN”位置时,74LS257把RAM6116的地址总线和控制总线交给8031单片机;同时,由于平时S1-2接“RD/WR”,VCC通过R30给C3充电至VCC,RST为高电平。当S1-2接“RUN”后,电阻R30通过S1-2接地,电容C3开始放电;C3电压下降后,8031的RST端变为低电平,8031最小系统开始工作;此时,口显示电路显示8031的P1口状态。
图2是TD-I型机的电路图,参考前面的叙述,读者不难分析其工作原理。这里请读者思考一下,数据置入开关、地址置入开关是怎样决定数据或地址总线的电平状态的,口显示电路的8个发光二极管输入高电平亮还是输入低电平亮?需要解释的是,与上一讲介绍的8031最小系统相比,TD-I型机的8031共用了PSEN-、WR-、RD-三条控制线控制RAM6116,多用了WR-、RD-两条线,这是为什么?将来在学习单片机原理时会知道,8031除了要读取程序存储器(ROM)的指令外(PSEN-起作用),还要对扩展的数据存储器(RAM)进行写入、读出操作(此时WR-、RD-起作用)。TD-I型机只用一片RAM6116,既用作程序存储器,也用作数据存储器,所以这里用了三条控制线。

TD-I型机使用步骤
图3是TD-I型机操作面板图。向RAM6116写入数据时的步骤为:①将S1扳至“RD/WR”档。②将S2置于“WR”。③将地址置入开关置为指定地址,如地址为000H时,地址置入开关均排在上端;地址为15BH时,对应的地址总线各个端9A~0A分别是101010 1011,可将8A、6A、4A、3A、1A、0A等地址置入开关向下拨至1(高电平)。④将数据置入开关置为指定数据,这时V1~V8显示与数据置入开关位置一致。⑤按动S3,V9闪亮一下,一个数据就被置好了。

读出(检查)时的步骤为:①将S1扳至“RD/WR”档。②将S2置于“RD”位置。③拨动地址置入开关,这时就可以在V1~V8上读出(检查)指定存储单元的数据了。
写入、检查无误后,可将S1扳至“RUN”位置(S2应置“RD”档),单片机开始执行RAM6116中的程序。
使用实例
下面的程序可让8个LED发光二极管模拟2进制的加法运算。
ROG 0000 H
LJMP MAIN ;0000H:02 01 00
ROG 0100 H
MAIN: MOV A,#01H ;0100H:74 01
PLAY: MOV P1,A ;O102H:F5 90
LCALL DELAY ;0104H: 12 02 00
INC A ;0107H:04
LJMP PLAY ;0108H:02 01 02
ORG 0200 H
DELAY: MOV R1,#FFH ;0200H:79 FF
L2; MOV R2,#FFH ;0202H:7A FF
L1: NOP ;0204H:00
DJNZ R2,L1 ;0205H:DA FD
DJNZ R1,L2 ;0207H:D9 F9
RET ;0209H:22
该程序一开始就执行长跳转指令LJMP MAIN,跳转到0100H单元继续执行指令。为什么程序不依次往下执行,而要跳过一段存储空间呢?这是因为8031单片机的5个中断向量占用了0003H~002AH共40个地址单元。由于单片机复位后从程序存储器0000H单元开始执行,所以要在0000H~0002H安排一个跳转指令,以绕过该区。当不使用中断时(如本例),程序可以依次安排在从0000H开始的程序存储器中。为了养成良好习惯,我们建议设计程序时,应跳过该中断向量区。
在下页的“MCS—51指令码速查卡”中查到程序右侧的机器码,然后按上述方法将机器码键入TD—I型机中。如键入0000H:02时,可将地址址置入开关9A~0A置00 0000 0000,数据置入开关7D~0D置0000 0010。
仔细检查并修改正确后,将S1扳到“RUN”,应看到8只发光二极管跳动演示2进制加法运算。修改0201H(或0203H)单元中数据,可调整加法速度。
下面我们给出一个学习程序:
ORG 0000H
LJMP MAIN ; 0000H:02 00 30
ORG 0030H
MAIN: LCALL PRO ; 0030H:12 01 00
MOV P1,A ; 0033H:F5 90
LOOP: NOP ; 0035H:00
LJMP LOOP ; 0036H:02 00 35
ORG 0010H
PRO: MOV A,#F0H ; 0100H:74 F0
RET ; 0102H:22
这个程序可以用来学习指令。方法是把需要学习的指令安排在0100H开始的实验子程序区里。请注意不要忘记在实验子程序PRO最后,一定要把要显示的数据送到累加器A,然后返回(RET)主程序。执行本程序,V1~V8显示F0H。试修改程序中0101H单元中的内容,运行后看一看结果是否为你修改的数据。(刘尚诚)