编程题答案
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

          DJNZ          

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

26.解:⑴ MOV  

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

MOV

 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

⑵         ORG 

 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

        SJMP 

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

   POP   

 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

MOV     A,20H 

  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    $