资源描述
第三章 89C51指令系统
第十章 系统实用程序
一、填空题:
1、 CPU在取指令时,采用 寄存器进行寻址;CPU在访问64KB的片外数据存储器时,一般采用 寄存器进行寻址。(PC,DPTR)
2、 当需要从51单片机程序存储器取数据时,采用的指令操作码应为 。(MOVC)
3、 假定(A)=68,(R5)=79 ,执行下列指令后,累加器A内容为 。(47H)
ADD A, R5
DA A
4、若A中数据为63H,那么PSW的最低位(奇偶位P)为 。(用“1”或“0”表示)(0)
5、访问89C51片外数据存储器采用的是 寻址方式。89C5片外可直接寻
址的程序存储空间最大可达 KB,可直接寻址的数据存储空间最大可达
KB。(寄存器间接寻址,64,64)
6、20根地址线的寻址范围可达 。(1MB)
7、指令AJMP的调用范围是 ,指令LJMP的调用范围是 。(2KB,64KB)
二、简答题:
1、访问内部RAM单元可以采用哪些寻址方式?访问外部RAM单元可以采用哪些寻址方式?访问特殊功能寄存器(SFR)可以采用哪些寻址方式?
答:对特殊功能寄存器只能采用直接寻址方式;对单片机内部RAM的高128个字节(80H~FFH),只能采用寄存器间接寻址;对外部扩展的数据存储器只能用MOVX指令访问,即寄存器间接寻址方式;而内部RAM的低128个字节(00H~7FH)既能用直接寻址方式,也能用寄存器间接寻址方式。
2、访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。
答:访问外部数据存储器可以用以下指令实现:
MOVX A, @Ri ;((Ri))→A,寄存器Ri指向的片外RAM地址中的内容送到累加器A中
MOVX @Ri, A ;A→((Ri)),累加器中内容送到寄存器Ri指向的片外RAM地址中
MOVX A, @DPTR ;((DPTR))→A,数据指针指向的片外RAM地址中的内容送到累
加器A中
MOVX @DPTR,A;A→((DPTR)),累加器中内容送到数据指针指向的片外RAM地址中
访问程序存储器可以用以下指令实现:
MOVC A, @A+DPTR ;((A+DPTR))→A,表格地址单元中的内容送到累加器A中
MOVC A,@A+PC;PC+1→PC,((A+PC))→A,表格地址单元中的内容送到累加器A
3、 试用下列3种寻址方式编程,将立即数0FH送入内部RAM的30H单元中。 (1) 立即寻址方式;(2) 寄存器寻址方式;(3) 寄存器间接寻址方式
答:(1)立即寻址方式: MOV 30H, #0FH
(2)寄存器寻址方式: MOV R5, #0FH
MOV 30H, R5
(3)寄存器间接寻址方式:MOV @R1, #0FH
MOV 30H, @R1
4、试根据指令编码表写出下列指令的机器码。
(1)MOV A,#88H 74H, 88H
(2)MOV R3,50H 0ABH, 50H
(3)MOV P1.1,#55H 75H, 91H, 55H
(4)ADD A,@R1 27H
(5)SETB 12H D2H, 12H
5、写出实现下列要求的指令或程序片段。
(1) 将R0的内容传送到R1;
(2) 内部RAM的20H单元内容传送到寄存器R1;
(3) 内部RAM的20H单元的D7和D3位清零,其它位保持不变;
(4) 外部RAM的1000H单元内容传送到内部RAM的60H单元中;
(5) 外部RAM的1000H单元内容传送到寄存器R2;
(6) 清除累加器高4位。
答:(1)MOV A, R0
MOV R1, A
(2)MOV R1, 20H
(3)MOV A, 20H
ANL A, #77H
(4)MOV DPTR, #1000H
MOVX A, @DPTR
MOV 60H, A
(5)MOV DPTR, #1000H
MOVX A, @DPTR
MOV R2, A
(6)ANL A, #0FH
6、指出以下指令中源操作数的寻址方式:
(1) MOV R7 ,#77H ;立即寻址
(2) MOV A, @R0 ;寄存器间接寻址
(3) MOVC A, @A+DPTR ;变址寻址
(4) SETB EA ;位寻址
(5) MOV A, SBUF ;直接寻址
(6) MOVC A, @A+PC ;变址寻址
(7) MOVX A ,@DPTR ;寄存器间接寻址
(8) SJMP LOOP ;相对寻址
(9) INC DPTR ;寄存器寻址
(10) CLR 20H ;位寻址
(11) CLR C ;位寻址
(12) PUSH 03H ;直接寻址
7、试编写—段程序,将R3中的数乘4(用移位指令)。
答: MOV A, R3
MOV 23H, #02H
L0:DJNZ 23H, L1
L1: RL A
SJMP L0
8、已知A = 83H,R0 = 17H,(17H)= 34H,请写出执行完下列程序段后A的内容。
答: ANL A, #17H A = 03H
ORL 17H, A (17H)= 37H A = 03H
XRL A, R0 A = 34H
CPL A A = CBH
9、设NEXT是目标指令标号,其值为0123H,求下列指令的机器码。
(1) 0100H: SJMP NEXT 解: rel=0123H-(0100H+2)=21H
0102H: …… 机器码为:0100H: 80H 21H
(2) 7100H: LJMP NEXT 解: 机器码为:7100H: 02H 01H 23H
(3) 0123H NEXT:SJMP NEXT
解: rel=0123H-(0123H+2)=-2=0FEH, 故机器码为:0123H: 80H 0FEH
(4) 0178H: AJMP NEXT
解:当前PC =0178H+2 =017AH = 00000 001 0111 1010 B ;目标指令地址0123H提供的低11位地址为 001 0010 0011代入机器码格式中,
故机器码为:0178H: 21H 23H (001 00001H 0010 0011B)
10、执行某LCALL指令后,堆栈内容如图所示,问该
指令的首址是多少?它执行前SP的内容为多少?子程
序中的两条现场保护指令依次是什么?
答:该指令首址4A50H,执行前SP的内容是2FH,
程序中的两条现场保护指令依次是:
PUSH ACC
PUSH PSW
三、简单编程题:
1、编程,查找在内部RAM的20H~50H单元中是否有0AAH这个数,若有将51H单元置
01H;若未找到,将51H单元置0。
答: MOV R0, #20H
MOV R1, #31H
LOOP:CJNE @R0, #0AAH, NEXT
SJMP LT
NEXT: INC R0
DJNZ R1, LOOP
MOV 51H, #00H
SJMP ED
LT: MOV 51H, #01H
ED: RET
2、编程,查找片内RAM的20H~50H单元中出现00H的次数,并将查找的结果存入51H。
答: MOV R0, #20H
MOV R1, #31H
CLR A
LP: MOV @R0, #00H, NEXT
INC A
NEXT:INC R0
DJNZ R1, LP
MOV 51H, A
RET
3、片外RAM中存有一个若干字符的数据块,首址为SOURCE,要传到内部RAM以DIST开始的区域直到遇到“$”时结束。“$”也要传送。
答: MOV DPTR, #SOURCE
MOV R0, #DIST
LOOP: MOVX A, @DPTR
MOV @R0, A
CJNE A, #24H, NEXT
SJMP ED
NEXT:INC DPTR
INC R0
SJMP LOOP
ED: RET
4、编程把片外RAM从2000H开始存放的8个数传送到片内30H开始的单元中。
答: MOV DPTR, #2000H
MOV R0, #30H
MOV R2, #08H
LOOP: MOVX A, @DPTR
MOV @R0, A
INC DPTR
INC R0
DJNZ R2, LOOP
RET
5、 若单片机得主频为12MHz,试用循环转移指令编制延时20ms的延时子程序。并说明这种软件延时方式的优缺点。
解: 1T=12×(1÷12MHZ)=1μs
DELAY: MOV R7, #20 ;1T
LP: MOV R6, #250 ;外循环指令, 1T×R7
L0: NOP
NOP
DJNZ R6, L0 ;内循环指令, 4T×R7×R6
DJNZ R7, LP ;外循环指令, 2T×R7
RET ;2T
延时时间t= 1T+4T×R7×R6+(1T+2T)×R7+2T= 250×20×4T+63T≈20ms
;取平均值
6、编程把A中的二进制数转换成三位BCD码,并存入片内RAM50H、51H、52H单元。50H存百位。
解: ORG 1000H
MOV B, #64H
DIV AB
MOV 50H, A; 存百位
MOV A, #10
XCH A, B
DIV AB
MOV 51H, A ;存十位
MOV 52H, B ;存个位
RET
7、编子程序,将R1中的2个十六进制数转换为ASCII后存入R3、R4中。
解: ORG 0200H
MAIN:MOV A, R1
ANL A, #0FH
ACALL HCA; 调转换子程序
MOV R3, A
MOV A, R1
SWAP A
ANL A, #0FH
ACALL HCA; 调转换子程序
MOV R4, A
SJMP $
ORG 0100H
HCA: CJNE A, #09H, LP
SJMP EE ;=09,L1
LP: JC L1 ; A小于09H, L1
ADD A, #37H ;大于09H,加37H
SJMP EE
L1: ADD A, #30H ;小于等于09H,加30H
EE: RET
8、编程计算片内RAM区50H~59H十个单元中数的算术平均值,将结果存放在5AH中。
解:程序如下: (设10个单元的和小于255)
MOV R0, #50H
MOV R2, #10
MOV A, #0
LP: ADD A, @R0
INC R0
DJNZ R2, LP
MOV B, #10
DIV AB
MOV 5AH, A
SJMP $
9、在片外RAM 3200H开始的单元中有100个有符号数,试编程统计其中正数、负数和0的个数分别存入片内RAM 30H、31H、32H。
解: MOV DPTR, #3200H
MOV R7, #100
MOV 30H, #0
MOV 31H, #0
MOV 32H, #0
LP: MOVX A, @DPTR
CJNE A, #0, L1
INC 32H ;=0计数器加1
SJMP NEXT
L1: JB ACC.7,L2; ACC.7=1即为负数到L2(这里若用JC或JNC都不妥)
INC 30H ; 否则为正数,计数器加1
SJMP NEXT
L2: INC 31H
NEXT: DJNZ R7, LP
RET
展开阅读全文