第三章80C51单片机的指令系统.docx

上传人:b****6 文档编号:6951800 上传时间:2023-01-13 格式:DOCX 页数:19 大小:33.91KB
下载 相关 举报
第三章80C51单片机的指令系统.docx_第1页
第1页 / 共19页
第三章80C51单片机的指令系统.docx_第2页
第2页 / 共19页
第三章80C51单片机的指令系统.docx_第3页
第3页 / 共19页
第三章80C51单片机的指令系统.docx_第4页
第4页 / 共19页
第三章80C51单片机的指令系统.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

第三章80C51单片机的指令系统.docx

《第三章80C51单片机的指令系统.docx》由会员分享,可在线阅读,更多相关《第三章80C51单片机的指令系统.docx(19页珍藏版)》请在冰豆网上搜索。

第三章80C51单片机的指令系统.docx

第三章80C51单片机的指令系统

第三章80C51单片机的指令系统

3·180C51的指令系统具有哪些特点?

答:

80C51的指令系统由111条指令组成。

如果按字节数分类,有49条单字节指令、46条双字节指令和16条三字节指令,以单字节指令为主;如果按指令执行时间分类,有664条单周期指令、45条双周期指令和2条(乘、除)四周期指令,以单周期指令为主。

由此看来,80C51的指令系统具有存储效率高、执行速度快的特点。

除此而外,指令系统还有如下特点:

可以进行直接地址到直接地址的数据传送,能把一个并行I/I口中的内容传送到内部

RAM单元中而不必经过累加器A或工作寄存器Rn。

这样可以大大提高传送速度和缓解累

加器A的瓶颈效应。

用变址寻址方式访问程序存储器中的表格,将程序存储器单元中的固定常数或表格字

节内容传送到累加器A中。

这为编程翻译算法提供了方便。

在算术运算指令中设有乘法(MUL)和除法(DIV)指令。

指令系统中,一些对I/O口进行操作的指令具有"读一修改一写"的功能。

"读一修改

一写"指令是指:

在执行读锁存器的指令时,CPU首先完成将锁存器的值通过缓冲器BUF2读

人内部,进行修改、改变,然后重新写到锁存器中去。

这一特点是由I/O口的准双向特性所决定的。

这种类型的指令包含所有的口的逻辑操作(ANL、ORL、XRL)和位操作(JBC、CPL、

MOV、SETB、CLR等)指令。

80C51单片机内部有一个布尔(位)处理器,对位地址空间具有丰富的位操作指令。

尔(位)操作类指令共有17条,其中包括布尔传送指令、布尔状态控制指令、布尔(位)逻辑操作指令及布尔(位)条件转移指令。

3·2简述80C51的寻址方式和所涉及的寻址空间。

答:

寻址方式有下列七种。

●立即寻址:

指在指令中直接给出操作数。

●直接寻址:

指在指令中直接给出操作数单元的地址。

●寄存器寻址:

指令中将指定寄存器的内容作为操作数。

●寄存器间接寻址:

指令中要到寄存器的内容所指的地址去取操作数。

●相对寻址:

指令中给出的操作数为程序转移的偏移量。

●变址寻址:

以DPTR及PC作基址寄存器,累加器A作变址寄存器,以两者内容相加形成的16位程序存储器地址作为操作数地址。

●位寻址:

对数据位进行操作。

各寻址方式所涉及的寻址空间如题表3-1所列。

题表3-1寻址方式及寻址空间

3·3访问特殊功能寄存器和外部数据存储器,应采用哪种寻址方式?

答访问特殊功能寄存器,应采用直接寻址、位寻址;访问外部数据存储器,应采用寄存器间接寻址。

在0~255B范围内,可用寄存器R0、Rl间接寻址:

MOVXA,@R0或MOVXA,@R1

MOVX@R0,A或MOVX@R1,A

在0~64KB范围内,用16位寄存器DPTR间接寻址

MOVXA,@DPTR

MOVX@DPTR,A

3·4为什么说80C51的传送指令极为丰富?

为什么在某些传送中要旁路累加器A?

答:

(1)80C51的传送指令极为丰富

80C51具有丰富的数据传送指令,能实现多种数据的传送操作。

数据传送指令共有29

条,占总指令数的25%还多。

数据传送指令按功能可分为:

一般传送指令15条,目的地址传送指令1条,累加器传送指令11条和栈操作指令2条。

(2)传送中可以旁路累加器A

可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到内部

