您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《单片机原理与应用》 > 第3章 MCS-51单片机指令系统

第2节 数据传递指令

  单片机内部的端口寄存器与片外引脚是直接相连的,数据通过单片机内部数据总线传送到端口寄存器(用数据传送指令完成数据的传送),结合发光二极管硬件电路,二极管便发亮了。

  MCS-51单片机有哪些数据传递指令?

  在刚才的任务中,我们提到了数据传送指令以及数据传送操作,那么到底什么是单片机的数据传送操作?什么样的指令又叫数据传送指令呢?

  在计算机中将数据信息从源存储地址传送到目标存储地址的操作叫数据传送操作,完成数据传送的指令叫数据传送指令。

  MCS-51单片机的数据传送指令共有29条,数据传送指令的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志C,AC和OV,但可能会对奇偶标志P有影响。

  (1) 以累加器A为目的操作数类指令(4条)

  这4条指令的作用是把源操作数指向的内容送到累加器A。有直接、立即数、寄存器和寄存器间接寻址方式:

  MOV A,data ;(data)→(A) 直接单元地址中的内容送到累加器A

  MOV A,#data ;#data→(A) 立即数送到累加器A中

  MOV A,Rn ;(Rn)→(A) Rn中的内容送到累加器A中

  MOV A,@Ri ;((Ri))→(A) Ri内容指向的地址单元中的内容送到累加器A。

  例如:任务中“累加器A控制P1口的程序”里有一条MOV A,#0AAH指令就属于此类。

  (2) 以寄存器Rn为目的操作数的指令(3条)

  这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式:

  MOV Rn,data ;(data)→(Rn) 直接寻址单元中的内容送到寄存器Rn中

  MOV Rn,#data ;#data→(Rn)立即数直接送到寄存器Rn中。

  MOV Rn,A ;(A)→(Rn) 累加器A中的内容送到寄存器Rn中。

  例如:任务中“开幕式和闭幕式彩灯程序”里的 MOV R6,#200

  MOV R7,#200

  ……

  指令属于此类。

  (3) 以直接地址为目的操作数的指令(5条)

  这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中。有直接、立即、寄存器和寄存器间接4种寻址方式:

  MOV data,data ;(data)→(data) 直接地址单元中的内容送到直接地址单元。

  MOV data,#data ;#data→(data) 立即数送到直接地址单元。

  MOV data,A ;(A)→(data) 累加器A中的内容送到直接地址单元。

  MOV data,Rn ;(Rn)→(data) 寄存器Rn中的内容送到直接地址单元。

  MOV data,@Ri ;((Ri))→(data) 寄存器Ri中的内容指定的地址单元中数据送到直接地址单元。

  例如:任务中“流水式彩灯程序”里的 MOV P1,#0AAH。任务中“开幕式和闭幕式彩灯程序”里MOV P1,A指令属于此类。应该注意,这里DATA是用寄存器的名字表示的。

  (4) 以间接地址为目的操作数的指令(3条)。

  这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。有直接、立即和寄存器3种寻址方式:

  MOV @Ri,data ;(data)→((Ri)) 直接地址单元中的内容送到以Ri中的内容为地址的RAM单元。

  MOV @Ri,#data ;#data→((Ri)) 立即数送到以Ri中的内容为地址的RAM单元。

  MOV @Ri,A ;(A)→((Ri)) 累加器A中的内容送到以Ri中的内容为地址的RAM单元。

  (5) 查表指令(2条)

  这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式:

  MOVC A,@A+DPTR ;((A))+(DPTR)→(A) 表格地址单元中的内容送到累加器A中。

  MOVC A,@A+PC ;((PC))+1→(A),((A))+(PC)→(A) 表格地址单元中的内容送到累加器A中。

  在任务中“开幕式闭幕式彩灯程序”里就有 MOVC A,@ A + DPTR 指令讲预先制好的表格数据取出来。

  (6) 累加器A与片外数据存储器RAM传送指令(4条)

  这4条指令的作用是累加器A与片外RAM间的数据传送。使用寄存器寻址方式:

  MOVX @DPTR,A ;(A)→((DPTR)) 累加器中的内容送到数据指针指向片外RAM地址中。

  MOVX A, @DPTR ;((DPTR))→(A) 数据指针指向片外RAM地址中的内容送到累加器A中。

  MOVX A, @Ri ;((Ri))→(A) 寄存器Ri指向片外RAM地址中的内容送到累加器A中。

  MOVX @Ri,A ;(A)→((Ri)) 累加器中的内容送到寄存器Ri指向片外RAM地址中。

  (7) 堆栈操作类指令(2条)

  这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,下述的第一条常称为入栈操作指令,第二条称为出栈操作指令。需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。

  PUSH data ;(SP)+1→(SP),(data)→(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中。

  POP data ;(SP)→(data)(SP)-1→(SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作。

  (8) 交换指令(5条)

  这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。

  XCH A,Rn ;(A)←→(Rn)累加器与工作寄存器Rn中的内容互换。

  XCH A,@Ri ;(A)←→((Ri))累加器与工作寄存器Ri所指的存储单元中的内容互换。

  XCH A,data ;(A)←→(data)累加器与直接地址单元中的内容互换。

  XCHD A,@Ri ;(A3-0)←→((Ri)3-0)累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换。

  SWAP A ;(A3-0)←→(A7-4)累加器中的内容高低半字节互换。

  (9) 16位数据传送指令(1条)

  这条指令的功能是把16位常数送入数据指针寄存器。

  MOV DPTR,#data16 ;(data16)H→(DPH);(data16)L→(DPL)。16位常数的高8位送到DPH,低8位送到DPL。