编程题答案
1. 程序如下:
STRAT: MOV A,R0
MOV B,#10
MUL AB
MOV R0,A
RET
STRAT: MOV R0,#30H
2. 程序如下:
START: MOV R7,#0FH
MOV DPTR,#3000H
LOOP: MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R7,LOOP
RET
3. 程序如下:
START: MOV A,40H
MOV DPTR,#TAB
MOV C A,@A+DPTR
MOV 40H,A
RET
TAB: DB 30H,31H,32H,33H,34H,
DB 35H,36H,37H,38H,39H
4. START: CLR C
MOV A,51H
CPL A
ADD A,#01H
MOV 51H,A
MOV A,50H
CPL A
ADDC A,#00H
MOV 50H,A
RET
5. ADDIO: MOV R0,30H
MOV R7,#9H
MOV A,@R0
LOOP: INC R0
ADD A,@R0
DJNZ R7,LOOP
MOV 30H,A
RET
6.RIB-AI: MOV A,R1
ORL A,#30H
MOV DPTR,#1000H
MOVX @DPTR,A
RET
7. SOUT: MOV SCON,#40H
MOV TMOD,#20H
MOV TL1,#OE8H
MOV TH1,#0E8H
SETB TR1
MOV SBUF,A
JNB T1,$
CLR
RET
8.CARY: MOV DPTR,#2000H
MOV R0,#20H
MOV R3,#05H
NEXT: MOVX A,@DPTR
MOV @ R0,A
INC DPTR
INC R0
DJNZ R3,NEXT
RET
9. 程序如下:
MAIN: MOV A,R3
MOV DPTR,#TAB
MOV C A,@A+DPTR
MOV R3,A
RET
TAB: DB 30H,31H,32H,33H,34H,
DB 35H,36H,37H,38H,39H
10 START: MOV R0,#40H
MOV R7,#09H
MOV A,@R0
LOOP: INC R0
MOV 30H,@R0
CJNE A,30H,NEXT
NEXT: JNC BIE1
MOV A,30H
BIE1: DJNZ R7,LOOP
MOV 50H,A
RET
11.
START: MOV DPTR,#3000H
MOV R7,#20H
MOV R0,#30H
LOOP: MOV X A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,LOOP
RET
12
START: MOV A,R2
ADD A,#01H
MOV R2,A
MOV A,R1
ADDC A,#00H
MOV R1,A
RET
13.
START: MOV R0,#40H
MOV R7,#0AH
MOV DPTR,#4000H
LOOP: MOV A,@R0
MOVX @DPTR,A
I NC R0
INC DPTR
DJNZ R7,LOOP
RET
14.
START: MOV TMOD,#20H
MOV TL1,#0E8H
MOV TH1,#0E8H
SETB TR1
MOV SCON,#50H
L1: JNB R1,L1
CLR R1
MOV A,SBUF
RET
15. START: CLR C
MOV A,31H
RLC A
MOV 31H,A
MOV A,30H
RLC A
MOV 30H,A
RET
16. START: MOV DPTR,#2000H
MOV X A,@ DPTR
ADD A,#30H
MOV X @DPTR,A
RET
17.解:要实现单字节BCD数的减法,应当设法将减法变为加法后,再用DA A指令调整。具体操作是:先用模(99+1)H即9AH减去减数,再与被减数进行加法操作,然后用DA A调整。
假定被减数放在片内RAM的60H单元,减数放在61H单元,差值放入62H单元。
程序如下:
CLR C
MOV A,#9AH
SUBB A,61H
ADD A,60H
DA A
MOV 62H,A
RET
18. 解:用 R0和R1作数据指针,R0指向第一个加数,并兼做“和”的指针,R1指向另一个加数,字节数存放到R2中作记初值。
主程序:
JAFA:MOV R0,#20H
MOV R1,#29H
MOV R2,#04H
ACALL JASUB
AJMP $
RET
多字节加法子程序:
JASUB:CLR C
JASUB1:MOV A,@R0
ADDC A, @R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,JASUB1
RET
19.解: START: MOV DPTR,#0000H
MOV X A,@DPTR
MOV 10H,A
MOV B,#00H
MOV DPTR,#0001H
THREE: MOVX A,@DPTR
CJNE A,B,ONE
ONE: JC TWO
XCH A,B
TWO: INC DPTR
DJNZ 10H,THREE
MOV A,B
RET
20
解: ORG 0030H
START: MOV 20H,#00H
MOV DPTR,#0000H
MOVX A,@DPTR
MOV 10H,A
MOV DPTR,#0001H
TWO: MOVX A,@DPTR
JB ACC.7,ONE
ONE: INC DPTR
10H,TWO
RET
21.解: ORG 0030H
START:MOV DPTR,#0000H
MOVX A,@DPTR
MOV 10H,A
INC DPTR
MOV A,#00H
ONE: PUSH A
MOVX A,@DPTR
MOV 20H,A
POP A
ADD A,20H
INC DPTR
DJNZ 10H,ONE
RET
22.解:TABLE: MOV A,20H
CJNE A,#0AH,NEXT
NEXT: JC LED
MOV 30H,#0FFH
SJMP ENDD
LED: MOV DPTR,#2000H
MOVC A,@A+DPTR
MOV 30H,A
ENDD: SJMP ENDD
23.解: ORG 1000H
START: MOV DPTR, #2000H
MOV 10H, #0BH
LOOP: MOVX A, @DPTR
ANL A, #0FH
MOVX @DPTR, A
INC DPTR
DJNZ 10H,LOOP
RET
24.解: ORG 1000H
START: PUSH A
PUSH PSW
┇
POP PSW
POP A
RET
25.解:MOV DPTR,#3000H
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
ADD A,R0
RRC A
INC DPTR
MOVX @DPTR,A
RET
A,30H
ANL A,#3CH
RL A
RL A
MOV 33H,A
ANL 31H,#3
ANL 32H,#0C0H
MOV A,31H
ORL A,32H
RL A
RL A
ORL 33H,A
⑵ XRL DPH,#0FH
XRL DPL,#0F0H
27.解:⑴SETB ACC.0或ORL A,#1
⑵ANL A,#0FH
⑶ORL A,0CH
⑷ANL A,#0C3H
28. 解:相对偏移量的计算方法有两种,一种是偏移量=转移地址-(相对转移指令地址+相对转移指令字节数),则本题中的偏移量=200AH-(2010H+2)=FFF8。另一种是根据转移指令的硬件动作直接计算,既偏移量=目标地址-下条指令的地址,则本题中的偏移量=H200AH-2012H=FFF8H。取低8位偏移值,rel=F8H。
29.解:程序如下:
MOV R0,#30H
MOV A,@R0
SWAP A
ANL A,#0FH
ORL A,#30H
MOV 31H,A
XCHD A,@R0
MOV 32H,A
RET
30.解:方法1 用1条指令实现:XCH A,B
方法2 用3条指令实现:MOV R0
MOV B,A
MOV A,R0
方法3 用4条指令实现:PUSH ACC
PUSH B
POP ACC
POP B
31.解: ORG 0300H
START: MOV DPTR,#0000H
MOVX A,@DPTR
MOV B,A
INC DPTR
MOVX A,@DPTR
CJNE A,B,ONE
ONE: JNC TWO
MOV DPTR,#0000H
MOVX @DPTR,A
XCH A,B
INC DPTR
MOVX @DPTR,A
TWO: SJMP TWO
32.解:ORG 0030H
MOV A,20H
CLR C
RLC A
MOV 20H,A
MOV A,21H
RLC A
MOV 21H,A
JNC NEXT
MOV 22H,#01
NEXT: SJMP $
33.解: ORG 0030H
DPTR,1000H
MOVX A,@DPTR
MOV B,A
INC DPTR
MOVX A,@DPTR
CJNE A,B,00H
JNC NEXT1
MOV 30H,B
MOV 31H,A
SJMP NEXT2
NEXT1: MOV 30H,A
MOV 31H,B
NEXT2: SJMP NEXT2
34.解: ORG 0030H
MOV R0,#10H
MOV R1,#20H
MOV R7,#04H
CLR C
LOOP: MOV A,@R0
SUBB A,@R1
MOV @R0,A
DJNZ R7,LOOP
RET
35.解: ORG 0030H
MOV C,P1.1
ANL C,P1.2
MOV 7EH,C
ANL C,ACC.7
ORL C,7FH
ORL C,/PSW.0
MOV P1.0,C
RET
36.解: ORG 0030H
MOV DPTR,#TAB
MOV A,R0
CJNE A,#10H,NEXT
NEXT: JNC NEXT1
MOVC A,@A+DPTR
SJMP NEXT2
NEXT1: MOV A,#0FFH
NEXT2: SJMP NEXT2
37.解: CLR C
MOV DPTR,#2000H
MOV R0,#20H
MOV R1,#03H
LOOP: MOVX A,@DPTR
ADDC A,@R0
MOV @R0,A
INC R0
INC DPTR
DJNZ R1,LOOP
RET
38.解: MOV R0,#30H
MOV DPTR,#2000H
MOV R1,#10H
LOOP: MOV A,2R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R1,LOOP
RET
39.解:⑴ MOV A,#00H
⑵ XRL A,ACC
⑶ ANL A,#00H
⑷ CLR A
40.解:因7AH∧17H=01111010B∧00010111B=00010010B=12H故A=12H
因A5H∨12H=10100101B∨00010010B=10110111B=B7H故(30)=B7H
因12H⊕B7H=00010010B⊕10110111B=10100101B=A5H故A=A5H
41.解: ORL 0800H
MOV DPTR,#1000H
MOV R0,#30H
MOV R7,#11H
LOOP: MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,LOOP
RET
42.解:控制字为:10010101=95H
初始化程序:MOV DPTR,#300FH
MOV A,#95H
MOVX @DPTR,A
43.解:ORG 0000H
LJMP 0030H
ORG 0030H
MOV SP,#60H
SETB RS1
SETB RS0
RET
44.解:⑴ ORG 0030H
MOV DPTR,#1000H
MOVX A,@DPTR
MOV R7,A
INC DPTR
CLR C
MOV 20H,#00H
LOOP: MOVX A,@DPTR
CJNE A,20H,00H
JNC NEXT
MOV 20H,A
NEXT: INC DPTR
DJNZ R7,LOOP
RET
0030H
MOV DPTR,#1000H
MOVX A,@DPTR
MOV R7,A
MOV 12H,#00H
MOV 11H,#00H
MOV 10H,#00H
L2: INC DPTR
MOVX A,@DPTR
JZ NEXT1
JB ACC.7,NEXT2
INC 12H
SJMP L1
NEXT1: INC 10H
SJMP L1
NEXT2: INC 11H
L1: DJNZ R7,L2
RET
45.解:⑴1s=2us×5×105
5×105=500000=250×2000=250×200×10
所以:要编写三重循环。
ORL 1000H
TIME: MOV R7,#10H
T3: MOV R6,#200
T2: MOV R5,#250
T1: DJNZ R5,T1
DJNZ R6,T2
DJNZ R7,T3
RET
⑵ 1min=60s,调用上面1s子程序60次。
ORG 0030H
MOV R0,#60
LOOP: LCALL TIME
DJNZ R0,LOOP
RET
46.解:⑴输出负向锯齿波的程序
MOV R0,#FEH
MOV A,#0FFH
LOOP: MOVX @R0,A
DEC A
LCALL DELAY
SJMP LOOP
DELAY: ……
RET
⑵输出15个正向阶梯波程序
15个正向阶梯波,即将00H~FFH分为16个等级,以形成15个台阶。此时数字递增幅度要加大为每次增16(或10H),对应程序为:
MOV R0,#FEH
CLR A
UP: MOVX @R0,A
ADD A,#10H
LCALL DELAY
SJMP UP
DELAY: ……
RET
47.解:采用无条件传送方法,即启动转换后等待100us(这是1DC0809的最保守转换时间)再读转换结果。
模拟信号接至IN0引脚,但要保证模拟量在一次A/D转换过程中不发生变化。如果变化速度快,在输入前应该增加采样保持电路。
100个数据的采集程序如下:
MOV R0,#1CH
MOV R7,#100H
SETB P1.0
LOOPI: CMOVX @R0,A
ACALL DELAY
MOVX A,@R0
MOV @R0,A
INC R0
DJNZ R7,LOOPO
SJMP $
DELAY: MOV R1,310H
DLOOP: MUL AB
MUL AB
DJNZ R1,DLOOP
RET
48.解:查询方式发送程序如下:
MOV SCON,#80H
MOV PCON,#80H
MOV R0,#50H
MOV R7,#16
LOOP: MOV A,@R0
MOV C,P
MOV TB8,C
MOV SBUF,A
JNB TI,$
CLR R0
DJNZ R7,LOOP
RET
49.解:
查询接受程序如下:
MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV SCON,#0D0H
MOV R0,#50H
MOV R7,#16H
CONT: JBC RI,PRI
CONT
PRI: MOV A,SBUF
JNB P,PNP
JNB RB8,PER
AJMP RIGHT
PNP: JB RB8,PER
RIGHT: MOV @R0,A
INC R0
DJNZ R7,CONT
CLR F1
SJMP $
PER: SETB F1
SJMP $
50.解:T1工作于方式2作为波特率发生器,取SCOM=0,T1的计数初值计算如下:
⑴查询方式程序
①发送程序
ORG 0000H
AJMP START
ORG 0030H
START: MOV TMOD,#20H
MOV TH1,#0E6H
MOV TL1,#0E6H
SETB TR1
MOV SCON,#40H
MOV R0,#20H
MOV R7,#32
LOOP: MOV SUBF,@R0
JNB TI,$
CLR TI
INC R0
DJNZ R7,LOOP
SJMP $
②接受程序
ORG 0000H
AJMP START
ORG 0030H
START: MOV TMOD,#20H
MOV TH1,0E6H
MOV TL1,#0E6H
SETB TR1
MOV SCON,#50H
MOV R0,#20H
MOV R7,#32H
LOOP: JNB RI,$
CLR RI
MOV @R0,SUBF
INC R0
SJMP $
⑵中断方式程序:
中断方式的初始化部分同查询方式,以下仅写不同部分。
①中断发送程序:
┇
SETB EA
SETB ES
MOV SUBF,@R0
LOOP: SJMP $
AGA: DJNZ R7,LOOP
CLR EA
SJMP $
ORG 0023H
IOIP: CLR TI
POP DPH
POP DPL
MOV DPTR,#AGA
PUSH DPL
PUSH DPH
INC R0
MOV SUBF,@R0
RETI
②中断接受程序:
┇
SETB EA
SETB ES
LOOP: SJMP $
AGA: DJNZ R7,LOOP
CLR EA
SJMP $
ORG 0023H
IOIP: CLR RI
MOV @R0,SBUF
POP DPH
POP DPL
MOV DPTR,#AGA
PUSH DPL
PUSH DPH
INC R0
RETI
51.解:方法一:以PC作为基址寄存器。
MOV A,#0F0H
MOVC A,@A+PC
方法二:以DPTR作为基址寄存器。
MOV DPTR,#20F0H
MOV A,#00H
MOVC A,@A+DPTR
52.解:方法一:利用交换指令。
XCH A,B
方法二:利用堆栈交换指令。
PUSH A
PUSH B
A
POP B
53.解:在位操作中,与操作即乘,或操作即加。
MOV C,B.0
ORL C.P2.1
ANL C.ACC.0
ORL C.P3.2
MOV P1.7,C
54.解:将片内数据传送到片外RAM可用MOVX @DPTR,A或MOVX @Ri,A指令
MOV R7,#30
MOV R0,#20H
MOV DPTR,#3000H
LOOP: MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R7,LOOP
55.解:判断一个数是否等于0,可用JZ rel或CJNE A,#00H,rel指令;判断其正负,可直接判断该数的D7(符号位),当D7=1时,为负,当D7=0时,为整数。
设:R2为负数个数的计数;
R3为0的个数的计数;
R4为正数个数的计数。
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
MOV R7,#100
MOV DPTR,#2000H
LOOP: MOVX A,@DPTR
JZ RR3
JB CC.7,RR2
INC R4
SJMP TT
RR3: INC R3
SJMP TT
RR2: INC R2
TT: INC DPTR
DJNZ R7,LOOP
56.解:压缩BCD码用4位二进制数表示一位十进制数,即一个字节存放二位十进制数。十进制数转换成ASCII码,只需要加上30H。
程序如下:
MOV P2,#20H
MOV R1,#00H
MOV DPTR,#2005H
MOV R7,05
LOOP: MOVX A,@R1
PUSH ACC
ANL A,#0FH
ADD A,#30H
MOVX @DPTR,A
INC DPTR
POP ACC
ANL A,#0F0H
SWAP A
ADD A,#30H
MOVX @DPTR,A
INC R1
INC DPTR
DJNZ R7,LOOP
57.解: SWP A
ANL P1,#0FH
ORL P1,A
58.解:方法一 XRL 40H,#3CH
方法二 MOV A,40H
CPL A
ANL A,#3CH
ANL 40H,#0C3H
ORL 40H,A
59.解: MOV A,R0
JZ ZE
MOV R1,#0FFH
SJMP $
ZE: MOV R1,#0
RET
60.解: ORG 0100H
MOV R7,#05H
MOV R0,#20H
MOV R1,#25H
ASNE: MOV A,@R0
ANL A,#0F0H
SWAP A
ADD A,#30H
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV @R1,A
INC R0
INC R1
DJNZ R7,NE
SJMP $
END
61.解: ORG 0100H
MOV A,40H
JB P,EN
ORL A,#80H
EN: SJMP $
62.解:取补不同于求补码,求补码应区别正负数分别处理,而取补是不用判正负的。
ORG 0100H AB: INC R0
MOV R7,#03H MOV A,@R0
MOV R0,#DATA CPL A
MOV A,@R0 ADDC A,#0
CPL A DJNZ R7,AB
ADD A,#01 SJMP $
MOV @R0,A
63.解:ORG 0100H
ASCII: CJNE A,#0AH,NE
ANL A,#0F0H NE: JC A30
SWAP A ADD A,#37H
ACALL ASCII RET
MOV 22H,A A30: ADD A,#30H
MOV A,20H RET
ANL A,#0FH
ACALL ASCII
MOV 21H,A
SJMP $
64.解:ORG 0100H
MOV C,20H
ANL C,2FH
ORL C,/2FH
CPL C
ANL C,53H
MOV P1.0,C
SJMP $
END
65.解:ORG 0100H
MOV C,ACC.3
ANL C,P1.4
ANL C,/ACC.5
MOV 20H,C
MOV C,B.4
CPL C
ANL C,/P1.5
ORL C,20H
MOV P1.2,C
SJMP $
END
66.解: ORG 0100H
ABC: SETB P1.0
SETB P1.7
JB P1.7,$
JNB P1.7,$
CLR P1.0
MOV R2,#0
DAY: NOP
NOP
DJNZ R2,DAY
SJMP ABC
67.解:程序如下:
ORG 0100H
MOV A,#0FH
ABC: MOV P1,A
ACALL D05
SWAP A
SJMP ABC
D05: MOV R6,250
DY: MOV R7,250
DAY: NOP
NOP
DJNZ R7,DAY
DJNZ R6,DY
RET
END
68.解:汇编程序如下:
ORG 0100H
MOV A,#08H
MOV R2,#01H
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
NEXT: MOV A,R2
MOV P3,A
ACALL DAY
JB ACC.4,LPD
RL A
MOV R2,A
AJMP NEXT
LPD: RET
TAB: DB 3FH,06H…
END
69.解:程序如下:
MOV A,#01H
SHIFT: LCALL FLASH
RR A
SJMP SHIFT
FLASH: MOV R2,#0AH
FLASH1:MOV P1,A
LCALL DELAY
MOV P1,#00H
LCALL DELAY
DJNZ R2,FLASH
RET
70.解:IN2的地址为7FFAH,P1.0查询转换结果信号,仅编查询程序如下:
ORG 0100H
MOV R7,#0AH
MOV R0,#50H
MOV DPTR,#7FFAH
NEXT: MOVX @DPTR,A
JB P1.0,$
MOVX A,@DPTR
MOV @R0,A
INC R0
DJNZ NEXT
SJMP $