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位 SWAP 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码\,将其送到1000H单
元中去。
答:按题意编程如下:
MOV DPTR,#2100H ;设置起始地址
MOV R0,#0 ;设置当前所在地址 SCH_PROO:
MOV DPL,R0 ;设置当前地址
MOVX A,@DPTR ;取出当前地址的内容 INC R0 ;地址指针加1
CJNE A,#46H,SCH_PROl ;判断当前地址内容是否为\ 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位 SWAP 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