RAM单元中而不必经过累加器A,这称为旁路累加器A。

这样,不仅可以大大提高数据传送的速度,而且能缓解累加器A的瓶颈效应。

3·5对80C51片内RAM的128~255字节区的地址空间寻址时应注意些什么?

对特殊功能寄存器应采用何种寻址方式进行访问?

答:

在片内RAM的128~255字节区的地址空间寻址时应注意:

●只有80C52中有这部分地址空间;

●在这部分地址空间,只有间接寻址方式有效,即

MOV@Ri,A;i=0,1

MOVA,@Rj;i=0,1

对特殊功能寄存器可有两种寻址方式:

●直接寻址;

●对其地址的末尾为"0"和"8"的寄存器可进行位寻址。

3。

6在80C51的片内RAM中,己知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。

分析下面各条指令,说明源操作数的寻址方式,按顺存执行各条指令后的结果。

答:

指令源操作数的寻址方式执行指令后的结果

MOVA,40H直接寻址(A)=48H

MOVR0,A寄存器寻址(R0)=48H

MOVP1,#0F0H立即寻址(Pl)=0F0H

MOV@R0,30H寄存器间接寻址因(R0)=48H.(30H)=Ft8H

所以(48H)=38H

MOVDPTR,#3848H立即寻址(DPTR)=3848H

MOV40H,38H直接寻址(40H)=40H

MOVR0,30H直接寻址(R0)=38H

MOVD0H,R0直接寻址(D0H)=38H

MOV18H,#30H立即寻址(18H)=30H

MOVA,@R0寄存器间接寻址因(R0)=30H.(30H)=38H

所以(A)=38H

MOVP2,P1寄存器寻址(P2)=0F0H

3·7设计一段程序,其功能是:

将寄存器7的内容移到R6中。

答:

按题意程序设计如下:

MOVA,R7

MOVR6,A

3·8现需将外部数据存储器200DH单元中的内容传送到280DH单元中,请设计程序。

答:

按题意程序设计如下:

MOVDPTR,#200DH

MOVXA,@DPTR

MOVDPTR,#280DH

MOVX@DPTR,A

3·9已知当前PC(程存计数器)值10l0H,请用两种方法将程序存储器l0FFH中的常数送入累加器A。

答:

按题意有如下两种程序设计方法。

方法一:

MOVA,#0EFH

MOVCA,@A+PC

方法二:

MOVDPTR,#l0FFH

MOVA,#0

MOVCA,@A+DPTR

3.10在进行单字节减法运算时,应注意什么?

答:

在80C51指令系统中没有不带借位的减法,如果需要的话,应在"SUBB"指令前,用

“CLR,C”指令将CY清零。

3.11已知累加器A中存放两位BCD吗教,请编写程序其现十进制数减1。

:

按题意编写的程序如下:

MOVB,A;保存A

ANLA,#0FH;屏蔽A的高4位

CLRCY

SUBBA,#1

CJNEA,#0FH,LP

MOVA,B

ANLA,#0F0H

CLRCY

SUBBA,#l0H

ADDA,#9H

RET

LP:

ANLB,#0F0H

ORLA,B

RET

3·12试编写程序,将片外数据存储器中20H单元中的内容和21H单元的内容相乘,并将结果存放在22H和23H单元中,高位存放在高地址中。

答:

按题意编写的程序如下

MOVR0,#20H;R0指向20H

MOVXA,@R0;取来被乘数,

MOVB,A;存入B寄存器

MOVR0,#2lH;R0指向2lH

(或用INCR0)

MOVXA,@R0;取来乘数,人累加器A

MULAB;得结果

MOVR0,#22H;R0指向22H

(或用INCR0)

MOVX@R0,A;结果低位在22单元中

MOVR0,#23H;R0指向23H

(或用INCR0)

MOVA,B;结果高位在23单元中

MOVX@R0,A

3.13已知延时程序为:

DELAY:

MOVR2,#0FAH

LI:

MOVR3,#0FAH

L2:

DJNZR3,L2

DJNZR2,L1

RET

若系统的晶振频率为6MHz,求该延时子程存的延时。

答:

因为晶振频率为6MHz,所以机器周期为2us,DJNZ:

4us;MOV:

4us;RET:

4us。

指令周期数执行时间

DELAY:

MOVR2,#0FAH24us

LI:

MOVR3,#0FAH24us

L2:

DJNZR3,L224us

DJNZR2.L124us

RET24us

