第三章-80C51单片机的指令系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章80C51单片机的指令系统
3·1 80C51的指令系统具有哪些特点?
答: 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间接寻址:
MOVX A,@R0 或MOVX A,@R1
MOVX @R0,A 或MOVX @R1,A
在0~64KB范围内,用16位寄存器DPTR间接寻址
MOVX A,@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
MOV A,@Rj ;i=0,1
②对特殊功能寄存器可有两种寻址方式:
●直接寻址;
●对其地址的末尾为"0"和"8"的寄存器可进行位寻址。
3。
6 在80C51的片内RAM中,己知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。
分析下面各条指令,说明源操作数的寻址方式,按顺存执行各条指令后的结果。
答:
指令源操作数的寻址方式执行指令后的结果
MOV A,40H 直接寻址(A)=48H
MOV R0,A 寄存器寻址(R0)=48H
MOV P1,#0F0H 立即寻址(Pl)=0F0H
MOV @R0,30H 寄存器间接寻址因(R0)=48H.(30H)=Ft8H
所以(48H)=38H
MOV DPTR,#3848H 立即寻址(DPTR)=3848H
MOV 40H,38H 直接寻址(40H)=40H
MOV R0,30H 直接寻址(R0)=38H
MOV D0H,R0 直接寻址(D0H)=38H
MOV 18H,#30H 立即寻址(18H)=30H
MOV A,@R0 寄存器间接寻址因(R0)=30H.(30H)=38H
所以(A)=38H
MOV P2,P1 寄存器寻址(P2)=0F0H
3·7 设计一段程序,其功能是:将寄存器7的内容移到R6中。
答:按题意程序设计如下:
MOV A, R7
MOV R6, A
3·8 现需将外部数据存储器200DH单元中的内容传送到280DH单元中,请设计程序。
答:按题意程序设计如下:
MOV DPTR,#200DH
MOVX A,@DPTR
MOV DPTR,#280DH
MOVX @DPTR,A
3·9 已知当前PC(程存计数器)值10l0H,请用两种方法将程序存储器l0FFH中的常数送入累加器A。
答:按题意有如下两种程序设计方法。
方法一:
MOV A, #0EFH
MOVC A, @A+PC
方法二:
MOV DPTR, #l0FFH
MOV A, #0
MOVC A, @A+DPTR
3.10 在进行单字节减法运算时,应注意什么?
答:在80C51指令系统中没有不带借位的减法,如果需要的话,应在"SUBB"指令前,用“CLR,C”指令将CY清零。
3.11 已知累加器A中存放两位BCD吗教,请编写程序其现十进制数减1。
:按题意编写的程序如下:
MOV B,A ;保存A
ANL A,#0FH ;屏蔽A的高4位
CLR CY
SUBB A,#1
CJNE A,#0FH,LP
MOV A,B
ANL A,#0F0H
CLR CY
SUBB A,#l0H
ADD A,#9H
RET
LP:
ANL B,#0F0H
ORL A,B
RET
3·12 试编写程序,将片外数据存储器中20H单元中的内容和21H单元的内容相乘,并将结果存放在22H和23H单元中,高位存放在高地址中。
答:按题意编写的程序如下
MOV R0,#20H ;R0指向20H
MOVX A,@R0 ;取来被乘数,
MOV B,A ;存入B寄存器
MOV R0,#2lH ;R0指向2lH
(或用INC R0)
MOVX A,@R0 ;取来乘数,人累加器A
MUL AB ;得结果
MOV R0,#22H ;R0指向22H
(或用INC R0)
MOVX @R0,A ;结果低位在22单元中
MOV R0,#23H ;R0指向23H
(或用INC R0)
MOV A,B ;结果高位在23单元中
MOVX @R0,A
3.13 已知延时程序为:
DELAY: MOV R2,#0FAH
LI: MOV R3, #0FAH
L2: DJNZ R3,L2
DJNZ R2,L1
RET
若系统的晶振频率为6MHz,求该延时子程存的延时。
答:因为晶振频率为6MHz,所以机器周期为2us,DJNZ:4us;MOV:4us;RET:4us。
指令周期数执行时间DELAY: MOV R2, # 0FAH 2 4us
LI: MOV R3,#0FAH 2 4us
L2: DJNZ R3,L2 2 4us
DJNZ R2.L1 2 4us
RET 2 4us
其中,0FAH=250。
所以,总时间=4us十(250×4us十4us) ×250十4us= 251.008ms。
3·14 请将片外数据存储器地址为40H ~ 60H区域的数据块,全部搬移到片内RAM 内RAM的地址区域,并将原数据区全都填为FFH 。
答:按题意编程如下:
MOV R0,#40H ;指向数据区首地址
MOVE_PRO: MOVX A,@R0 ;取外部RAM中数据(用MOVX)
MOV @R0,A; 将数据存大片内RAM中(用MOV)
INC R0 ;指针加1
CJNE R0,#61H,MOVE_PRO ;到数据区末地址了吗?没有,循环
MOV R0,#40H ;到了,继续,重新指向数据区首地址
MOV A,#0FFH ;用#0FFH填充原来数据区
MOVE一PRO:MOVX @R0,A
INC R0
CJNE R0,#61H,MOVE__PRO1
RET
3·15 试编写子程序,使间址寄存器R0所指的连续两个片外数据存储器RAM单元中的低4位二进制数,合并为一个字节,装入累加器A中。
己知R0指向低地址,并要求该单元低4 位放在A中的高4位。
答:按题意编程如下:
MOVX A,@R0 ;取来数据
ANL A,#0FH ;屏蔽高4位,保留低4位
SW AP A ;高4位与低4位对调
MOV B,A ;保存在B寄存器中
INC R0 ;指向下一个地址
MOVX A,@R0 ;取来数据
ANL A,#0FH ;屏蔽高4位,保留低4位
ADD A,B ;合为一个数
3.16 双字节与单字节无符号相乘,设被乘数存于41H、40H单元中,乘数存于R4中,乘
积存于52H、51H 、50H单元中(前者为高位字节,后者为低位字节,顺序排列)。
请编写此乘法程序段。
答:按题意编写的乘法程序段如下:
(41H)(40H)
(R4)
×
(40H)(50H)
(51H)
+(52H)
(52H)(40H)+(51H)(51H)(50H)
MOV B,40H ;被乘数低位进B寄存器
MOV A,R4 ;乘数进A
MUL AB ;乘
MOV 50H,A ;存积的低8位
MOV 40H,B ;暂存积的高8位人(40H)
MOV B,41H ;被乘数高位进B寄存器
MOV A,R4 ;乘数进A
MUL AB ;乘
MOV 5lH,A ;暂存积的低8位人(51H)
MOV 52H,B ;存积的高8位
MOV A,40H ;(40H)+(51H)→(51H)
CLR C
ADD A,5lH
MOV 5lH,A
MOV A,52H ;(52H)+(CY)→(52H)
ADDC A,#0
MOV 52H,A
3·17 试计算片内RAM区40H~47H八个单元中数的算术平均值,结果存放在4AH中。
答:按题意编程如下
MOV R0,#40H ;指向数据区首地址
MOV 4AH,#0 ;清和数4AH,4BH单元
MOV 4BH,#0
LOOP:CLR C ;清进位位
MOV A,@R0 ;取数据
ADD A,4AH ;求和
MOV 4AH,A ;存回和数单元
MOV A,4BH
ADDC A,#0
MOV 4BH, A
INC R0
CJNZ R0,#48 H, LOOP
MOV R2,#3 ;右移三次,相当于除8
ACALL RR_LOOP
RET
;双字节(4BH,4AH)右移子程序
;右移的次数在R2中
;
RR_LOOP: CLR C ;清进位位
MOV A,4BH
RRC A
MOV 4BH,A
MOV A,4AH
RRC A
MOV 4AH,A
DJNZ R2,RR_LOOP
RET
3·18 设有两个长度均为15的数组,分别存放在0200H和0500H为首地址的片外数据存储器区域中,试编写求其对应项之和的程序,结果存放在以0300H为首地址的片外数据存储器区城中。
答:按题意编程如下
MOV R0,#02H ;设置片外RAM的首地址的高位
;字节
MOV Rl,#05H
MOV R2,#03H
MOV R3,#00H ;设置片外RAM的首地址的低位
;字节
MOV A,#0
MOV B,#0
COM_SUM: ;求和程序
MOV DPL, R3 ;取出地址为02XXH和05XXH中的
;内容,相加
MOV DPH,R0
MOVX A,@DPTR
MOV B,A
MOV DPH,Rl
MOVX A,@DPTR
ADD A,B
MOV DPH, R2 ;相加结果存于03XXH中
MOVX @DPTR, A
INC R3 ;片外RAM的低位地址加1
CJNE R3,#U5, COM_SUM ;判断是否完成,否则继续
RET
3·19 在起始地址为2100H,长度为64的数表中找出ASCII码"F",将其送到1000H单元中去。
答:按题意编程如下:
MOV DPTR,#2100H ;设置起始地址
MOV R0,#0 ;设置当前所在地址
SCH_PROO:
MOV DPL,R0 ;设置当前地址
MOVX A,@DPTR ;取出当前地址的内容
INC R0 ;地址指针加1
CJNE A,#46H,SCH_PROl ;判断当前地址内容是否为"F"
MOV DPTR,#1000H ;是,则存储到1000H单元中
;并结束
MOVX @DPTR, A
RET
SCH_PRO1:
CJNE R0, #64, SCH_PRO0 ;判断当前是否己取完所有的
;数,否则继续,是,则结束
RET
3·20 3000H为首地址的存储区域中,存放着14个由ASCII码表示的0~9之间的数。
试编写程序,将它们转换成BCD吗,并以压缩BCD码的形式,存放在2000H~2006H
单元中。
答:按题意编程如下:
MOV DPTR,#3000H ;指向数据区首地址
MOV R2,#0 ;存数区地址的低字节
BCD_LOOP: MOVX A,@DPTR ;取数
ANL A,#0FH ;屏蔽高4位,保留低4位
SW AP A ;高4位与低4位对调
MOV B,A ;暂存
INC DPTR ;指向下一个数据
MOVX A,@DPTR ;取数
ANL A,#0FH ;屏蔽高4位,保留低4位
ADD A,B ;组合成压缩BCD码
PUSH DPL ;保存当前地址和BCD码
PUSH DPH
PUSH ACC
MOV A,R2
MOV DPTR,#2000H ;存数区首地址
ADD A,DPL
MOV DPL,A
POP ACC
MOVX @DPTR,A
POP DPH
POP DPL
INC R2
INC DPTR
CJNZ DPL, #14, BCD_LOOP
RET
注意:0~9的ASCII码是30H~39H.
3·21 试编写一段程序,把0500H一0506H单元的压缩BCD码转换成ASCII码,存放在0500H为首地址的存储单元中。
答:按题意编程如下
MOV DPTR, #0500H ;指向数据区首地址
MOV R2, # 0 ;存放数据区地址的低字节
ASCIL.LOOP: MOVX A, @ DPTR ;取数
MOV B,A ;暂存
ANL A.#0FH ;屏蔽高4位,保留低4位
ADD A,#30H ;组成ASCII码
PUSH ACC
MOV A,R2
MOV DPTR, #0500H ;存数据区首地址
ADD A,DPL
MOV DPL,A
POP ACC
MOVX @ DPTR, A
MOV A,B
SWAP A ;高4位与低4位对调
ANL A.#0FH ;屏蔽高4位,保留低4位
ADD A,#30H ;组成ASCII码
INC DPTR ;指向下一个数据
MOVX @DPTR, A ;取数
INC DPTR
INC R2
INC R2
CJNZ R2,#14, ASCII_LOOP
RET
3·22 请设计一段能准确地读出运行的定时器中计教值的程序。
答:按题意编程如下
ORG 000BH
AJMP IT0P
.
.
.
ORG 100 H
START:MOV SP,#60H ;设栈指针
ACALL PTOM3 ;调定时器初始化程序
.
.
MOV A,TL0 先读TL0
MOV 30H,A ;存人30H单元
MOV A,TH0 ;再读TH0
MOV 31H,A ;存人31H单元
.
.
PTOM3:MOV TMOD,#01H ;定时器初始化,设T0为方式1
MOV TL0,#0
MOV TH0,#0
SETB R0 ;定时开始
SETB ET0 ;开中断
SETB EA
RET
.
.
ITOP:MOV TL0,#6H ;TL0定时器中断程序
RETI
3·23 请用位操作指令,求下列逻辑方程(注意:原书的题目有错漏,这里己改正)。
答:用位操作指令,求解逻辑方程如下
(1) P1. 7 = ACC. 0 * ( B. 0 + P2. 0 ) + P3. 0
MOV C,B·0
ORL C,P2.0
ANL C,ACC.0
ORL C,/P3.0
MOV Pl.7,C
(2) PSW. 5 == P1. 0 * ACC. 2+ B. 6 * P1. 4
MOV C,Pl.0
ANL C,/ACC.2
ORL C,B. 6
ANL C,/P1.4
MOV PSW.5,C
(3) PSW·5= P1.7* B·4十C 十ACC·7* Pl.0
MOV B.0,C ;保护CY
MOV C,/P1.7
ANL C,B.4
MOV B.l,C
MOV C,Pl.0
ANL C,/ACC.7
ORL C,B.0
ORL C,B·l
MOV PSW.5,C
3.24 请指出下列程存中data、74H、78H 的本质和数量。
答:MOV A, #data ;data为立即数
MOV A, data ;data为片内RAM中的存储单元
MOV datal, data2 ;datal,dala2均为片内RAM中的存储单元
MOV 74H,#78H ;#78H为立即数,74H为片内RAM中的存储单元
3.25 设R0的内容为32H,A的内容为48H,而片内RAM 的32H单元的内容为80H,40H
单元的内容为08H。
请指出在执行下列程存段后,上述各单元的内容变化。
答:指令执行结果
MOV A ,@ R0 A 的内容变为80H
MOV @ R0,40H 片内RAM 的32H 单元的内容为08H
MOV 40H ,A 片内RAM 的40H 单元的内容为80H
MOV R0,# 35 R0 的内容变为23H
结果: R0 的内容为23H ,A 的内容为80H ,片内RAM 的32H 单元的内容为08H ,40H单元的内容为80H 。
3·26 80C51有哪些逻辑运算功能?各有什么用处?设A中的内容为l0B,R4由表为B。
请写出它们进行"与"、"或"、"异或"操作的结果。
答(1)逻辑运算功能
①单操作数逻辑运算指令,其操作对象都是累加器A,包括:清0、取反、循环左移、带进位循环左移、循环右移、带进位循环右移和半字节互换指令。
②双操作数逻辑运算指令,包括:逻辑"与"(ANL)、逻辑"或"(ORL)及逻辑"异或"(XOR)三类操作。
③布尔(位)逻辑操作指令,包括:位逻辑"与"(ANL)及位逻辑"或"(ORL)两类操作。
( 2 ) 逻辑运算的用处
①若是对口的操作,即为"读一改一写"。
②逻辑"与"运算指令用做清除。
③逻辑"或"运算指令用做置位。
④用"RLC A"指令将累加器A的内容作乘2运算。
⑤用"RRC A"指令将累加器A的内容作除2运算。
( 3 ) 操作的结果
A"与"R4操作的结果: B
A"或"R4操作的结果: llB
A"异或"R4操作的结果: llB
3·27 80C51的转移类指令有何独特优点?有哪几种无条件转移指令?如何选用?
答: 1. 条件转移指令
在条件转移指令中两类指令有独特的优点。
(1)比较转移(CJNE)指令
CJNE A,direct,rel A内容与直接寻址单元内容比较,并转移。
CJNE A,#data,rel A内容与立即数比较,并转移。
CJNE Rn,#data,rel 寄存器内容与立即数比较,并转移。
CJNE @Ri,#data,rel 间址单元内容与立即数比较,并转移。
这4条指令能对所有单元内容进行比较,当不相等时程序作相对转移,并指出其大小,以备作第二次判断。
其功能可从程序转移和数值比较两个方面说明。
①程序转移:
若目的操作数=源操作数,则
程序顺利执行PC←(PC)+3
进位位清0 CY←0
若目的操作数﹥源操作数,则
程序转移PC←(PC)+3十rel
进位位清0 CY←0
若目的操作数﹤源操作数,则
程序转移PC←(PC)+3十rel
进位位清0 CY←l
②数值比较:
在80C51的指令系统中没有比较指令,两个数值的比较可利用这4条指令来实现,即可按指令执行后,根据CY的状态来判断数值的大小。
若(CY)=0,则目的操作数﹥源操作数;
若(CY)=1,则目的操作数﹤源操作数。
(2)循环转移(DJNZ)指令
80C51设有功能极强的循环转移指令:
DJNZ Rn,rel 以工作寄存器作控制计数器。
DJNZ direct,rel 以直接寻址单元作控制计数器。
这2条基本指令可派生出很多条不同控制计数器的循环转移指令,大大扩充了应用范围和多重循环层次。
2. 无条件转移指令
无条件转移指令的功能是程序无条件地转移到各自指定的目标地址去执行,不同的指令形成的目标地址不同。
共有4条:
(1)相对转移(SJMP)指令
SJMP rel
指令的目标地址是由PC(程序计数器)和指令的第二字节带符号的相对地址相加而成的。
指令可转向指令前128B或指令后127B。
(2)短转移(AJMP)指令
AJMP addr11
指令提供11位地址,目标地址由指令第一字节的高三位a10。
~a8和指令第二字节的a7~ a0所组成。
因此,程序的目标地址必须包含AJMP指令后第一条指令的第一个字节在内的2KB范围内。
(3)长转移(LJMP)指令
LJMP addrl6
指令提供16位地址,目标地址由指令第二字节和第三字节组成。
因此,程序转向的目标地址可以包含程序存储器的整个64KB空间。
(4)间接转移(JMP)指令
JMP @A+DPTR
指令的目标地址是将累加器A中的8位无符号数与数据指针DPTR的内容相加而得。
相加运算不影响累加器A和数据指针DPTR的原内容。
若相加的结果大于64KB,则从程序存储器的零地址往下延续。
3·28 为什么SlIMP指令的rel= 0FEH时,将实现单指令的无限循环?
答:
HERE:SJMP HERE
上述指令的机器码为80FF,即rel=0FEH,此时程序将在原地进行无限循环。
在等待中断或程序结束时常用此种办法。