51单片机汇编实现冒泡排序

今天为了复习课本上面的程序,就实地检验了下这个程序,当年可是学过微机原理里的冒泡排序的,结果移植平台后又是如此麻烦,呵呵,网上贴吧,论坛,知道,文库上面拜托你们的程序能不能靠谱点!!!

第一种常见的错误就是程序写的一团糟,天马行空,弄了几个位地址和中间变量,外加两个循环,程序早飞了,真是让我们程序员惭愧啊

第二种错误是由于大多参考课本上题目:将以40H为首地址的N个数据进行排序,然后几十行代码,我怎么能很快知道程序对不呢

.................

鉴于此,特在我们这个绿色空间下贴上两种方法实现的冒泡排序完整版,实验程序已全部在keil下调试通过。(为了纪念下今天高考,大哭,好好加油吧

思路:有序的数列更有利于查找。本程序用的是“冒泡排序”法,算法是将一个数与后面的数相比较,如果比后面的数大,则交换,如此将所有的数比较一遍后,最大的数就会在 数列的最后面。再进行下一轮比较,找出第二大数据,直到全部数据有序。

第一种方法:(缺点是不利于移植,优点是以末尾数字为参照,逻辑简单)

///

;冒泡排序
;十个数从小到大排序


ORG 0000H
MOV 60H,#02H ;给60-69H存储单元送初值
MOV 61H,#05H
MOV 62H,#03H
MOV 63H,#07H
MOV 64H,#09H
MOV 65H,#14H
MOV 66H,#13H
MOV 67H,#08H
MOV 68H,#01H
MOV 69H,#12H
MOV R0,#60H
MOV R1,#61H


L2: MOV A,@R0
MOV 50H,@R1
CJNE A,50H,NEQ  ;比较60H与61H中数值的大小,做减法。如果60中的内容大则C位(进位为0)如果60中的内容比61中的小C位为1
NEQ:   JNC EXCHANGE ;是0跳转,左操作数<右操作数
LJMP L3
EXCHANGE: XCH A,@R1 ;交换60与61中的内容
XCH A,@R0
L3: INC R1
CJNE R1,#6AH,L2 ;让62到69中的内容逐一与60中的比较,最后60中的内容就是最小值
INC R0
MOV 51H,R0
MOV R1,51H
INC R1 
CJNE R0,#69H,L2 ;让61中的内容与之后的62到69中的内容比较,61中的内容就为第二小值,以此类推,直到剩最后两个数比较完。

SJMP $
END

///

第二种方法(提倡用该方法,只是两重循环,逻辑性较强,不容易看懂,优点是利于移植)

///

;冒泡排序


;十个数从小到大排序
Size   equ   10              ; 数据个数
Array  equ   60h             ; 数据起始地址
Change equ   0               ; 交换标志
ORG 0000H
MOV 60H,#02H ;给60-69H存储单元送初值
MOV 61H,#05H
MOV 62H,#03H
MOV 63H,#07H
MOV 64H,#09H
MOV 65H,#14H
MOV 66H,#13H
MOV 67H,#08H
MOV 68H,#01H
MOV 69H,#12H
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 

///

  • 24
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码
冒泡排序是一种简单的排序算法,它的基本思想是通过相邻元素之间的比较和交换来把小的数交换到数组的前,大的数交换到数组的后面。在51单片机汇编中,实现冒泡排序算法的步骤如下: 1. 定义一个数组,将需要排序的数据存入数组中。 2. 使用循环语句,外层循环控制排序的轮数,内层循环控制每轮比较的次数。 3. 在内层循环中,比较相邻的两个元素,如果前一个元素比后一个元素大,则交换它们的位置。 4. 每轮比较结束后,最大的元素会被交换到数组的最后面,因此下一轮比较时可以不再考虑已经排好序的元素。 5. 当所有的轮数都完成后,数组中的元素就按照从小到大的顺序排好了序。 下面是51单片机汇编实现冒泡排序算法的代码示例: ; 定义数组 org 0x0000 mov r0, #0x40 ; 数组首地址 mov r1, #0x01 ; 数组长度 mov r2, #0x00 ; 循环计数器 ; 外层循环 loop1: mov r3, #0x00 ; 内层循环计数器 loop2: mov a, @r0 ; 取出当前元素 mov b, @r0+1 ; 取出下一个元素 cjne a, b, swap ; 如果前一个元素比后一个元素大,则交换它们的位置 inc r3 ; 内层循环计数器加1 cjne r3, r1, loop2 ; 如果内层循环计数器小于数组长度,则继续比较 jmp endloop ; 否则跳出内层循环 swap: xch a, b ; 交换两个元素的位置 mov @r0, a ; 将交换后的元素存回数组 mov @r0+1, b inc r3 ; 内层循环计数器加1 cjne r3, r1, loop2 ; 如果内层循环计数器小于数组长度,则继续比较 endloop: inc r2 ; 外层循环计数器加1 cjne r2, r1, loop1 ; 如果外层循环计数器小于数组长度,则继续排序 ; 排序完成,程序结束 end

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值