首页 理论教育数据传送指令-单片机基础应用

数据传送指令-单片机基础应用

【摘要】:2)数据传送指令,加1、减1指令,逻辑运算指令不影响CY、OV和AC位。标志位的状态是控制转移类指令的判断条件。数据传送类指令是使用最频繁的指令,主要用于数据的复制、保存及交换。数据传送类指令的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP。其通用数据传送类指令格式为MOV 目的操作数,源操作数表3-2数据传送类指令注:√表示该指令影响某一标志位。外部RAM或I/O口之间的数据传送指令共有4条。

MCS-51单片机指令系统在功能上可以分为数据传输类指令(29条)、算术运算类指令(24条)、逻辑运算类指令(24条)、控制转移类指令(17条)和位操作类指令(17条)。

在单片机执行指令的过程中,分为取指令和执行指令两个基本内容。在取指令阶段,单片机从程序存储器中取出指令操作码,送至指令寄存器IR中,通过指令译码器的译码,产生一系列的控制信号。在执行指令阶段,利用指令译码产生的控制信号,进行指令规定的操作,操作结果对程序状态字PSW的标志位影响比较大。程序状态字PSW中,有P(奇偶)、OV(溢出)、CY(进位)和AC(辅助进位)4个测试标志,不同的指令对标志位的影响不同,归纳如下:

1)P(奇偶)标志仅对累加器A操作的指令有影响,凡是对A操作的指令都将A中的“1”的个数反映到PSW的P标志位上。

2)数据传送指令,加1、减1指令,逻辑运算指令不影响CY、OV和AC位。

3)加、减运算指令影响P、CY、OV和AC这4个标志位,乘、除法指令使CY=0,当乘积大于255或除数为0时,OV=1。

具体指令对标志位的影响可参阅不同的指令。标志位的状态是控制转移类指令的判断条件。

数据传送类指令是使用最频繁的指令,主要用于数据的复制、保存及交换。这类指令一般是将源操作数传送到指令所指定的目的操作数中,指令执行后,源操作数不变,目的操作数被源操作数所替换。数据传送类指令的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP。数据传送类指令如表3-2所示。

1.内部RAM数据传送类指令MOV

单片机内部RAM的数据传送最为频繁,相关的指令也最多(共16条),包括寄存器、累加器、RAM单元以及专业寄存器之间的数据传送。其通用数据传送类指令格式为

MOV 目的操作数,源操作数

表3-2 数据传送类指令

注:√表示该指令影响某一标志位。

1)立即寻址传送指令,共有如下5条:

这条指令的功能将16位的立即数的高8位送至DPH,立即数的低8位送至DPL,这条指令是3字节指令,即操作码占一个字节,16位立即数占两个字节。

例如,MOV DPTR,#1234H ;(DPH)←12H,(DPL)←34H

2)内部RAM单元之间的数据传送类指令,共有以下5条:

内部RAM单元之间的数据传送可以使用直接寻址、寄存器寻址和寄存器间接寻址方式。

例如,下列指令均属于内部RAM单元之间的数据传送。

3)通过累加器A的数据传送指令,共有以下6条:

2.外部RAM或I/O口之间的数据传送指令

对外部数据存储器或I/O口的访问只能使用寄存器间接寻址方式,使用的寄存器只能是DPTR和Ri(i=0,1)。需要注意的是访问外部数据存储器或I/O口必须使用“MOVX”操作码。由于外部RAM和I/O是统一编址的,共同占用一个64KB的空间,所以从指令本身无法区分是访问外部RAM还是I/O口,只能由硬件的地址分配情况来确定。

外部RAM或I/O口之间的数据传送指令共有4条。

1)使用DPTR进行间接寻址,DPTR寄存器是16位寄存器,因此可对外部数据存储器或I/O口的寻址范围为64KB。

执行第一条指令时,P 3.7引脚上输出有效信号,用作外部数据存储器或I/O口的读选通信号。DPTR所包含的16位地址信息由P0口(低8位)和P2口(高8位)输出,选中外部数据单元或I/O口的内容由P0口输入至累加器A中,P0口作为地址/数据分时复用的总线使用。

执行第二条指令时,P3.6引脚上输出有效信号,用作外部数据存储器或I/O口的写选通信号。DPTR所包含的16位的地址信息由P0口(低8位)和P2口(高8位)输出,累加器A的内容由P0口输出,P0口作为地址/数据分时复用的总线使用。

2)使用Ri(i=0,1)寄存器进行间接寻址,由于Ri(i=0,1)只能寻址256个字节,那么能否使用Ri对外部64KB空间进行寻址呢?回答是肯定的。单片机提供了P2专用寄存器,将外部RAM空间分成了256页,每一页有256个字节,这样整个访问空间也是256×256B=64KB,因此又将P2专用寄存器称之为页寄存器。