其中,0FAH=250。

所以,总时间=4us十(250×4us十4us)×250十4us=251.008ms。

3·14请将片外数据存储器地址为40H~60H区域的数据块,全部搬移到片内RAM内RAM的地址区域,并将原数据区全都填为FFH。

答:

按题意编程如下:

MOVR0,#40H;指向数据区首地址

MOVE_PRO:

MOVXA,@R0;取外部RAM中数据(用MOVX)

MOV@R0,A;将数据存大片内RAM中(用MOV)

INCR0;指针加1

CJNER0,#61H,MOVE_PRO;到数据区末地址了吗?

没有,循环

MOVR0,#40H;到了,继续,重新指向数据区首地址

MOVA,#0FFH;用#0FFH填充原来数据区

MOVE一PRO:

MOVX@R0,A

INCR0

CJNER0,#61H,MOVE__PRO1

RET

3·15试编写子程序,使间址寄存器R0所指的连续两个片外数据存储器RAM单元中的低4位二进制数,合并为一个字节,装入累加器A中。

己知R0指向低地址,并要求该单元低4位放在A中的高4位。

答:

按题意编程如下:

MOVXA,@R0;取来数据

ANLA,#0FH;屏蔽高4位,保留低4位

SWAPA;高4位与低4位对调

MOVB,A;保存在B寄存器中

INCR0;指向下一个地址

MOVXA,@R0;取来数据

ANLA,#0FH;屏蔽高4位,保留低4位

ADDA,B;合为一个数

3.16双字节与单字节无符号相乘,设被乘数存于41H、40H单元中,乘数存于R4中,乘积存于52H、51H、50H单元中(前者为高位字节,后者为低位字节,顺序排列)。

请编写此乘法程序段。

答:

按题意编写的乘法程序段如下:

(41H)(40H)

(R4)

×

(40H)(50H)

(51H)

+(52H)

(52H)(40H)+(51H)(51H)(50H)

MOVB,40H;被乘数低位进B寄存器

MOVA,R4;乘数进A

MULAB;乘

MOV50H,A;存积的低8位

MOV40H,B;暂存积的高8位人(40H)

MOVB,41H;被乘数高位进B寄存器

MOVA,R4;乘数进A

MULAB;乘

MOV5lH,A;暂存积的低8位人(51H)

MOV52H,B;存积的高8位

MOVA,40H;(40H)+(51H)→(51H)

CLRC

ADDA,5lH

MOV5lH,A

MOVA,52H;(52H)+(CY)→(52H)

ADDCA,#0

MOV52H,A

3·17试计算片内RAM区40H~47H八个单元中数的算术平均值,结果存放在4AH中。

答:

按题意编程如下

MOVR0,#40H;指向数据区首地址

MOV4AH,#0;清和数4AH,4BH单元

MOV4BH,#0

LOOP:

CLRC;清进位位

MOVA,@R0;取数据

ADDA,4AH;求和

MOV4AH,A;存回和数单元

MOVA,4BH

ADDCA,#0

MOV4BH,A

INCR0

CJNZR0,#48H,LOOP

MOVR2,#3;右移三次,相当于除8

ACALLRR_LOOP

RET

;双字节(4BH,4AH)右移子程序

;右移的次数在R2中

;

RR_LOOP:

CLRC;清进位位

MOVA,4BH

RRCA

MOV4BH,A

MOVA,4AH

RRCA

MOV4AH,A

DJNZR2,RR_LOOP

RET

3·18设有两个长度均为15的数组,分别存放在0200H和0500H为首地址的片外数据存储器区域中,试编写求其对应项之和的程序,结果存放在以0300H为首地址的片外数据存储器区城中。

答:

按题意编程如下

MOVR0,#02H;设置片外RAM的首地址的高位

;字节

MOVRl,#05H

MOVR2,#03H

MOVR3,#00H;设置片外RAM的首地址的低位

;字节

MOVA,#0

MOVB,#0

COM_SUM:

;求和程序

MOVDPL,R3;取出地址为02XXH和05XXH中的

;内容,相加

MOVDPH,R0

MOVXA,@DPTR

MOVB,A

MOVDPH,Rl

MOVXA,@DPTR

ADDA,B

MOVDPH,R2;相加结果存于03XXH中

MOVX@DPTR,A

INCR3;片外RAM的低位地址加1

CJNER3,#U5,COM_SUM;判断是否完成,否则继续

RET

