- - .. --
JB ACC.7,NEG CJNE A,#00H,LOOP1 SJMP LOOP INC R0 INC R3
;负数跳转
;非负非零转正数处理 ;零不处理,取下一个数 ;正数保存 ;正数存放地址加1 ;正数个数加1 ;未结束就继续
;将负数送负数保存地址 ;负数地址加1 ;负数个数加1 ;未结束就继续 ;正数个数送40H单元 ;负数个数送60H单元
LOOP1:MOV @R0,A
SJMP LOOP2 INC R1 INC R4
NEG: MOV @R1,A
LOOP2: DJNZ R7,LOOP
MOV 40H,R3 MOV 60H,R4 SJMP $ END
4-6 设内部RAM的30H和31H单元中有二个带符号数求出其中的大数存放在32H单元中。
MOV A,30H XRL A,31H JB ACC.7,LOOP MOV A,30H SUBB A,31H JC LOOP1 MOV 32H,30H
SJMP $ SJMP $
JB ACC.7,LOOP1 MOV 32H,A SJMP $
LOOP1: MOV 32H,31H LOOP: MOV A,30H
4-7 试编制实现ASCII码转十进制数的程序。在8032单片机内RAM的40H单元中存放一个代码。若此代码为十进制数的ASCII码,则将其相应的十进制数送片内RAM的50H单元,否则将此单元置成0FFH。
MOV A,40H CLR C SUBB A,#30H JC LOOP MOV R0,A MOV A,#09H SUBB A,R0
;减30H后差大于0,是否不 ; 大于9?
;数字比其ASCII码值小30H
;存的ASCII值小于0的ASCII码值跳转
word 可编辑.
- - .. --
JC LOOP SJMP $
;差大于9,跳转 ;将数字存入50H单元 ;不是数字,存入0FFH
MOV 50H,R0
LOOP:MOV 50H,#0FFH
SJMP $ END
4-8 试编程将存放在8032单片机内部RAM中首址为20H、长度为50H的数据快传送到片外RAM以20H为首址的连续单元中。
MOV R0,#20H MOV R1,#20H MOV R7,#50H MOVX @R1,A
INC R0 INC R1 DJNZ R7,LOOP SJMP $
LOOP: MOV A,@R0
4-9 设一个字符串存放在8032单片机内部RAM以20H为首址的连续单元中,字符串以回车结束。要求统计该字符串中字符C(’C’=43H)的个数,并将其存入外部RAM的40H单元。试编写实现上述要求的程序。
MOV R0,#20H MOV R2,#00H XRL A,#0DH JZ EXIT MOV A,@R0 XRL A,#43H JNZ LOOP2
INC R2 SJMP LOOP MOV A,R2 MOVX @DPTR,A SJMP $ END
LOOP2: INC R0
EXIT: MOV DPTR,#0040H
LOOP: MOV A,@R0 ;判断是否是回车符
4-10 设有一长度为20H的字符串,它存放在片外RAM1000H为首地址的连续单元中。试编制将其中数字与字母分开并将它们送到片内RAM以30H和50H为首地址的连续单元中的程序。
MOV DPTR,#1000H MOV R7,#20H MOV R0,#30H MOV R1,#50H CJNE A,#30H,LOOP1
SJMP ISNUM SJMP ISCHAR
LOOP1: JNC LOOP2
LOOP2: CJNE A,#3AH,LOOP3 LOOP3:JC ISNUM
SJMP ISCHAR
LOOP: MOVX A,@DPTR
word 可编辑.
- - .. --
ISCHAR:MOV @R1,A
INC R1 SJMP NEXT SUBB A,#30H MOV @R0,A
INC R0 SJMP NEXT DJNZ R7,LOOP SJMP $ END
NEXT: INC DPTR
ISNUM:CLR C
4-11 试编程将片内RAM区DATA1单元开始的20H个单字节依次与DATA2单元为起始地址的20H个单字节进行交换。
MAIN: MOV R7,#20H
DATA1 EQU 20H DATA2 EQU 40H MOV R0,#DATA1 MOV R1,#DATA2 XCH A,@R1
MOV @R0,A INC R0 INC R1 DJNZ R7,LOOP SJMP $ END
LOOP: MOV A,@R0
4-13 设片内RAM的20H~4FH单元中有若个无符号数,试编程求出其中的最大值及所在单元地址,将最大值存入片内RAM的50H单元,最大值所在单元地址存入片内RAM的51H单元。
MOV R0,#20H MOV R7,#20H MOV A,R0 MOV R2,A MOV A,@R0 MOV R1,A CLR C SUBB A,@R0 JNC LOOP1
MOV A,R0 MOV R2,A MOV A,@R0 MOV R1,A DJNZ R7,LOOP MOV 50H,R1 MOV 51H,R2 SJMP $ END
LOOP1:MOV A,R1
LOOP: INC R0
4-14 设片外RAM从1000H单元开始存放100个无符号8位二进制数。试编程将它们从大到小依次入片内RAM从10H开始的单元中。
MOV R7,#100 MOV DPTR,#1000H MOV R0,#10H
MOV @R0,A INC DPTR INC R0 DJNZ R7,LOOP
LOOP: MOVX A,@DPTR
word 可编辑.
- - .. --
MOV R7,#99
MOV @R0,A MOV A,R1 INC R0 MOV @R0,A MOV R1,A DEC R6
MOV R6,#99 NEXT: MOV R0,#10H MOV A,@R0
MOV R1,A MOV A,@R0 CLR C SUBB A,R1 JNZ LOOP3 SJMP LOOP4 MOV A,@R0 DEC R0
LOOP2: INC R0
LOOP4: MOV A,@R0 DJNZ R7,LOOP2 MOV A,R6 MOV R7,A INC R6 DJNZ R6,NEXT
SJMP $ END
LOOP3: JC LOOP4
4-15 设有2个4B的BCD数:X=24350809,Y=12450379。X从片内RAM的25H单元开始存放,Y从片内RAM的35H单元开始存放,求两数的和。设数据在内存中按照低字节在前,高字节在后的顺序存放。
MOV 25H,#24H MOV 26H,#35H MOV 27H,#08H MOV 28H,#09H MOV 35H,#12H MOV 36H,#45H MOV 37H,#03H MOV 38H,#79H MOV R7,#04H MOV R0,#25H MOV R1,#35H
END
CLR C ADDC A,@R1 DA A MOV @R0,A INC R0 INC R1 DJNZ R7,LOOP SJMP $
LOOP: MOV A,@R0
4-16 设晶振频率为6MHz,试编一能延时20ms的子程序
答:一个机器周期T=12/6*106=2μs,延时20ms需要20000/2=10000个机器周期。
拟用以下程序:
工作需要机器周期数 ;1 ;1
START: MOV R6,#data1 LOOP1: MOV R7,#data2
word 可编辑.