单片机程序题 下载本文

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