230 likes | 520 Views
MCS-51 习题. 题目: 设 (A)=0FH , (R0)=30H 内部 RAM (30H)=0AH , (31H)=0BH (32H)=0CH 请写出在执行各条列指令后,所示单元的内容 MOV A,@R0 ; (A)= MOV @R0,32H ; (30H)= MOV 32H, A ; (32H)= MOV R0,#31H ; (R0)=
E N D
MCS-51习题 题目:设 (A)=0FH , (R0)=30H 内部RAM (30H)=0AH, (31H)=0BH (32H)=0CH 请写出在执行各条列指令后,所示单元的内容 MOV A,@R0 ;(A)= MOV @R0,32H ;(30H)= MOV 32H, A ;(32H)= MOV R0,#31H ;(R0)= MOV A, @R0 ;(A)=
题目:用数据传输指令来完成下列要求的数据传送。题目:用数据传输指令来完成下列要求的数据传送。 (1)R0内容输出到R1; (2)外部RAM 20H单元的内容传送到A; (3)内部RAM 30H单元的内容送到R0; (4)外部RAM 30H单元的内容送内部RAM 20H; (5)外部RAM 1000H单元的内容送内部RAM 20H ; (6)程序存储器ROM 2000H单元的内容送到R1; (7)程序存储2000H单元的内容送内部RAM 20H; (8)程序存储器2000H单元的内容送外部RAM 30H (9)程序存储2000H单元的内容送外部RAM 1000H
MOV DPL,#00H MOV R7, #0FFH LOOP: MOV DPH,#10H MOVX A, @DPTR MOV DPH,#20H MOVX @DPTR,A INC DPL ;此题中DPL可公用 DJNZ R7,LOOP END 题目:编写程序,把外部RAM 1000H~10FFH区域 内的数据逐个搬到从2000H开始的区域。
题目:设内部RAM (30H)=5AH,(5AH)=40H,(40H)=00H,端口P1=7FH,请注释每条指令执行后的结果 MOV R0,#30H ;(R0)= MOV A, @R0 ;(A)= MOV R1, A ;(R1)= MOV B, R1 ;(B)= MOV @R1, P1 ;(5AH)= MOV A, P1 ;(A)= MOV 40H, #20H ;(40H)= MOV 30H, 40H ;(30H)=
MOV R0, #20H MOV R7, #10H ;循环次数 LOOP: MOV @R0, #00H INC R0 DJNZ R7, LOOP ; END 题目:编写一循环程序,将内部RAM的20H~2FH共16个连续单元清零。
题目:分析下面个程序段中指令的执行结果 (1) MOV SP,#50H MOV A,#0F0H MOV B,#0FH PUSH ACC ;(SP)=;(51H)= PUSH B ;(SP)=;(52H)= POP B ;(SP)=;(B)= POP ACC ;(SP)=;(A)=
(2) MOV A,#30H MOV B,#0AFH MOV R0,#31H MOV 30H,#87H XCH A,R0 ;(A)=;(R0)= SWAP A ;(A)=
(3) MOV A, #83H MOV R0H, #47H MOV 47H, #34H ANL A, #47H ;(A)= ORL 47H, A ;(A)=;(47H)= XRL A, @R0 ;(A)=
题目:编写一循环程序,求出内部RAM 20H单元二进制数中含"1"的个数,并将结果存入21H单元。 MOV 21H,#00H MOV A, 20H MOV R7, #08H LOOP: RLC A ;左循环一位,最高位到C JNC NEXT ;C为0 INC 21H ;C为1,21H内容+1 NEXT: DJNZ R7,LOOP END
题目:编写一循环程序,查找内部RAM 30H~50H单元中出现FFH个数,并将查找搭结果存入51H单元。 MOV R0, #30H ;数据区首地址 MOV R7, #20H ;数据个数 MOV 51H,#00H ;先设只有0个0ffh LOOP: MOV A, @R0 INC R0 CJNE A,#0FFH,NEXT ;比较,不等于0ffh转NEXT ;等于0ffh,继续执行 INC 51H NEXT: DJNZ R7,LOOP END
4.3 查表程序设计 1. 用DPTR查表(查0~9平方表) 1000 C083 TA: PUSH DPH 1002 C082 PUSH DPL 1004 902000 MOV DPTR, #TAB 1007 93 MOVC A, @A+DPTR 1008 D082 POP DPL 100A D083 POP DPH 100C 22 RET ORG 2000H TAB: DB 00H, 01H, 04H, 09H 2000 00 2001 01 2002 04 2003 09
2. 用PC查表(查0~9平方表) ORG 1000H 1000 C083 TA: ADD A, #01H ; # 01H 为偏移量 1002 83 MOVC A, @A+PC 1003 22 RET 1004 00 DB 00H, 01H, 04H, 09H 1005 01 END 1006 04 1007 09 偏移量=表首地址-(查表指令下一条指令地址) =1004H - 1003H =01H
4.4 循环程序设计 1. 延时50ms程序 DEL: MOV R7, #200 DEL1: MOV R6, #125 DEL2: DJNZ R6, DEL2 ;125*2=250us DJNZ R7, DEL1 ; 0.25ms*200=50ms RET 使用12MHz晶振时,一个机器周期为1us, 执行DJNZ指令为2us,加其他指令的时间 (250+1+2)*200+1=50.301ms 精确计算见 P327
2. 计算几个数据的和 例题:对内部RAM 50h开始的10个无符号数求和。
源程序: ADD1: MOV R7, #10 ;循环次数n=10 MOV R3, #0 ;存放结果的高8位 MOV R4, #0 ;存放结果的低8位 MOV R0, #50H ;求和的数据存放在从内部RAM 50h开始的 ;单元中,。注意:(50h)=?不知道 LOOP: MOV A, R4 ; ADD A, @R0 ;(R4)+(5?H)→A MOV R4, A ; 结果送回R4 CLR A ; ADDC A, R3 ; 把进位位C加到高8位去 MOV R3, A INC R0 ; 为下一轮循环作准备 DJNZ R7, LOOP END
解释: 高8位 低8位 (R3) (R4) + (50h) C (A) MOV A, R4 ADD A, @R0 MOV R4, A CLR A ADDC A, R3 MOV R3, A (50h)中是什么,不知道, 不能用ADD A,#50H
CJNE A,#data,rel;(A)=#data,继续 Cy←0 (A)>#data, 转 Cy←0 (A)<#data, 转 Cy←1 特点:只有<时,Cy←1 4.5 分支程序设计 • CJNE A, #14H, LOOP • LOOP: JC NEXT … … 基本分支程序: (1)若(A)< 14H, 转NEXT,否则继续执行 (2)若(A)≤ 14H, 转NEXT, 否则继续执行 (3)若(A)≥ 14H, 转NEXT, 否则继续执行 (4)若(A)> 14H, 转NEXT, 否则继续执行 (A)≤ 14H 相当于(A) < 15H • CJNE A, #15H, LOOP • LOOP: JC NEXT … … • CJNE A, #14H, LOOP • LOOP: JNC NEXT … … (A)> 14H 相当于(A) ≥ 15H • CJNE A, #15H, LOOP • LOOP: JNC NEXT … …
例1:按下面公式编写程序, x为无符号数,存在20h单元 y存放在21h单元。 ORG 0030H MOV A, 20H CJNE A, #21H, LOOP1 LOOP1: JC NEXT1 CJNE A, #40H, LOOP2 LOOP2: JNC NEXT2 MOV B, #2 MUL AB AJMP NEXT2 NEXT1: CPL A NEXT2: MOV 21H, A END 最终结果存在 21h中 分支程序例1
从内部RAM 22h单元开始存有一个无符号数数据块,长度n存于21h中。求出数据块中的最小数,存于20h中。 ORG 0030H MOV R0, #22H ;数据块起始地址 MOV R1, 21H ;数据个数n MOV 20H,#0FFH ; 最大数 LOOP: MOV A, @R0 ; 取新数 INC R0 ; 为取下一个新数作准备 CJNE A, 20H, LOOP1 ; 与原最大数比较 LOOP1:JNC NEXT ; 大,原最小数保留 MOV 20H, A ; 小,改变最小数 NEXT: DJNZ R1, LOOP ;循环 END 初始化 取新数 y N N y y <x n-1=0? y END y → x 分支程序例2:
例:行李计价: 当G≤5,M=G×3; 当G>5,M=G×3+(G-5)×(5-3) FRT: MOV A,40H ;取行李重量G放在40H MOV R3,A MOV B,#03H ;M=G×3 MUL AB MOV R2,A ;暂存3 × G在R2 MOV A,R3 ;取回G CJNE A,#06H,L1 ;G≤5 ? L1: JC WETC ;是,转至WETC SUBB A,#05H ;否则M=3G+2(G-5) RLC A ADD A,R2 WETC:MOV 41H,A ;最后结果M存41H end
根据R7中的内容,转向各个子程序。 R7=0,转入Prog0 R7=1,转入Prog1 R7=2,转入Prog2 …… R7=n,转入Progn ORG 0030H JUMP1: MOV DPTR, #TAB CLR A MOV A, R7 ADD A, R7 AJMP @A+DPTR ORG 0100H TAB: AJMP Prog0 AJMP Prog1 AJMP Prog2 …… R7= ? n 1 0 处理 n 处理 1 处理 0 4.6 散转程序设计 *AJMP … 即把PC指向子程序的起始地址; *R7 x 2 是AJMP @A+DPTR的机器码匹配;此处 n<127; *如用LJMP @A+DPTR,则R7 x 3, 程序还要作相应修改。
例:8位二进制转换成BCD码。(用十进制表达的二进制码)例:8位二进制转换成BCD码。(用十进制表达的二进制码) ;程序名:BINBCD1 ;功能: 0~FFH内的二进制数转换为BCD数 ;入口: A存要转换的二进制数 ;出口: R0 存放BCD数 百、十、个位数的地址 BINBCD1: MOV B, #100 DIV AB MOV @R0, A INC R0 MOV A, #10 XCH A, B ;(A)=原(B),(B)=10 DIV AB MOV @R0, A INC R0 XCH AB MOV @R0, A RET 4.7 数制转换程序设计