例如,外部数据区地址为2048H单元的内容为5AH,执行下列指令:

即将外部RAM(2048H)的内容5AH传送至累加器A中。

若使用Ri寄存器间接寻址,则指令如下:

即形成的外部数据地址为256×20H+48H=2048H,也是将外部RAM(2048H)的内容5AH传送至累加器A中。

采用这两种方式均可访问外部数据区或I/O口,但编程时建议大家使用DPTR寄存器间接方式。

3.程序存储器ROM数据传送指令

程序存储器ROM数据传送指令亦称查表指令,共有两条。

程序存储器ROM包括内部程序存储器和外部程序存储器。由于对程序存储器的访问只能读不能写,因此数据传送是单向的。

(www.chuimin.cn)

这两条指令均是从程序存储器中读取数据(如表格、常数等)。第一条指令是以PC作为基址寄存器,A的内容作为无符号数和PC的当前内容(下一条指令第一个字节地址)相加后得到一个16位的地址,把该地址指向的程序存储器单元的内容送至累加器A中。这条指令的优点是不改变其他专用寄存器和PC的状态,根据A的内容就可以取出表格中的常数;缺点是表格只能存放在该查表指令后的256个单元之内,因此表格大小受到限制,而且该表格只能被该程序段使用。

第二条指令是以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加后得到一个16位的地址,把该地址指向的程序存储器单元的内容送至累加器A中。这条指令的执行结果只与指针DPTR及累加器A的内容相关,与该指令的存放位置无关,表格的位置可在64KB程序存储器中任意安排,可被各个程序块使用。

【例3-6】若在片外ROM的2000H单元开始已存放有0~9的平方值,要求根据累加器A中的值0~9来查找对应的平方值。

【解】若用DPTR作为基址寄存器,可编程如下:

这时,A+DPTR的值就是所查平方值存放的地址。

若用PC作为基址寄存器,则应在MOVC指令之前先用一条加法指令进行地址调整。

其中,#data的值要根据MOVC指令所在的地址进行调整。设A*为原来累加器A中的值0~9,PC为MOVC指令所在的地址,假设为1FF0H,则可以用下面的方法来确定data值:

因此,程序中的指令应为

4.堆栈操作指令

堆栈操作指令有PUSH和POP指令两条,分别如下:

PUSH为入栈指令,是将其指定的直接寻址单元的内容压入堆栈。其具体操作是先将堆栈指针SP的内容加1,指向堆栈顶的一个空单元,然后将指令指定的直接寻址单元内容送到该空单元中。由于MCS-51是向上生长型的堆栈,所以进栈时堆栈指针要先加1,然后再将数据推入堆栈。

POP为出栈指令,是将当前堆栈指针SP所指示的单元内容弹出到指定的片内RAM单元,而后将SP减1。注意:使用堆栈时,SP的初始值最好重新设定(否则上电或复位后,SP的值为07H),并避开工作寄存器区和位寻址区,一般SP的值可以设置在30H或以上的片内RAM单元,但应注意不超出堆栈的深度。MCS-51型单片机的堆栈规则是“先进后出”。

另外,由于堆栈操作只能以直接寻址方式来取得操作数,所以不能用累加器A或工作寄存器Rn作为操作数。若要将累加器A的内容压入堆栈,应用指令PUSH ACC或PUSH 0E0H,这里ACC表示累加器的直接地址0E0H。出栈的应用指令以此类推。

【例3-7】在中断响应时,SP=07H,DPTR的内容为1234H,试分析执行下列指令后的结果。

【解】执行结果为:片内RAM的(08H)=12H,(09H)=34H,(SP)=09H,(DPTR)=1234H未变。

【例3-8】设(SP)=32H,片内RAM的30H~32H单元的内容分别为20H、23H和01H,执行下列指令后(DPTR)、(SP)为多少?

【解】

所以,(DPTR)=0123H,(SP)=30H。

5.交换指令

交换指令共有5条。

(1)字节交换指令

该指令的功能是将A的内容与源操作数的内容相互交换。

(2)半字节交换指令

该指令的功能是将A中内容的低4位和Ri所指的片内RAM单元中的低4位交换,它们的高4位保持不变。

(3)累加器A高低4位互换

该指令的功能是将A中内容的高、低4位互换。

例如,若(R0)=30H,(30H)=4AH,(A)=28H,则分别执行:

MCS-51指令系统的数据传送指令种类很多,这为程序中进行数据传送提供了方便。为了更好地使用数据传送指令,特作如下两个说明:

1)同样的数据传送,可以使用不同寻址方式的指令来实现。例如,要把A中的内容送入片内RAM的40H单元中,可由以下不同的指令来完成:在实际应用中选用哪种指令,可根据具体情况来决定。

2)数据传送类指令一般不影响程序状态字PSW。