第三章-80C51单片机的指令系统 下载本文

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