3·19在起始地址为2100H,长度为64的数表中找出ASCII码"F",将其送到1000H单元中去。

答:

按题意编程如下:

MOVDPTR,#2100H;设置起始地址

MOVR0,#0;设置当前所在地址

SCH_PROO:

MOVDPL,R0;设置当前地址

MOVXA,@DPTR;取出当前地址的内容

INCR0;地址指针加1

CJNEA,#46H,SCH_PROl;判断当前地址内容是否为"F"

MOVDPTR,#1000H;是,则存储到1000H单元中

;并结束

MOVX@DPTR,A

RET

SCH_PRO1:

CJNER0,#64,SCH_PRO0;判断当前是否己取完所有的

;数,否则继续,是,则结束

RET

3·203000H为首地址的存储区域中,存放着14个由ASCII码表示的0~9之间的数。

试编写程序,将它们转换成BCD吗,并以压缩BCD码的形式,存放在2000H~2006H单元中。

答:

按题意编程如下:

MOVDPTR,#3000H;指向数据区首地址

MOVR2,#0;存数区地址的低字节

BCD_LOOP:

MOVXA,@DPTR;取数

ANLA,#0FH;屏蔽高4位,保留低4位

SWAPA;高4位与低4位对调

MOVB,A;暂存

INCDPTR;指向下一个数据

MOVXA,@DPTR;取数

ANLA,#0FH;屏蔽高4位,保留低4位

ADDA,B;组合成压缩BCD码

PUSHDPL;保存当前地址和BCD码

PUSHDPH

PUSHACC

MOVA,R2

MOVDPTR,#2000H;存数区首地址

ADDA,DPL

MOVDPL,A

POPACC

MOVX@DPTR,A

POPDPH

POPDPL

INCR2

INCDPTR

CJNZDPL,#14,BCD_LOOP

RET

注意:

0~9的ASCII码是30H~39H.

3·21试编写一段程序,把0500H一0506H单元的压缩BCD码转换成ASCII码,存放在0500H为首地址的存储单元中。

答:

按题意编程如下

MOVDPTR,#0500H;指向数据区首地址

MOVR2,#0;存放数据区地址的低字节

ASCIL.LOOP:

MOVXA,@DPTR;取数

MOVB,A;暂存

ANLA.#0FH;屏蔽高4位,保留低4位

ADDA,#30H;组成ASCII码

PUSHACC

MOVA,R2

MOVDPTR,#0500H;存数据区首地址

ADDA,DPL

MOVDPL,A

POPACC

MOVX@DPTR,A

MOVA,B

SWAPA;高4位与低4位对调

ANLA.#0FH;屏蔽高4位,保留低4位

ADDA,#30H;组成ASCII码

INCDPTR;指向下一个数据

MOVX@DPTR,A;取数

INCDPTR

INCR2

INCR2

CJNZR2,#14,ASCII_LOOP

RET

3·22请设计一段能准确地读出运行的定时器中计教值的程序。

答:

按题意编程如下

ORG000BH

AJMPIT0P

.

.

.

ORG100H

START:

MOVSP,#60H;设栈指针

ACALLPTOM3;调定时器初始化程序

.

.

MOVA,TL0先读TL0

MOV30H,A;存人30H单元

MOVA,TH0;再读TH0

MOV31H,A;存人31H单元

.

.

PTOM3:

MOVTMOD,#01H;定时器初始化,设T0为方式1

MOVTL0,#0

MOVTH0,#0

SETBR0;定时开始

SETBET0;开中断

SETBEA

RET

.

.

ITOP:

MOVTL0,#6H;TL0定时器中断程序

RETI

3·23请用位操作指令,求下列逻辑方程(注意:

原书的题目有错漏,这里己改正)。

答:

用位操作指令,求解逻辑方程如下

(1)P1.7=ACC.0*(B.0+P2.0)+P3.0

MOVC,B·0

ORLC,P2.0

ANLC,ACC.0

ORLC,/P3.0

MOVPl.7,C

(2)PSW.5==P1.0*ACC.2+B.6*P1.4

MOVC,Pl.0

ANLC,/ACC.2

ORLC,B.6

ANLC,/P1.4

MOVPSW.5,C

(3)PSW·5=P1.7*B·4十C十ACC·7*Pl.0

MOVB.0,C;保护CY

MOVC,/P1.7

ANLC,B.4

MOVB.l,C

MOVC,Pl.0

ANLC,/ACC.7

ORLC,B.0

ORLC,B·l

