本讲我们将介绍8031单片机位操作类指令,然后进行地址译码及程序、数据存储器扩展实验。
位操作类指令的功能和用法
8031单片机不仅能对字节进行操作,而且能够对某些字节中的位进行传送、逻辑运算及条件转移等位操作(见表1)。与字节单元一样,位单元在片内RAM中也有自己的地址,请见表2所示。下面我们仍以TD-Ⅰ型机为例进行实验。
[实验1]利用位传送指令将位单元07H中内容传送到P1口的0P1端。实验子程序如下:
PRO:MOV 20H,#7FH ;(07H)=0
MOV C, 07H ;(CY)→(07H)
MOV 0P1,C ;(0P1)←(CY)
RET ; 返回
机器码为0100H:75 20 7F A2 07 92 90 22。键入TD-Ⅰ型机的学习程序和本实验子程序,去掉学习程序中的MOV P1,A指令,即将0033H:F5 90改为00 00。运行后将显示FEH,即0P1端为低电平。
[实验2] 利用位逻辑操作指令编制一个实现图1硬件电路功能的程序。

阻1电路中的逻辑关系Q=A·(B+C)-+D·E-。我们把0P1~4P1作为A~E端,7P1作为Q端,实验程序如下:
ORG 0000H
START:LJMP MAIN ;跳转到主程序
ORG 0100H
MAIN: MOV A,P1 ;取值并送累加器A
MOV P1 ;显示新的A~E端的值
MOV C, 1A ;(CY)←B
ORL C, 2A ;(CY)←B+C
ANL C, 0A ;(CY)←A·(B+C)
CPL C ;(CY)←A·(B+C)-
MOV F0, C ;(D5H)←A·(B+C)-
MOV C, 3A ;(CY)←D
ANL C, ;(CY)←D·E-
ORL C, F0 ;(CY)←A·(B+C)-
+D·E-
MOV 7P1,C ;(7P1)←A·(B+C)-
+D·E-
SJMP MAIN ; 重复上述操作
机器码为0000H:02 01 00/0100H:E5 90 F5 90 A2 E1 72 E2 82 E0 B3 92 D5 A2 E3 B0 E4 72 D5 92 97 80 E9。程序运行后,显示7FH。用一个1kΩ~5kΩ电阻串一根导线,一端接地,另一端触碰8031单片机的0P1端,即A4置低电平,这时7P1端变为高电平,V1亮。用导线一端接+5V端,另一端触碰0P1端,即可将A端置高电平。请用此方法检验这个电路状态是否全部正确。
[实验3] 利用位条件转移指令实现两个无符号数比较大小。
两个无符号数分别放在30H、31H片内RAM单元,比较结果要求如果30H单元中的数大,则P1口的前4个LED亮;如果31H单元中的数大,则后4个LED亮;如果相等则中间4个LED亮。实验子程序如下:
PRO: MOV 30H,#da1;(30H)←da1
MOV 31H,#da2;(31H)←da2
MOV A, 30H; (A)←da1
CJNE A, 31H,BIG;不相等则跳转
MOV A #3CH/REH;相等则显示3CH
BIG: JC SMALL ; da1小则跳转
MOV A, #F0H/RET;da1大,显示F0H
SMALL MOV A, #0FH/RET;da1小,显示0FH
机器码为 0100H:75 30 80 75 31 96 E5 30 B5 31 03 74 3C 22 40 03 74 F0 22 74 0F 22。运行后将显示0FH。请改变0102H或0105H中的数据再进行实验。
到此,MCS-51系列单片机全部指令就介绍完了。下面的内容将包括数据和程序存储器扩展、中断和定时/计数器使用、串行通信口使用及I/O口扩展等内容。
地址译码及存储器扩展实验
在实际应用中,最小系统往往不能满足实求,需要进行各种扩展。8031单片机加上地址锁存器74LS373就具备了扩展所需的全部地址线、数据线和控制线,这些线的功能及引脚号如图2所示。

