单片机实验一 冒泡法排序

合集下载

微机原理实验报告冒泡法对数据排序8页

微机原理实验报告冒泡法对数据排序8页

微机原理实验报告冒泡法对数据排序8页
实验目的:通过对冒泡法进行实现,了解算法的实际应用,并且掌握编程语言的基本
技巧。

实验原理:
冒泡排序是一种简单的排序方法,它的基本思想就是通过不断交换相邻的元素,将较
小的元素交换到前面,较大的元素交换到后面,从而将整个数列按从小到大(或从大到小)的顺序进行排列。

实验步骤:
(1)首先,输入需要排序的数据,将这些数据依次存储在数组中。

(2)然后,对这个数组进行冒泡排序操作。

具体的操作是:从数组的第一个元素开始,依次比较相邻两个元素的大小关系,如果后面的元素小于前面的元素,就将它们交换位置,直到将整个数组排列好为止。

(3)最后,输出排列好的数据。

实验代码:
2. 对这个数组进行冒泡排序操作。

实验结果:
输入需要排序的 10 个整数:
5 2 4 7 9 1 3 8
6 0
冒泡排序后的结果为:
0 1 2 3 4 5 6 7 8 9
实验分析:
通过本次实验,我们成功地实现了冒泡法对数据排序的操作。

在程序的实现过程中,
我们利用了C语言中的数组和循环结构等基本语言要素,完成了对数组中的数据进行排序
的操作。

通过本次实验,我们深入了解了算法的实际应用,掌握了编程语言的基本技巧,
对于今后的学习和实践具有重要的意义。

(整理)单片机冒泡排序.

(整理)单片机冒泡排序.

课程名称:嵌入式系统基础实验项目:冒泡排序实验实验地点:专业班级:学号:学生姓名:指导教师:2012年 3 月日一、实验目的和要求1、实验目的(1)熟悉MCS-51指令系统,掌握程序设计方法(2)掌握排序程序算法(3)掌握用循环程序实现数据排列的基本方法2、实验要求(1)根据试验任务要求,编制C51源程序(2)上机调试程序,记录相关调制信息(3)写出实验报告二、实验内容和原理1、实验内容编写并调试一个通用排序子程序,其功能为将RAM 的40H ~4FH 单元16个字符无符号二进制整数按从小到大顺序排列,将排序后数据存储于RAM 的50H ~5FH 单元中。

2、实验原理从40H 单元的第一个开始依次和相邻单元的另一个数比较,如果顺序对,则不作任何操作;如果顺序不对,则将这两个数交换位置。

这样在完成第一遍1-n 次比较后,最大的数到了最后,所以第二遍比较只需要比较2-n 次,最多作1-n 遍比较就可完成排序。

在比较中设立一个标志位flag ,每次进入外循环时把flag 清零,在内循环结束时若flag=1说明排序未完成,进入外循环;若flag=0,说明排序完成,程序结束。

三、主要仪器设备计算机一台操作系统:Windows98/2000/XP应用软件:W AVE6000四、操作方法与实验步骤org 0000hmov r7,#10hmov r0,#40hmov r1,#20hstart: mov a,r1mov @r0,ainc r0DEC r1djnz r7,startmov r7 ,0FHLP0: MOV R0,#40HMOV A,R7MOV R6,#2HCLR 7FHLP1: MOV A,@R0MOV 20H,@R0INC R0MOV 21H ,@R0CLR CSUBB A,21HJC LP2SETB 7FHMOV @R0,20HDEC R0MOV @R0,21HINC R0LP2: DJNZ R6,LP1JNB 7FH,LP3MOV R7,#2HDJNZ R7,LP0LP3: MOV R7,#10HMOV R0,#40HMOV R1,#50HLP4: MOV A,@R0MOV @R1,AINC R0INC R1DJNZ R7,LP4MOV 60H,R0MOV 80H,R1SJMP $END(1)按输入顺序从小到大的序列:(2)按输入顺序为从大到小的序列:(3)按输入顺序为混乱序列:五、实验数据记录和处理本实验采用输入为从小到大的顺序,从大到小的顺序,还有混乱排序三种输入方式。

(中断、冒泡排序、1602)单片机实验报告

(中断、冒泡排序、1602)单片机实验报告

本科生实验报告实验课程单片机实验学院名称信息科学与技术学院专业名称物联网工程学生姓名曹林鑫学生学号201413060301指导教师谢兴红实验地点6B607实验成绩二〇一六年九月二〇一六年十二月实验一冒泡排序(汇编)一.实验目的掌握单片机的汇编语言排序程序。

