单片机程序题
更新时间: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
正在阅读:
单片机程序题07-03
基于SCP分析的我国动漫产业发展思考08-10
数据库原理及应用实验报告 912-25
2018-2019食品安全法培训试题06-18
浙教版八年级数学上册《第5章一次函数》单元测试题含答案12-07
EWAN Practice Final Exam满分答案01-11
高速路政年终工作总结11-27
三种薪资核算的方法03-14
影像学试题09-28
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 单片机
- 程序
- 北洋条码打印机安装文档
- 电子科大软件工程作业汇总(附答案)
- 会计学院论文选题参考目录
- 张军《西方经济学学习精要与习题集》(第4章 生产技术)
- 第三章 核磁共振碳谱
- 同花顺公式函数应用大全
- 第7章 参数估计课后习题答案
- 2018 - 2019高中化学第四章电化学基础第二节《化学电源》知识点
- 幼儿算术---10以内加减法练习题-直接打印版
- “抓纪律、严管理、强作风”
- 泛函分析第2章_度量空间与赋范线性空间
- 2017年中国啤酒行业现状及市场前景预测(目录) - 图文
- 我国审计收费制度问题
- 全国海岛保护规划2012
- 外文翻译 装备
- 沪教版八年级物理总复习提纲(上下册)
- 柳垭片区2018小学语文名师工作室工作计划
- 县医院15项核心制度
- 车工工艺学复习要点
- 客户关系管理教案(新)