TWO DATA 31H MAX DATA 32H
CLR C ;Cy清零 MOV A,ONE ;X送A
SUBB A,TWO ;X-Y.形成OV标志 JZ DONE ;若X=Y,则DONE
JB ACC.7,NEG ;若X-Y为负,则转NEG JB OV, YMAX ;若OV=1,则YMAX SJMP XMAX ;若OV=0,则XMAX NEG: JB OV, XMAX ;若OV=1,则XMAX YMAX:MOV A, TWO ;Y>X
SJMP DONE ;转DONE XMAX: MOV A, ONE ;X>Y
DONE: MOV MAX ,A ;大数送MAX单元 SJMP $ END
4.8某系有200名学生参加外语统考,若成绩已存放在MCS-51外部RAM起始地址为ENGLISH的连续存储单元,现决定给成绩在95-100分之间的学生颁发A级合格证书,并给成绩在90-94分之间的学生颁发B级合格证书。试编写程序,统计获得A级和B级证书的学生人数,并把统计结果存入内存RAM的GRADA和GRADB单元。 程序如下:
ORG 0600H ENGLISH XDATA 1000H GRADA DATA 20H GRADB DATA 21H
MOV GRADA ,#00H ;GRADA单元清零 MOV GRADB,#00H ;GRADB单元清零 MOV R2,#0C8H ;参赛总人数送R2
MOV DPTR ,#ENGLISH ;学生成绩起始地址送DPTR LOOP: MOVX A,@DPTR ;取某学生成绩到A
CJNE A, #5FH, LOOP1 ;与95作比较,形成Cy LOOP1: JNC NEXT1 ;若A≥95,则NEXT1 CJNE A,#5AH,LOOP2 ;与90作比较
LOOP2: JC NEXT ;若A<90,则NEXT
INC GRADB ;若为B级,则GRADB单元内容加1 SJMP NEXT
NEXT1: INC GRADA ;若A≥95,则GRADA单元内容加1 NEXT: INC DPTR ;修改学生成绩指针 DJNZ R2,LOOP ;若未完,则LOOP SJMP $ ;结束 END
4.9 已知内部RAM的BLOCK单元开始有一无符号数据块,块长在LEN单元。请编写求数据块中各数累加和并存入SUM单元的程序。 程序如下:
ORG 0200H LEN DATA 20H SUM DATA 21H BLOCK DATA 22H
CLR A ;A清零 MOV R2,LEN ;块长送R2
MOV R1,#BLOCK ;快起始地址送R1 INC R2 ;R2<--块长+1 SJMP CHECK
LOOP: ADD A,@R1 ;A<--A+(R1)
INC R1 ;修改数据块指针R1 CHECK: DJNZ R2,LOOP ;若未完,则转LOOP MOV SUM,A ;存累加和 SJMP $ END
4.10 已知内部RAM ADDR为起始地址的数据块内数据是无符号数,块长在LEN单元内。请编程求数据块中最大值并存入MAX单元。 程序如下:
ORG 0300H LEN DATA 20H MAX DATA 22H ADDR DATA 23H
MOV MAX ,#00H ;MAX单元清零 MOV R0,#ADDR ;ADDR送R0
LOOP: MOV A,@R0 ;数据块中某数送A CJNE A,MAX ,NEXT1 ;A和(MAX)比较
NEXT1: JC NEXT ;若A<(MAX),则NEXT
MOV MAX ,A ;若A≥(MAX),则大数送MAX NEXT: INC R0 ;修改数据指针R0 DJNZ LEN,LOOP ;若未完,则转LOOP SJMP $ END
4.11 设有10组3字节被加数和加数,分别存放在以BLOCK1和BLOCK2为起始地址的两个数据块中。请编程求10组数的和,并把和送回以BLOCK1位起始地址的数据块中。
程序如下:
ORG 0500H BLOCK1 DATA 20H BLOCK2 DATA 40H
MOV RO, #BLOCK1 ;被加数数据块起始地址送R0 MOV R1, #BLOCK2 ;加数数据块起始地址送R1 MOV R2,#0AH ;加法组数10送R2
LOOP: MOV R3,#03H ;被加数或加数字节数送R3 CLR C ;CY清零
LOOP1: MOV A, @R0 ;被加数送A ADDC A, @R1 ;加一个字节 MOV @R0,A ;存和数字节
INC R0 ;修改被加数指针 INC R1 ;修改加数指针
DJNZ R3,LOOP1 ;若一组加法未完,LOOP1 DJNZ R2,LOOP ;若10组加法未完,则LOOP SJMP $ END
4.12设单片机8031内部RAM起始地址为30 H的数据块中有64个无符号数。试编写程序使它们按从小到大的顺序排列。 程序如下:
ORG 1000H
BUBBLE: MOV R0,30H ; 置数据块指针RO MOV R2,#64 ;块长送R2
CLR 7FH ;交换标志2FH.7清零 DEC R2 ;块长—1为比较次数 BULOOP:MOV 20H,@R0 ;eN送20H MOV A,@R0 ;eN送A INC R0
MOV 21H,@R0 ;eN-1送21H CJNE A, 21H, LOOP ;(20H)和(21H)比较
LOOP: JC BU NEXT ;若(20H)<(21H),则BUNEXT MOV @R0, 20H ;若(20H)≥(21H),则两者交换 DEC R0
MOV @ R0, 21H
INC RO ;恢复数据块指针 SETB 7FH ;置“1”交换标志位
BUNEXT:DJNZ R2,BULOOP ;若一次冒泡未完,则BULOOP JB 7FH,BUBBLE ;若交换标志位为1,则BUBBLE SJMP$ ;结束 END
4.13已知R0低4位有一个十六位进制数(0~F中的一个),请编写能把它转换成相应ASCNII码并送入RO的程序。
程序如下:
ORG O4OOH
MOV A, RO ;去转换值到A ANL A, #0FH ;屏蔽高4位 CJNE A,#10,NEXT1 ;A和10比较
NEXT1:JNC NEXT2 ;若 >9,则转NEXT2 ADD A,#30H ;若<10,则A<--A+30H SJMP DONE ;转DONE NEXT2:ADD A , # 37H ; A<--A+37H DONE:MOV RO,A ;存结果
SJMP $ END
4.14 已知BLOCK1为起始地址的数据块(数据块长度在LEN单元),数据块中每个存储单元中的高、低4位分别为两个十六进制数,请通过编程把它们转换为相应的ASCII码,并放在从BLOCK2开始的连续存储单元(低4位ASCII码在前,高4位ASCII码在后)。
ORG 0500H LEN DATA 20H BLOCK 1 DATA 21H BLOCK2 DATA 51H
MOV R0,#BLOCK1 ;BLOCK1送R0 MOV R1,#BLOCK2 ;BLOCK2送R1 LOOP: MOV A, @R0 ;取源数据块中数 ANL A,#0FH ;取出低4位 ADD A,#17 ;第一次地址调整 MOVC A,@A+PC ;第一次查表
MOV @R1,A ;存第一次转换结果 MOV A,@R0 ;重新取出被转换数 SWAP A ;高4位调入低4位 ANL A,#0FH ;取出低4位
ADD A,#09H ;第二次地址调整 MOVC A,@A+PC ;第二次查表
INC R1 ;修改目的数据块指针 MOV @R1,A ;存第二次转换结果 INC R0 ;修改原数据块指针 INC R1 ;修改目的数据块指针
DJNZ LEN,LOOP ;若未转换完,则转LOOP SJMP $ ;结束 ASCTAB: DB '0','1','2','3','4' DB '5','6','7','8','9'
DB 'A','B','C','D','E','F' END
4.15 设有一起始地址为DTATAB的数据表格,表中存放1024个元素,每个元素为2字节。请编写能根据R5、R4中元素的序号查找对应元素并放入R5、R4(R5中为高8位,R4中为低8位)的程序。
程序如下:
ORG 0500H
START: MOV DPTR,#DTATAB ;数据表格起始地址送DPTR MOV A,R4 ;元素序号低字节送A CLR C ;Cy清零
RLC A ;2*元素序号低字节
XCH A, R5 ;存入R5,元素序号高字节送A RLC A ;2*元素序号高字节 XCH A, R5