MOVPSW.5,C

3.24请指出下列程存中data、74H、78H的本质和数量。

答:

MOVA,#data;data为立即数

MOVA,data;data为片内RAM中的存储单元

MOVdatal,data2;datal,dala2均为片内RAM中的存储单元

MOV74H,#78H;#78H为立即数,74H为片内RAM中的存储单元

3.25设R0的内容为32H,A的内容为48H,而片内RAM的32H单元的内容为80H,40H单元的内容为08H。

请指出在执行下列程存段后,上述各单元的内容变化。

答:

指令执行结果

MOVA,@R0A的内容变为80H

MOV@R0,40H片内RAM的32H单元的内容为08H

MOV40H,A片内RAM的40H单元的内容为80H

MOVR0,#35R0的内容变为23H

结果:

R0的内容为23H,A的内容为80H,片内RAM的32H单元的内容为08H,40H单元的内容为80H。

3·2680C51有哪些逻辑运算功能?

各有什么用处?

设A中的内容为101010l0B,R4由表为01010101B。

请写出它们进行"与"、"或"、"异或"操作的结果。

(1)逻辑运算功能

单操作数逻辑运算指令,其操作对象都是累加器A,包括:

清0、取反、循环左移、带进位循环左移、循环右移、带进位循环右移和半字节互换指令。

双操作数逻辑运算指令,包括:

逻辑"与"(ANL)、逻辑"或"(ORL)及逻辑"异或"(XOR)三类操作。

布尔(位)逻辑操作指令,包括:

位逻辑"与"(ANL)及位逻辑"或"(ORL)两类操作。

(2)逻辑运算的用处

若是对口的操作,即为"读一改一写"。

逻辑"与"运算指令用做清除。

逻辑"或"运算指令用做置位。

用"RLCA"指令将累加器A的内容作乘2运算。

用"RRCA"指令将累加器A的内容作除2运算。

(3)操作的结果

A"与"R4操作的结果:

00000000B

A"或"R4操作的结果:

111111llB

A"异或"R4操作的结果:

111111llB

3·2780C51的转移类指令有何独特优点?

有哪几种无条件转移指令?

如何选用?

答:

1.条件转移指令

在条件转移指令中两类指令有独特的优点。

(1)比较转移(CJNE)指令

CJNEA,direct,relA内容与直接寻址单元内容比较,并转移。

CJNEA,#data,relA内容与立即数比较,并转移。

CJNERn,#data,rel寄存器内容与立即数比较,并转移。

CJNE@Ri,#data,rel间址单元内容与立即数比较,并转移。

这4条指令能对所有单元内容进行比较,当不相等时程序作相对转移,并指出其大小,以备作第二次判断。

其功能可从程序转移和数值比较两个方面说明。

程序转移:

若目的操作数=源操作数,则

程序顺利执行PC←(PC)+3

进位位清0CY←0

若目的操作数﹥源操作数,则

程序转移PC←(PC)+3十rel

进位位清0CY←0

若目的操作数﹤源操作数,则

程序转移PC←(PC)+3十rel

进位位清0CY←l

数值比较:

在80C51的指令系统中没有比较指令,两个数值的比较可利用这4条指令来实现,即可按指令执行后,根据CY的状态来判断数值的大小。

若(CY)=0,则目的操作数﹥源操作数;

若(CY)=1,则目的操作数﹤源操作数。

(2)循环转移(DJNZ)指令

80C51设有功能极强的循环转移指令:

DJNZRn,rel以工作寄存器作控制计数器。

DJNZdirect,rel以直接寻址单元作控制计数器。

这2条基本指令可派生出很多条不同控制计数器的循环转移指令,大大扩充了应用范围

和多重循环层次。

2.无条件转移指令

无条件转移指令的功能是程序无条件地转移到各自指定的目标地址去执行,不同的指令

形成的目标地址不同。

共有4条:

(1)相对转移(SJMP)指令

SJMPrel

指令的目标地址是由PC(程序计数器)和指令的第二字节带符号的相对地址相加而成的。

指令可转向指令前128B或指令后127B。

(2)短转移(AJMP)指令

AJMPaddr11

指令提供11位地址,目标地址由指令第一字节的高三位a10。

~a8和指令第二字节的a7~

a0所组成。

因此,程序的目标地址必须包含AJMP指令后第一条指令的第一个字节在内的

2KB范围内。

(3)长转移(LJMP)指令

LJMPaddrl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1