单片机程序题

更新时间:2023-12-26 17:27:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

3.14 已知M1和M2单元中存放有两个16位无符号数X1和X2(低8位在前,高8位在后)试写出X1+X2并把结果放在M1和M1+1单元(低8位在M1单元,高8位在M1+1单元)的程序。设两数之和不会超过16位。 程序如下:

ORG 0500H ;X1的起始地址送R0 MOV R0,#M1 ;X2的起始地址R1 MOV R1,#M2 ;A?X1的低8位

MOV A,@R0 ;A?X1低8位+X2低8位,形成Cy ADD A ,@R1 ;和的低8位存M1 MOV @R0,A ;修改地址指针R0 INC R0 ;修改地址指针R1 INC R1 ;A<--X1高8位

MOV A, @R0 ;A<--X1高8位+X2高8位+Cy ADDC A,@R1 ;和的高8位存M1+1 MOV @R0,A ;停机 SJMP $ END

3.19 已知两个8位无符号乘数分别放在30H和31H单元中,试编出令它们相乘并把积的低8位放入32H单元中、积的高8位放入33H单元的程序。 程序如下: ORG 0100H

MOV R0 ,#30H ;R0<--第一个乘数地址 MOV A ,@R0 ;A<--第一个乘数 INC R0 ;修改乘数地址 MOV B,@R0 ;B<--第二个乘数 MUL AB ;A X B =BA

INC R0 ;修改目标单元地址 MOV @R0,A ;积的低8位--.>32H INC R0 ;修改目标单元地址 MOV @R0,B ;积的高8位--.>33H SJMP $ ;停机 END

3.25 已知M1和M1+1单元中有一个16位的二进制数(M1中为低8位),请通过编程令其扩大二倍(设该数扩大后小于65536)。 程序如下: ORG 1000H

CLR C ;Cy<--0

MOV R1 ,#M1 ;操作数低8位地址送R1 MOV A,@R1 ;A<--操作数低8位

RLC A ;低8位操作数左移,低位补0 MOV @R1,A ;送回M1单元,Cy中为最高位

INC R1 ; R1指向M1+1单元 MOV A,@R1 ;A<--操作数高8位 RLC A ;高8位操作数左移

MOV @R1 , A ;送回M1+1单元 SJMP $ ;停机 END

3.26 在M1和M1+1单元中有两个BCD数,请通过编程将它们紧缩成一个字节并放入M1单元。 程序如下:

ORG 0001H MOV R1,#M1 ;地址M1送R1 MOV A,@R1 ;A<--M1中BCD数 SWAP A, ;BCD1移入高4位 INC R1 ;修改地址指针R1

ORL A,@R1 ;BCD1和BCD2合并后送A MOV M1,A ;送回M1单元 SJMP $ ;停机 END

3.31 已知:外部RAM中以DATA1(DATA1在0页内)为起始地址的数据块以零为结束标志。试通过编程将之传送到以DATA2为起始地址的内部RAM区。 程序如下:

ORG 0500H

MOV R0,#DATA1 ;外部RAM数据块起始地址送R0 MOV R1,#DATA2 ;内部RAM数据块起始地址送R1 LOOP: MOVX A,@R0 ;外部RAM取数送A JZ DONE ;若A=0,则转DONE

MOV @R1,A ;若A≠0,则给内部RAM送数 INC R0 ;修改外部RAM地址指针 INC R1 ;修改内部RAM地址指针 SJMP LOOP ;循环 DONE :SJMP $ ;结束 END

3.32 试编一程序令片内RAM中以DAT为起始地址的数据块中连续10个无符号数相加,并累加送到SUM单元。这里的累加和是不考虑进位的和,所以它们为二进制8位。 程序如下:

ORG 1000H

MOV R2,#0AH ;数据块长度送R2 MOV R0,#DAT ;数据块起始地址送R0 CLR A ;累加器清零 LOOP:ADD A ,@R0 ;加一个数

INC R0 ;修改加数地址指针 DJNZ R2,LOOP ;若R2-1≠0,则LOOP MOV SUM ,A ;存和 SJMP $ ;结束 END

3.35 试利用子程序技术编出令20H—2AH、30H—3EH和40H—4FH三个子域清零的程

序。

ORG 1000H

MOV SP,#70H ;令堆栈的栈底地址为70H MOV R0,#20H ;第一清零区起始地址送R0 MOV R2,#0BH ;第一清零区起始地址送R2 ACALL ZERO ;给20H-2AH区清零

MOV R0,#30H ;第二清零区起始地址送R0 MOV R2,#0FH ;第二清零区单元数送R2 ACALL ZERO ;给40H-4FH单元清零 SJMP $ ;结束 ORG 1050H

