单片机程序题

更新时间:2024-07-03 18:18: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单元的程序。 程序如下:

程序如下:

ORG 0200H VAR DATA 20H FUNC DATA 21H

MOV A,VAR ;A<--(20H) CJNE A,#50H ,NEXT1 ;建立Cy

NEXT1: JNC DONE ;若X>=50,则DONE CJNE A,#20H,NEXT2 ;建立Cy

NEXT2: JC NEXT3 ;若X<20,则NEXT3 RL A ;若X>19,则A=5X RL A

ADD A,20H ;A<--5X SJMP DONE

NEXT3: RL A ;A<--2X

DONE: MOV FUNC ,A ;21H<--A SJMP $ END 实验程序: 1.存储块清零

Block equ 4000h

mov dptr, #Block ; 起始地址 mov r0, #0 ; 清 256 字节 clr a Loop:

movx @dptr, a

inc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一 ljmp $ end

1,二进制到ASCII码转换

将 A 拆为二个 ASCII 码, 并存入 Result 开始的二个单元 Result equ 20h org 0 ljmp Start ASCIITab:

db '0123456789ABCDEF' ; 定义数字对应的ASCII表 BinToHex:

mov dptr, #ASCIITab

mov b, a ; 暂存 A swap a

anl a, #0fh ; 取高四位 movc a, @a+dptr ; 查ASCII表 mov Result, a

mov a, b ; 恢复 A

anl a, #0fh ; 取低四位 movc a, @a+dptr ; 查ASCII表 mov Result+1, a ret Start:

mov sp, #40h mov a, #1ah call BinToHex ljmp $ End 2.程序跳转表

org 0 ljmp Start Func0: mov a, #0 ret

Func1: mov a, #1 ret

Func2: mov a, #2 ret

Func3: mov a, #3 ret FuncEnter:

add a, acc mov dptr, #FuncTab jmp @a+dptr FuncTab:

ajmp Func0 ajmp Func1 ajmp Func2 ajmp Func3 Start:

mov a, #0 call FuncEnter mov a, #1 call FuncEnter mov a, #2 call FuncEnter mov a, #3 call FuncEnter ljmp $ end

3.数据排序

Size equ 10 ; ajmp 为二字节指令, 调用号 X 2 ; 数据个数

Array equ 50h ; 数据起始地址 Change equ 0 ; 交换标志 Sort:

mov r0, #Array mov r7, #Size-1 clr Change Goon:

mov a, @r0 mov r2, a inc r0

mov B, @r0

cjne a, B, NotEqual sjmp Next NotEqual:

jc Next setb Change xch a, @r0 dec r0 xch a, @r0 inc r0 Next:

djnz r7, Goon jb Change, Sort ljmp $ end

4. IO口输入输出 Loop: mov a, #01h mov r2, #8 Output: mov p1,a rr a call Delay djnz r2,Output ljmp loop Delay: mov r6, #0 mov r7, #0 DelayLoop:

djnz r6, DelayLoop djnz r7, DelayLoop ret end

5. KeyLeft equ P1.0

; 前小后大, 不交换 ; 前大后小, 置交换标志 ; 交换

KeyRight equ P1.1 LedLeft equ P1.2 LedRight equ P1.3

SETB KeyLeft SETB KeyRight Loop:

MOV C,KeyLeft MOV LedLeft,C MOV C,KeyRight MOV Ledright,C LJMP Loop END

5.用74HC245输入数据 CS245 equ 8000h org 0000h Loop:

mov dptr,#CS245 movx a, @dptr ljmp Loop end

6.用74HC273输出数据 CS273 equ 8000h mov dptr, #CS273 mov a, #1 Loop:

movx @dptr, a rl a nop

ljmp Loop end

.7.八段数码管显示

OUTBIT equ 08002h ; 位控制口 OUTSEG equ 08004h ; 段控制口 IN equ 08001h ; 键盘读入口 LEDBuf equ 60h ; 显示缓冲 Num equ 70h ; 显示的数据 DelayT equ 75h ; ljmp Start

LEDMAP: ; 八段管显示码

db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序 mov r7, #0

DelayLoop:

djnz r7, DelayLoop djnz r6, DelayLoop ret DisplayLED:

mov r0, #LEDBuf

mov r1, #6 ; 共6个八段管 mov r2, #00100000b ; 从左边开始显示 Loop:

mov dptr, #OUTBIT mov a, #0

movx @dptr, a ; 关所有八段管 mov a, @r0

mov dptr, #OUTSEG movx @dptr,a

mov dptr, #OUTBIT mov a, r2

movx @dptr, a ; 显示一位八段管 mov r6, #01 call Delay

mov a, r2 ; 显示下一位 rr a mov r2, a inc r0

djnz r1, Loop

mov dptr, #OUTBIT mov a, #0

movx @dptr, a ; 关所有八段管 ret Start:

mov sp, #40h mov Num, #0 MLoop:

inc Num mov a, Num mov b, a

mov r0, #LEDBuf FillBuf:

mov a, b anl a, #0fh

mov dptr, #LEDMap

movc a, @a+dptr ; 数字转换成显示码

mov @r0,a ; 显示在码填入显示缓冲 inc r0

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/cfk.html

Top