第三章80C51单片机的指令系统Word文件下载.docx
《第三章80C51单片机的指令系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《第三章80C51单片机的指令系统Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
MOVXA,@R0或MOVXA,@R1
MOVX@R0,A或MOVX@R1,A
在0~64KB范围内,用16位寄存器DPTR间接寻址
MOVXA,@DPTR
MOVX@DPTR,A
4为什么说80C51的传送指令极为丰富?
为什么在某些传送中要旁路累加器A?
答:
(1)80C51的传送指令极为丰富
80C51具有丰富的数据传送指令,能实现多种数据的传送操作。
数据传送指令共有29
条,占总指令数的25%还多。
数据传送指令按功能可分为:
一般传送指令15条,目的地址传送指令1条,累加器传送指令11条和栈操作指令2条。
(2)传送中可以旁路累加器A
可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到内部
RAM单元中而不必经过累加器A,这称为旁路累加器A。
这样,不仅可以大大提高数据传送的速度,而且能缓解累加器A的瓶颈效应。
5对80C51片内RAM的128~255字节区的地址空间寻址时应注意些什么?
对特殊功能寄存器应采用何种寻址方式进行访问?
在片内RAM的128~255字节区的地址空间寻址时应注意:
●只有80C52中有这部分地址空间;
●在这部分地址空间,只有间接寻址方式有效,即
MOV@Ri,A;
i=0,1
MOVA,@Rj;
对特殊功能寄存器可有两种寻址方式:
●直接寻址;
●对其地址的末尾为"
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
7设计一段程序,其功能是:
将寄存器7的内容移到R6中。
按题意程序设计如下:
MOVA,R7
MOVR6,A
8现需将外部数据存储器200DH单元中的内容传送到280DH单元中,请设计程序。
MOVDPTR,#200DH
MOVXA,@DPTR
MOVDPTR,#280DH
MOVX@DPTR,A
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
SUBBA,#l0H
ADDA,#9H
RET
LP:
ANLB,#0F0H
ORLA,B
RET
12试编写程序,将片外数据存储器中20H单元中的内容和21H单元的内容相乘,并将结果存放在22H和23H单元中,高位存放在高地址中。
按题意编写的程序如下
MOVR0,#20H;
R0指向20H
MOVXA,@R0;
取来被乘数,
MOVB,A;
存入B寄存器
MOVR0,#2lH;
R0指向2lH
(或用INCR0)
取来乘数,人累加器A
MULAB;
得结果
MOVR0,#22H;
R0指向22H
MOVX@R0,A;
结果低位在22单元中
MOVR0,#23H;
R0指向23H
MOVA,B;
结果高位在23单元中
MOVX@R0,A
3.13已知延时程序为:
DELAY:
MOVR2,#0FAH
LI:
MOVR3,#0FAH
L2:
DJNZR3,L2
DJNZR2,L1
若系统的晶振频率为6MHz,求该延时子程存的延时。
因为晶振频率为6MHz,所以机器周期为2us,DJNZ:
4us;
MOV:
RET:
4us。
指令周期数执行时间
MOVR2,#0FAH24us
MOVR3,#0FAH24us
DJNZR3,L224us
DJNZR2.L124us
RET24us
其中,0FAH=250。
所以,总时间=4us十(250×
4us十4us)×
250十4us=251.008ms。
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
15试编写子程序,使间址寄存器R0所指的连续两个片外数据存储器RAM单元中的低4位二进制数,合并为一个字节,装入累加器A中。
己知R0指向低地址,并要求该单元低4位放在A中的高4位。
取来数据
ANLA,#0FH;
屏蔽高4位,保留低4位
SWAPA;
高4位与低4位对调
保存在B寄存器中
指向下一个地址
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
乘
MOV50H,A;
存积的低8位
MOV40H,B;
暂存积的高8位人(40H)
MOVB,41H;
被乘数高位进B寄存器
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
17试计算片内RAM区40H~47H八个单元中数的算术平均值,结果存放在4AH中。
按题意编程如下
MOVR0,#40H;
MOV4AH,#0;
清和数4AH,4BH单元
MOV4BH,#0
LOOP:
CLRC;
清进位位
MOVA,@R0;
取数据
ADDA,4AH;
求和
MOV4AH,A;
存回和数单元
MOVA,4BH
MOV4BH,A
INCR0
CJNZR0,#48H,LOOP
MOVR2,#3;
右移三次,相当于除8
ACALLRR_LOOP
;
双字节(4BH,4AH)右移子程序
右移的次数在R2中
RR_LOOP:
CLRC;
MOVA,4BH
RRCA
MOV4BH,A
MOVA,4AH
MOV4AH,A
DJNZR2,RR_LOOP
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
ADDA,B
MOVDPH,R2;
相加结果存于03XXH中
MOVX@DPTR,A
INCR3;
片外RAM的低位地址加1
CJNER3,#U5,COM_SUM;
判断是否完成,否则继续
19在起始地址为2100H,长度为64的数表中找出ASCII码"
F"
,将其送到1000H单元中去。
MOVDPTR,#2100H;
设置起始地址
MOVR0,#0;
设置当前所在地址
SCH_PROO:
MOVDPL,R0;
设置当前地址
MOVXA,@DPTR;
取出当前地址的内容
地址指针加1
CJNEA,#46H,SCH_PROl;
判断当前地址内容是否为"
MOVDPTR,#1000H;
是,则存储到1000H单元中
并结束
MOVX@DPTR,A
SCH_PRO1:
CJNER0,#64,SCH_PRO0;
判断当前是否己取完所有的
数,否则继续,是,则结束
203000H为首地址的存储区域中,存放着14个由ASCII码表示的0~9之间的数。
试编写程序,将它们转换成BCD吗,并以压缩BCD码的形式,存放在2000H~2006H单元中。
MOVDPTR,#3000H;
MOVR2,#0;
存数区地址的低字节
BCD_LOOP:
MOVXA,@DPTR;
取数
屏蔽高4位,保留低4位
高4位与低4位对调
暂存
INCDPTR;
指向下一个数据
组合成压缩BCD码
PUSHDPL;
保存当前地址和BCD码
PUSHDPH
PUSHACC
MOVA,R2
MOVDPTR,#2000H;
存数区首地址
ADDA,DPL
MOVDPL,A
POPACC
POPDPH
POPDPL
INCR2
INCDPTR
CJNZDPL,#14,BCD_LOOP
注意:
0~9的ASCII码是30H~39H.
21试编写一段程序,把0500H一0506H单元的压缩BCD码转换成ASCII码,存放在0500H为首地址的存储单元中。
MOVDPTR,#0500H;
MOVR2,#0;
存放数据区地址的低字节
ASCIL.LOOP:
MOVXA,@DPTR;
MOVB,A;
ANLA.#0FH;
ADDA,#30H;
组成ASCII码
PUSHACC
存数据区首地址
ADDA,DPL
MOVDPL,A
POPACC
MOVX@DPTR,A
MOVA,B
MOVX@DPTR,A;
INCDPTR
INCR2
CJNZR2,#14,ASCII_LOOP
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
ITOP:
MOVTL0,#6H;
TL0定时器中断程序
RETI
23请用位操作指令,求下列逻辑方程(注意:
原书的题目有错漏,这里己改正)。
用位操作指令,求解逻辑方程如下
(1)P1.7=ACC.0*(B.0+P2.0)+P3.0
MOVC,B·
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
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。
2680C51有哪些逻辑运算功能?
各有什么用处?
设A中的内容为101010l0B,R4由表为01010101B。
请写出它们进行"
与"
、"
或"
异或"
操作的结果。
答
(1)逻辑运算功能
单操作数逻辑运算指令,其操作对象都是累加器A,包括:
清0、取反、循环左移、带进位循环左移、循环右移、带进位循环右移和半字节互换指令。
双操作数逻辑运算指令,包括:
逻辑"
(ANL)、逻辑"
(ORL)及逻辑"
(XOR)三类操作。
布尔(位)逻辑操作指令,包括:
位逻辑"
(ANL)及位逻辑"
(ORL)两类操作。
(2)逻辑运算的用处
若是对口的操作,即为"
读一改一写"
。
运算指令用做清除。
运算指令用做置位。
用"
RLCA"
指令将累加器A的内容作乘2运算。
RRCA"
指令将累加器A的内容作除2运算。
(3)操作的结果
A"
R4操作的结果:
00000000B
111111llB
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←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