ZERO:MOV @R0,#00H ;清零

INC R0 ;修改清零区指针

DJNZ R2,ZERO ;若R2-1≠0,则ZERO RET ;返回 END

3.10 试编出把外部RAM的2050H单元中的内容相交换的程序。 程序如下:

ORG 0500H

MOV DPTR,#2050H

MOVX A,@DPTR ;A<--(2050H)=X MOV R0,A ;存入R0 MOV DPTR,#2060H

MOVX A,@DPTR ;A<--(2060H)=Y XCH A,R0 ;A?R0 MOVX @DPTR,A ;2060H<--X MOV A,R0 ;A<--Y MOV DPTR ,#2050H

MOVX @DPTR,A ;2050H<--Y SJMP $ END

4..2 请编写能把20H单元内两个BCD数变换成相应的ASCII码并放在21H(高位BCD数的ASCII码)和22H(低位BCD数的ASCII码)单元的程序。

程序如下: ORG 0500H

MOV R0,#22H ;R0<--22H

MOV @R0,#00H ;22H单元清零

MOV A,20H ;20H中BCD数送A XCHD A,@R0 ;低位BCD数至22H ORL 22H,#30H ;完成低位BCD数转换 SWAP A ;高位BCD数送抵4位 ORL A ,#30H ;完成高位BCD数转换 MOV 21H, A ;存入21H单元 SJMP $ ;结束

END

4.4 已知20H单元中有一个二进制数,请编程把它转换为3位BCD数,把百位BCD数送入FIRST单元的低4位,十位和个位BCD数放在SECOND单元,十位BCD数在SECOND单元中的高4位。 程序如下:

ORG 0200H FIRST DATA 30H SECOND DATA 31H

MOV A,20H ;被除数送A MOV B,#64H ;除数100送B DIV AB ;A%B=A----B

MOV FIRST ,A ;百位BCD送FIRST MOV A,B ;余数10送B MOV B,#0AH ;除数10送B DIV AB ;A%B=A---B SWAP A ;十位BCD送高4位

ORL A,B ;完成十位和个位BCD数装配 MOV SECOND,A ;存入SECOND单元 SJMP $ ;结束 END

4.5 已知VAR单元内有一自变量X,请按如下条件编出求函数值Y并将它存入FUNC单元的程序。

1 X>0 Y= 0 X=0 -1 X<0

先分支后赋值 先赋值后赋值 ORG 0100H ORG 0100H VAR DATA 30H VAR DATA 30H FUNC DATA 31H FUNC DATA 31H

MOV A,VAR ;A<--X MOV A,VAR ;A<--X JZ DONE ;若X=0,则转DONE JZ DONE ;若X=0,则转DONE JNB ACC.7,POSI ;若X>0,则转POSI MOV R0,#0FFH ;若X≠0,则R0<--1 MOV A, #0FFH ;若X<0.,则A<-- -1 JB ACC.7,NEG ;若X<0,则转NEG SJMP DONE ;转DONE MOV R0,#01H ;若X>0,R0<--1 POSI:MOV A,#01H ;A<--1 NEG :MOV A,R0 ;A<--R0 DONE:MOV FUNC ,A ;存Y值 DONE:MOV FUNC,A;存Y值 SJMP $ SJMP $ END END

4.7 已知两个带符号数分别存入ONE和TWO单元,试编程比较它们的大小,并把大数存入MAX单元。 程序如下:

ORG 0400H ONE DATA 30H

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单元的程序。 程序如下:

inc b

cjne r0, #LEDBuf+6, FillBuf mov DelayT,#30 DispAgain:

call DisplayLED ; 显示 djnz DelayT,DispAgain

ljmp MLoop end 8.外部中断实验

LED equ P1.0 LEDBuf equ 0

ljmp Start org 3 Interrupt0:

push PSW ; 保护现场 cpl LEDBuf ; 取反LED mov c, LEDBuf mov LED, c

pop PSW ; 恢复现场 reti Start:

clr LEDBuf clr LED

mov TCON, #01h ; 外部中断0下降沿触发

mov IE, #81h ; 打开外部中断允许位(EX0)及总中断允许位(EA) ljmp $ end

9.外部中断(急救车与交通灯)

Flash equ 0 ; LED状态 STOP equ 1

SR equ P1.0 ; 南北红灯 SG equ P1.1 ; 南北绿灯 SY equ P1.2 ; 南北黄灯 ER equ P1.3 ; 东西红灯 EG equ P1.4 ; 东西绿灯 EY equ P1.5 ; 东西黄灯 ljmp Start org 3