二.实验内容将单片机内部的数据进行排序,且使用汇编语言。

三.实验要求根据实验内容编写一个程序,数据排列顺序要求是从小到大。

四.实验说明先在片内RAM中存储一组数据,重复地走访过要排序的数据,一次比较两块内存上的数据,如果他们的顺序错误就把他们交换过来。

走访数据的工作是重复地进行直到没有再需要交换,也就是说该列数据已经排序完成。

五.算法分析若文件的初始状态是正序的,一趟扫描即可完成排序。

所需的关键字比较次数C和记录移动次数M均达到最小值:,。

所以,冒泡排序最好的时间复杂度为O(n)。

若初始文件是反序的,需要进行n-1 趟排序。

每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。

在这种情况下,比较和移动次数均达到最大值:冒泡排序的最坏时间复杂度为。

综上,因此冒泡排序总的平均时间复杂度为。

六.实验程序及分析ORG 0000HLJMP mainORG 0100Hmain:MOV 40H,#05H//在40H-44H中随机存放五个立即数MOV 41H,#08HMOV 42H,#09HMOV 43H,#07HMOV 44H,#06HMOV R7,#04H//控制比较循环的次数MOV R6,#04HLOOP3:MOV R0,#40H//指向需要进行比较的数据的地址MOV R1,#41H//MOV A,R6MOV R7,ACLR ALOOP1:CLR CMOV A,@R1MOV 49H,A //交换数据前的备份SUBB A,@R0//用进位标志判断两数的大小JC LOOPLJMP LOOP4LOOP:MOV A, @R0//恢复交换前的备份数据MOV @R1,AMOV @R0,49HLOOP4:INC R0INC R1DJNZ R7,LOOP1//控制比较的次数DJNZ R6,LOOP3//控制比较的轮数LJMP $END六、实验截图排序前内存中的数据排序后内存的数据实验二外部中断一.实验目的1、掌握单片机外部中断的原理及过程。

冒泡法排序实验报告

冒泡法排序实验报告

冒泡法排序实验报告一、实验任务实现N个16位无符号整数的排序,核心程序使用汇编语言实现。

二、程序算法冒泡法:若有n个数需要排序,则第一次遍历n个数,将x[0]与x[1]相比,若x[0]>x[1],则两数交换位置,若x[0]<x[1],则不作任何调整;然后将x[0]与x[2]相比较,若x[0]>x[2],则两数交换位置;若x[0]<x[2],则不作任何调整;依此类推,直到x[0]与x[n]比较完毕为止。

接着第二次遍历n-1个数,将x[1]与x[2]相比,若x[1]>x[2],则两数交换位置,若x[0]<x[1],则不作任何调整;一直到x[1]与x[n]比较完毕为止。

最后一直到只需要遍历2个数,比较调整完毕就可以得到数组从小到大的排列次序,算法在每次遍历时使最小的数象气泡一样冒到顶端,在经历n-1次遍历以后即可得到结果。

三、源程序及注释//冒泡排序法#include <iostream.h>int main(int argc, char* argv[]){unsigned short int x[33]; //排序个数上限为33个unsigned short int i,j,n;unsigned short int a,b;//提示输入排序个数cout<<"Please input the count of numbers: \n";cin>>n;//提示输入需要排序的各个数cout<<"Please input the numbers: \n";x[0] = 0;for(i=1;i<n+1;i++) //初始化需要排序的数组x[n]cin>>x[i];for(i=0;i<=n;i++) //冒泡法排序{for(j=n;j>=i+1;j--) //每次遍历n-i个数{a = x[j-1];b = x[j];_asm{mov ax,a //将一个数读入到axcmp ax,b //比较两数大小jc exit //若a小则跳出xchg ax,b //若b小则两数交换次序mov a,axexit: NOP}x[j-1] = a; //保存两数排序结果x[j] = b;}}//输出排序结果,按从小到大排列cout<<"The Result is : \n";for(i=1;i<n+1;i++)cout<<x[i]<<' ';cout<<'\n';return 0;}四、实验结果。

冒泡法排序(共5张PPT)

冒泡法排序(共5张PPT)

