许一洲
(西北民族大学 电气工程学院,甘肃 兰州730106)
80C51单片机指令系统共有111条指令,由操作码和操作数两部分构成[1]。这些指令包括数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令和位操作类指令[2]。其中,数据传送类指令在单片机中使用频繁,除了一般传送指令外,还有4类特殊传送指令。
一般传送类指令都是采用MOV操作符,可以分为16位传送和8位传送。
16位传送指令仅仅只有一条,功能是将源操作数data16送入目的操作数DPTR中,如:
MOV DPTR,#data16;
当源操作数data16为3456H时,执行以上操作后,(DPH)=34H,(DPL)=56H。这条指令一般用于给DPTR赋予ROM中的数据表的表头地址,也可以是某一片外RAM缓冲区的首地址或者是扩展的片外接口地址。
8位传送指令能够将源字节的内容拷贝至目的字节,且源字节的内容不会变化,属于字节传送。目的字节可以是累加器A、寄存器Rn或Ri、片内RAM单元地址及SFR地址direct。源字节中除了上述4类以外,8位立即数#data也可以作为源字节。以目的字节为准,将8位传送指令分成4类。
以累加器A为目的操作数的指令使用最频繁,其指令可以构造成以下4种,如:
MOV A,Rn;
MOV A,direct;
MOV A,@Ri;
MOV A,#data;
累加器A作为目的字节,执行后源字节即可送入累加器A。
由于目的字节为工作寄存器,因此源字节不能采用工作寄存器及其间址方式寻址。它的指令有以下3种,如:
MOV Rn,A;
MOV Rn,direct;
MOV Rn,#data;
指令执行后,源字节即可送入到工作寄存器Rn中。
由于direct也可以作为源字节(这里用direct1表示),因此其构造有5种方式,如:
MOV direct,A;
MOV direct,Rn;
MOV direct,direct1;
MOV direct,@Ri;
MOV direct,#data;
执行指令后,源字节即可送入direct中。
由于目的字节采用寄存器间址,因此源字节不能采用寄存器及其间址寻址,如:
MOV @Ri,A;
MOV @Ri,direct;
MOV @Ri,data;
由于操作符不同,将其他不是MOV操作符指令称为特殊传送指令,如MOVC、MOVX、PUSH、POP、XCH、XCHD以及SWAP。可将这些特殊传送指令分为ROM查表、外部RAM读/写、堆栈操作和交换指令4种。
ROM中通常存放两类内容:一是单片机执行的程序代码;二是固定不变的常数。因此,访问ROM实际上指的是读取ROM中的常数表的表项,简称查表,需经过累加器来完成。使用MOVC指令,可以由DPTR或PC内容为基址。
(1)以DPTR内容做基址时,如:
MOVC A,@A+DPTR;
需要注意,在执行指令时,需要使累加器A的内容与DPTR的内容16位无符号数相加,作为16位要访问的ROM地址,最后将该地址单元的内容送到累加器A中。例如,(DPTR)=3000H、(A)=40H时,最终结果A为3040H。
(2)以PC内容为基址时,如:
MOVC A,@A+PC;
执行该指令的时候,要注意PC内容会自动加1,然后与累加器A的16位无符号数相加,作为访问的16位ROM地址,最后送入累加器A。当上诉指令所在地址为1000H且(A)=30H时,执行后会将1031H单元内容送入累加器A。
单片机的片外RAM或接口会经常存放一些中间数据,在访问片外RAM或接口操作时可以有读和写两类,这时需要利用MOVX指令通过累加器来完成。
(1)做读操作时,可以将DPTR、R0或R1作为间址寻址器读片外RAM空间,如:
MOVX A,@DPTR;
MOVX A,@Ri;
若间址寄存器内容为3000H,(3000H)=30H,执行指令后(A)=30H。
(2)做写操作时,同样可将DPTR、R0或R1作为间址寄存器写外部RAM。与读操作的区别仅仅在于传输方向不同,如:
MOVX @DPTR,A
MOVX @Ri,A;
需要注意,片外扩展的I/O口也要通过MOVX进行数据输入输出。
堆栈是通过“后进先出”的原则在片内RAM中的一片存储区,固定的一端称为栈底,活动的一端称为栈顶,利用指针SP指向栈顶位置。
PUSH指令会先将SP的内容加1,之后将直接地址操作数送入SP所指的单元,如:
PUSH direct;
若(SP)=07H,(40H)=88H, 执 行“PUSH 40H”指令后,(SP)=08H,(08H)=88H。
POP指令是先将SP所指向的单元送入指令中的直接地址单元,然后再将SP内容减1,如:
POP direct;
若(SP)=5FH,(5FH)=90H, 执 行“POP 70H”指令后,(70H)=90H,(SP)=5EH。
MOV类指令传送只是将数据从源字节复制到目的字节的单向传送。当需要两字节或两半字节的双向交换时,需要利用数据交换指令,包括XCH、XCHD和SWAP。
(1)XCH作为字节交换指令,具有以下3种构造方式:
XCH A,Rn;
XCH A,direct;
XCH A,@Ri;
这3条指令均能实现操作数与累加器A内容的互换,如执行“XCH A,R0”,若(R0)=80H,(A)=20H,执行后(A)=80H,(R0)=20H。
(2)XCHD属于半字节交换,功能是间址操作数的低半字节与累加器A的低半字节内容互换如:
XCHD A,@Ri;
若(R0)=30H,(30H)=67H,(A)=20H,执行“XCHD A,@R0”指令后,(A)=27H,(30H)=60H。
(3)SWAP同样属于半字节交换,与XCHD不同的是,它是将累加器的高低4位互换,如:
SWAP A;
若(A)=31H,执行以上指令后,(A)=03H。
现阶段,单片机已被广泛运用于生产和生活中的各个领域。要熟练掌握单片机,必须要熟悉单片机的操作指令。数据交换指令是单片机操作指令的一个重要组成部分,对其深入学习,有助于进一步使用和发展单片机技术。