setb STOP ; 南北, 东西均红灯 reti Start:

mov SP, #70

mov TCON, #01h ; down edge IT0 mov IE, #81h ; enable EA, EX0 setb SR ; 南北, 东西均红灯 clr SY clr SG

setb ER clr EY clr EG clr Loop:

jb setb clr clr clr clr setb mov call jb setb clr clr clr clr clr clr mov Loop1:

mov mov mov call cpl djnz jb clr clr setb setb clr clr mov STOP STOP, AllRed

SR SY SG ER EY EG a, #20 Delay

STOP, AllRed

SR SY SG ER EY EG Flash r7, #9 c, Flash EY, c a, #1 Delay Flash r7, Loop1 STOP, AllRed

SR SY SG ER EY EG a, #20

; 南北红灯, 东西绿灯 ; 南北红灯, 东西黄灯闪; 南北绿灯, 东西红灯 call Delay

jb STOP, AllRed

clr SR ; 东西红灯, 南北黄灯闪 clr SY clr SG

setb ER clr EY clr EG clr Flash mov r7, #9 Loop2:

mov c, Flash mov SY, c mov a, #1 call Delay cpl Flash djnz r7, Loop2 ljmp Loop AllRed:

setb SR clr SY clr SG setb ER clr EY clr EG clr STOP mov a, #10 call Delay ljmp Loop Delay: ; 延时子程序

mov r1, #80H mov r0, #0 DelayLoop:

jb STOP, ExitDelay djnz r0, DelayLoop djnz r1, DelayLoop djnz ACC, Delay ExitDelay: ret End.

10.计数器实验

mov TMOD, #00000101b mov TH0, #0

; 方式1,记数器 mov TL0, #0

setb TR0 ; 开始记数 Loop:

mov P1, TL0 ; 将记数结果送P1口 ljmp Loop End

TEMP EQU 30H ORG 0000H

START: MOV SP,#5FH MOV P2,#73H MOV P1,#0FFH NOKEY:

MOV A,P1 CPL A

JZ NOKEY MOV TEMP,P1 MOV A,P1

CJNE A,TEMP,NOKEY MOV R7,#16 MOV R2,#0

LOOP:MOV A,R2

MOV DPTR,#CODE_P0 MOVC A,@A+DPTR MOV P2,A INC R2 LCALL DL1S

DJNZ R7,LOOP SJMP START DL10ms:

MOV R6,#125 DL1: MOV R5,#98 NOP

DL2: DJNZ R5,DL2 DJNZ R6,DL1 RET

DL1s: MOV R4,#13 DL3: ACALL DL10ms DJNZ R4,DL3 RET

CODE_P0: DB 3FH,06H,5BH,4FH

DB 66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH

DB 39H,5EH,79H,71H

end

TEMP EQU ORG

START: MOV MOV MOV 30H 0000H SP,#5FH P2,#73H P1,#0FFH

NOKEY:

MOV A,P1 CPL A

JZ NOKEY MOV TEMP,P1 MOV A,P1

CJNE A,TEMP,NOKEY MOV R7,#16 MOV R2,#0

LOOP:MOV A,R2

MOV DPTR,#CODE_P0 MOVC A,@A+DPTR MOV P2,A INC R2 LCALL DL1S

DJNZ R7,LOOP SJMP START DL10ms:

MOV R6,#125 DL1: MOV R5,#98 NOP

DL2: DJNZ R5,DL2 DJNZ R6,DL1 RET

DL1s: MOV R4,#13 DL3: ACALL DL10ms DJNZ R4,DL3 RET

CODE_P0: DB 3FH,06H,5BH,4FH

DB 66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH

DB 39H,5EH,79H,71H

end

TEMP EQU 30H ORG 0000H

START: MOV SP,#5FH MOV P2,#73H MOV P1,#0FFH NOKEY:

MOV A,P1 CPL A

JZ NOKEY MOV TEMP,P1 MOV A,P1

CJNE A,TEMP,NOKEY MOV R7,#16 MOV R2,#0

LOOP:MOV A,R2

MOV DPTR,#CODE_P0 MOVC A,@A+DPTR MOV P2,A INC R2 LCALL DL1S

DJNZ R7,LOOP SJMP START DL10ms:

MOV R6,#125 DL1: MOV R5,#98 NOP

DL2: DJNZ R5,DL2 DJNZ R6,DL1 RET

DL1s: MOV R4,#13 DL3: ACALL DL10ms DJNZ R4,DL3 RET

CODE_P0: DB 3FH,06H,5BH,4FH

DB 66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH

DB 39H,5EH,79H,71H

end

本文来源:https://www.bwwdw.com/article/1ozx.html

Top