a(i + 1) = t a(i - 1) = t
If a(i) > a(i + 1) Then
(n-1) a(1)与a(2)比较,如果a(1)大,与a(2)交换。
t = a(i)
t = a(i)
方法2 (从后往前 小的数向前上升)
a(i) = a(i + 1) (n-1) a(1)与a(2)比较,如果a(1)大,与a(2)交换。
a(i - 1) = t
(n-1) a(n)与a(n-1)比较,如果a(n)小,与a(n-1)交换,反之,排序完成
Next i
Next j
方法2 (从后往前 小的数向前上升)
(1) 从第n个元素开始与前一个比较,如果比前一个小两元素交换, 依次比较到第1个元素,最终将最小的数换入第1个元素中,a(1)
方法2的核心代码
For j = 2 To 10 For i = 10 To j Step -1 If a(i) < a(i - 1) Then t = a(i) a(i) = a(i - 1) a(i - 1) = t End If Next i
Next j
(2) 重复(1) ,依次比较到第2个元素,最终将最小的数换入第2个元素中,a(2)不动
a(i + 1) = t For j = 10 To 2 Step -1
For i = 1 To j - 1
End If
End If (2) 重复(1) ,依次比较到第2个元素,最终将最小的数换入第2个元素中,a(2)不动
方法1 (从前往后 大的数向后下沉)
I…f a…(i)…<……a(…i …-…1)比…T较he…中n………………………比…较……中……………………

实验报告_冒泡排序法(3篇)

实验报告_冒泡排序法(3篇)

第1篇一、实验目的1. 理解冒泡排序算法的基本原理和操作步骤。

2. 掌握冒泡排序算法的实现方法。

3. 分析冒泡排序算法的时间复杂度和空间复杂度。

4. 通过实验验证冒泡排序算法的效率。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019三、实验原理冒泡排序是一种简单的排序算法,其基本思想是通过多次比较和交换相邻元素,将待排序的序列变为有序序列。

冒泡排序算法的基本步骤如下:1. 从第一个元素开始,相邻的两个元素进行比较,如果它们的顺序错误(即第一个元素大于第二个元素),则交换它们的位置。

2. 重复步骤1,对相邻的元素进行比较和交换,直到整个序列的最后一个元素。

3. 第一轮排序完成后,最大的元素被放置在序列的最后一个位置。

4. 从第一个元素开始,对剩余的元素重复步骤1和步骤2,直到序列的倒数第二个元素。

5. 重复步骤3和步骤4,直到整个序列有序。

四、实验步骤1. 编写冒泡排序算法的C++代码,实现上述算法步骤。

2. 在主函数中创建一个待排序的数组。

3. 调用冒泡排序函数对数组进行排序。

4. 输出排序前后的数组,验证排序结果。

五、实验代码```cppinclude <iostream>using namespace std;// 冒泡排序函数void bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) {// 交换相邻元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}// 打印数组函数void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;}int main() {// 创建待排序的数组int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);// 打印排序前的数组cout << "排序前的数组:\n";printArray(arr, n);// 调用冒泡排序函数bubbleSort(arr, n);// 打印排序后的数组cout << "排序后的数组:\n";printArray(arr, n);return 0;}```六、实验结果与分析1. 运行实验程序,输出排序前后的数组,验证排序结果是否正确。

单片机实验1数据排序

单片机实验1数据排序

电子信息学院实验报告书课程名:《单片机原理及应用实验》题目:实验一数据排序实验软件实验实验类别:【设计】班级:学号:姓名:评语:(1)电路连接调试:□正确□基本正确□不正确(2)实验程序编写:□正确□基本正确□不正确(3)数据测量分析:□准确□基本准确□不准确成绩:□A □B □C □D ,指导教师:批阅时间:年月日1、实验内容或题目题目:数据排序实验实验内容:用冒泡法将内存RAM中几个单字节无符号的正整数,按从小到大的次序重新排列。

2、实验目的与要求实验目的:(1)熟悉51指令系统,掌握程序设计方法;(2)掌握汇编语言设计和调试方法实验要求:将RAM 50H~5AH 中放入不等的数据,编写并调试一个排序子程序,按从小到大的次序重新排列。

3、实验仪器(1)DJ-598K三合一单片机微机试验仪1块(2)PC微机1台4、实验程序框图(供参考)6、实验程序(实验程序清单作为附件放在最后)7、实验步骤将RAM 50H~5AH 中放入不等的数据,运行实验程序后检查50H~5AH中的内容是否按从小到大的次序排列。