[实验4] :地址译码实验。
74LS138是3-8线译码器,当其AG2-、BG2-、G1端控制信号有效时(分别为0、0、1),输出端0Y-~7Y-对应输入信号C、B、A的00D、001~111状态分别为011lllll、10111111~11111110,且每种状态只对应单一低电平输出。利用74LS138输出的低电平信号作为其他单元电路的选通信号,可以实现各个单元电路在内存空间的统一编址。
图3是对地址信号15A、14A、 13A进行译码,从而将64kB内存空间均匀分开的地址译码电路。当地址在0000H~1FFFH时,15A~13A状态为000,74LS138的0Y-端为低电平;当地址在2000H~3FFFH时,15A~13A为001,1Y-端为低电平;……当地址在E000H~FFFFH时,15A~13A为111,7Y-端为低电平。这样就把从0000H~FFFFH的64kB空间划分为每8kB一段的8段存储空间,利用0Y-~7Y-可以选通指定空间的单元电路。

把电路安排在《无线电》1990年第12期介绍的“万次多用实验电路板”上,焊接时注意焊点应覆盖住铆钉和周围的铜箔,确保连接的牢固和可靠。与TD-Ⅰ型机连接时,把软线焊在一个空IC插座的金属插槽中,用白胶布在软线的另一端作出标记。将所有引线引出后,在接近IC插座处将软线根部缚住。这样接口引线就制备好了。由于IC插座引脚较密,焊接时容易发生粘连,这时应适当用些助焊剂(如松香)整理焊点,并用万用表仔细检查。将接口引线与实验板对应端连妥,然后把接口IC插座插入贴焊在8031单片机或74LS373上的IC插座之中,扩展电路与主机就连好了。然后键入下面程序:
ORG 0000H
START: LJMP MAIN ;跳转到主程序
ORG 0100H
MAIN: MOV DPTR,#XXXXH;X=0~FH
MOVX A,@DPTR;送地址值
SJMP MAIN ;重复上述操作
机器码为0000H:02 01 00/0100H:90 XX XX E0 80 FA。运行后VH0~VH7亮灭与XXXXH对应。
[实验5] 程序—数据存储器扩展实验
程序存储器一般选用EPROM,其中内容不轻易修改。8031单片机利用PSEN-读取程序存储器指令,顺序执行。数据存储器一般选用RAM,用来存放各种数据。8031单片机最大可扩展程序存储器和数据存储器各64kB。为了实验方便,我们这里只进行程序—数据存储器扩展实验。在将来开发应用中,可灵活扩展程序存储器或是数据存储器。
图4电路是程序、数据存储器扩展实验电路。我们不难看出RAM6116E用作程序存储器,也用作数据存储器,其地址为C000H~C7FFH的2kB空间。为了验证扩展电路的正确性,我们可将DISP:MOV P1#F0H/SJMP DISP放入从C000H开始的存储空间,然后执行看V1~V8是否显示F0H。

由于TD-Ⅰ型机的手动编程电路只能对主机6116进行操作,所以不能用它将上述程序键入到C000H开始的扩展存储器之中。我们可以利用下面的块转送程序将0200 H:75 90 F0 80 FA传送到C000H开始的存储区中。
ORG 0000H
START: LJMP 0100H
ORG 0100H
TRS: MOV DPTRR,#0200H;0100H:90 02 00
MOV R2,#20H; 0103H:7A 20
MOV R0,#40H;0105H:78 40
LOOP1: MOVX A,@DPTR;0107H:E0
MOV @R0,A;0108H:F6
INC R0; 0109H:08
INC DPTR; 010AH:A3
DJNZ R2,L00P1;010BH:DA FA
MOV DPTR,#C000H;010DH:90 C0 00
MOV R2,#20H;0110H:7A 20
MOV R0,#40H;0112H:78 40
LOOP2: MOV A @R0,0114H:E6
MOVX @DPTR,A;0115H:F0
INC R0; 0116H:08
INC DPTR; 0117H:A3
DJNZ R2.LOOP2;0118H:DA FA
MOV P1,#00H;011H:75 90 00
STOP: SJMP STOP;011DH:80 FE
实验步骤如下:①键入本实验所有程序。②调试块传送程序,将010EH:C0 00改为03 00,然后运行;待V1~V8全灭后,检查0300H及其后内容是否与0200H及其后内容一致,如不一致检查块传送程序。③将010EH改回为C0 00,然后运行;待V1~V8全灭后,将0202H:F0改为其它数据如0FH;将0000H:02 01 00改为02 C0 00,然后运行。这时主机将运行扩展程序—数据存储器中的程序,结果应显示F0H。如结果不正确可检查电路中是否有连错或虚焊、虚接之处。
这里我们仅介绍了扩展价格较低的RAM6116的例子,有条件的读者可进一步练习扩展6264~62256RAM。(周振安)