爱玩科技网
您的当前位置:首页(完整word版)单片机实验一冒泡法排序

(完整word版)单片机实验一冒泡法排序

来源:爱玩科技网
(完整word版)单片机实验一冒泡法排序

实验一:冒泡法排序实验

一、 实验要求

实验目的:掌握控制转移指令的功能,以及冒泡法排序的原理。

实验要求:设30H开始的10个存储单元中,存放的是无符号数,编写程序实现:10个数排序,存放在50H开始的单元中。

二、 实验原理

多重循环即循环嵌套结构.多重循环程序的设计方法和单重循环是一样的,只是要分别考虑各重循环的控制条件.内循环属于外循环体重的具体处理部分。在多重嵌套中,不允许各个循环体相互交叉,也不允许从外循环跳入内循环,否则编译时会出错.应该注意每次通过外循环进入内循环式,内循环的初始条件需要重置。

三、程序设计

1、程序流程图

(完整word版)单片机实验一冒泡法排序

开始R4 ←外循环次数R3 ←内循环次数R0 ←缓冲区首地址B ←((R0))A ←((R0)+1)(A)≥(B)?N((R0))←→ ((R0)+1)YR0←(R0)+1(R3)-1=0?Y(R4)-1=0?YR0←30HR1←31HNN((R1))←((R0))((R0))←((R0)+1)((R1))←((R1)+1)N(R7)-1=0?Y结束 图 1 冒泡法程序流程图

2、程序代码

N EQU 10 TAB EQU 30H

ORG 0000H

MOV 30H, #1 ;在30H中输入10个随机数 MOV 31H, #3 MOV 32H, #2 MOV 33H, #4

(完整word版)单片机实验一冒泡法排序

MOV 34H, #6 MOV 35H, #8 MOV 36H, #7 MOV 37H, #11 MOV 38H, #9 MOV 39H, #10

SORT: MOV R4, #N-1

LOOP1: MOV A,R4 ;冒泡法循环

MOV R3, A

MOV @R0, #TAB

LOOP2: MOV A, @R0

MOV B, A INC R0 MOV A, @R0 CLR C MOV R2, A SUBB A, B JNC UNEXCH MOV A, R2

UNEXCH: DJNZ R3, LOOP2 ;如果A〈B,顺序执行UNEXCH

DJNZ R4, LOOP1 LJMP SWITCH

EXCH: DEC R0 ;如果A>B,则A,B调换位置

(完整word版)单片机实验一冒泡法排序

XCH A, @R0 INC R0 MOV @R0, A

SWITCH: MOV R0, #30H

MOV R1, #50H MOV R2, #N

PAIXU: MOV A, @R0 ;将30H中排好的数移动到50H中

MOV @R1, A INC R0 INC R1 DEC R2

CJNE R2, #0, PAIXU SJMP $ END

四、程序验证

1、 在30H中输入10个数,显示如下:

图 2 30H单元中存储的10个数

2、 对30H中的10个数排序,结果如下:

(完整word版)单片机实验一冒泡法排序

图 错误!未定义书签。 对30H中10个数排序后的结果

3、 将30H中的数转移到50H中,结果如下:

图 3 30H中10个数转移到50H之后的结果

结论:程序基本符合实验要求.但第10个数会“丢失\"。因为按Loop1、Loop2循循环,第10个数(39H)要跟第11个数(40H)交换,而(40H)=00。故39H中的数会“丢失\".

五、实验总结

1、本实验用汇编语言写冒泡法程序,算法基本思路与C语言的冒泡法程序相似,可参照C语言程序编写汇编语言程序。

2、先画算法流程图再写程序有助于理清思路。

3、本实验汇编程序参考了课本P 的冒泡法例程。但书上的程序Loop2处有错误: 书上的算法是:

SUBB A, B JNC UNEXH

此时A=(A)—(B)-(cy),存储器A中的值已经改变,不再是30H中的某个数。下面算法EXCH中交

(完整word版)单片机实验一冒泡法排序

换A、B的值得到的结果必然是错误的。应在比较完A、B的值后,把A还原到比较前的值。

4、算法中39H中的数据“丢失”问题还需进一步思考解决。

因篇幅问题不能全部显示,请点此查看更多更全内容