8、实验数据RAM 50H~5A中依次放置如下数据:55,66,AA,44,77,22,88,00,33,55,99;程序运行后RAM 50H~5A中的数据依次为:9、思考题本题中,如何修改程序把50H~5AH中内容从大到小排列?答:ORG 0000HMOV DPTR,#2000HMOVX A,@DPTRMOV B,ASWAP AANL A,#0FHINC DPTRMOVX @DPTR,ANC DPTRMOV A,BANL A,#0FHMOVX @DPTR,ASJMP $END<附件> 实验程序清单ORG 0000HLJMP QUEORG 09B0HQUE: MOV R3,#50HQUE1: MOV A,R3MOV R0,AMOV R7,#0AHCLR 00HMOV A,@R0QL2: INC R0MOV R2,ACLR CMOV 22H,@R0CJNE A,22H,QL3 SETB CQL3: MOV A,R2JC QL1SETB 00HXCH A,@R0INC R0QL1: MOV A,@R0DJN2 R7,QL2JB 00H,QUE1 LOOP: SJMP LOOPEND。

单片机与接口技术实验报告--冒泡排序实验

单片机与接口技术实验报告--冒泡排序实验

本科实验报告课程名称:单片机原理与接口技术实验项目:冒泡排序实验实验地点:跨越机房专业班级:学号:学生姓名:指导教师:2012 年4 月10 日一、实验目的和要求(1)熟悉MCS-51指令系统,掌握程序设计方法。

(2)掌握排序程序算法。

(3)掌握用循环程序实现数据排序的基本方法。

二、实验内容和原理编写并调试一个通用排序子程序,其功能为将RAM的40H~4FH单元的16字节无符号二进制整数按从小到大顺序排列,将排序后数据存储于RAM的50H~5FH单元中。

三、主要仪器设备计算机一台;伟福6000四、操作方法与实验步骤(上机源程序)ORG 0000H;该段代码向数据区域40H~4FH写入20H~11HMOV R7,#10H ;数据长度→R7MOV R0,#40H ;首地址→R0MOV R1,#20H ;第一个数据→R1START: MOV A,R1 ;(R1)→AMOV @R0,A ;数据→对应地址INC R0 ;地址加1DEC R1 ;数据减1DJNZ R7,START ;判断赋值完成否MOV R7,#0FH ;数据长度-1→R7LP0: MOV R0,#40H ;数据区域首地址→R0MOV A,R7 ;(R7)→AMOV R6,A ;(R7)→R6CLR 7FH ;设定7FH位为flag,并且flag=0LP1: MOV A,@R0 ;取得数据→AMOV 20H,@R0 ;当前地址中的值暂存到20H中INC R0 ;地址加1MOV 21H,@R0 ;当前地址中的值暂存到21H中CLR C ;清CSUBB A,21H ;相邻两个数相减JC LP2 ;如果前者大于后者则交换相邻的数SETB 7FH ;flag=1MOV @R0,21H ;把前边的数赋给后一个地址DEC R0 ;地址减1MOV @R0,21H ;把后边的数赋给前一个地址INC R0 ;地址加1LP2: DJNZ R6,LP1 ;判断是否到达内循环次数JNB 7FH,LP3 ;判断是否flag=0.如果flag=0,则表示顺序已经排好DJNZ R7,LP0 ;判断是否到达外循环次数LP3: MOV R7,#10H ;获得要传输的数据个数;把40H~4FH单元中数据复制到50H~5FH单元中MOV R0,#40H ;40H→R0MOV R1,#50H ;50H→R1LP4: MOV A,@R0 ;((R0))→AMOV @R1,A ;(A)→(R1)INC R0 ;地址加1INC R1 ;地址加1DJNZ R7,LP4 ;判断赋值是否完成SJMP $ ;程序在此处死循环END五、实验数据记录和处理单步执行观察发现,每一个数都会逐次与它之后的数进行比较,排序,直到所有数据都与其后的数据比较排完后才结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

二、实验原理
多重循环即循环嵌套结构。

多重循环程序的设计方法和单重循环是一样的,只是要分别考虑各重循环的控制条件。

内循环属于外循环体重的具体处理部分。

在多重嵌套中,不允许各个循环体相互交叉,也不允许从外循环跳入内循环,否则编译时会出错。

应该注意每次通过外循环进入内循环式,内循环的初始条件需要重置。

三、程序设计
1、程序流程图
图 1 冒泡法程序流程图2、程序代码
N EQU 10
TAB EQU 30H
ORG 0000H
MOV 30H, #1 ;在30H中输入10个随机数
MOV 31H, #3
MOV 32H, #2
MOV 33H, #4
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调换位置
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个数排序,结果如下:
图 3 对30H中10个数排序后的结果
3、将30H中的数转移到50H中,结果如下:
图 4 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中交换A、B的值得到的结果必然是错误的。

应在比较完A、B的值后,把A还原到比较前的值。

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

相关文档
最新文档