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

///////////////////////////////

时间: 2024-10-17 02:04:49

51单片机汇编实现冒泡排序的相关文章

Windows 通用应用尝试开发 “51单片机汇编”总结

一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几天,算起来基本弄了3个多星期吧.不多说,总结总结. 二.开发数据准备 应用中主要的数据是单片机的汇编指令,我主要用XML文件来储存数据,没有使用SQLLite数据库,数据格式如下图: xml文件的数据是我手输入的,所以这是比较烦的.(可能有更简洁的办法获取数据). 而xml文件每个每个节点对应实例,

Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

一.前言 昨天更新了10天前上架到windows8.1平台和windowsphone平台的通用应用“51单片机汇编”,总要是添加了动态磁贴以及ListView的Groupstyle应用.下面主要主要复习下如何利用后台任务添加动态磁贴 二.动态磁贴 动态磁贴也是前几天才掌握的,基本内容可以查看我之前的有关动态磁贴博文.在这里我理顺在我的应用中,利用backgroudtask动态更新磁贴. step1:首先先添加backgroutask组件.如图一.二 step2: 将backgroundtask引

51单片机汇编溢出标志OV和进位标志位CY

ORG 0000H MOV A,  #1MOV R0,#126ADD A, R0 NOPEND A R0 A结果 CY A(s) R0(s) A结果(s) OV 1 126 127 0 1 126 127 0 1 127 128 0 1 127 -128 1 1 128 129 0 1 -128 -127 0 1 254 255 0 1 -2 -1 0 1 255 0 1 1 -1 0 0 5 255 4 1 5 -1 4 0 176 176 96 1 -80 -80 96 1 126 1 12

[51单片机学习笔记ONE]-----LED灯的多种使用方法

一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间间隔1s 3 实验时间: 2014年12月2日 4 ******************************************************/ 5 6 #include <reg51.h> 7 8 void delay(unsigned char a); 9 10 void m

[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]

这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c 1 /*----------------------------------------------- 2 名称:IIC协议 3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 4 周期,即晶振频率要小于12MHZ) 5 ---------------------------------------

[51单片机] EEPROM 24c02 + 数码管 + 中断 [统计开机次数]

>_<:24c02的SCL连P2.0;SDA连P2.1;WP接GND;P0接8位数码管的8针;P2.2连段码;P2.3连位码; >_<:delay.c 1 #include "delay.h" 2 /*------------------------------------------------ 3 uS延时函数,含有输入参数 unsigned char t,无返回值 4 unsigned char 是定义无符号字符变量,其值的范围是 5 0~255 这里使用

(转)STC 51单片机烧录协议分析

前段时间买了一个51单片机开发板.买完后发现,这开发板和芯片的厂家都是十分山寨. 芯片产家叫STC,江湖人称"死太惨",它的中文名字叫"宏晶科技",官网是:www.stcmcu.com,相信在打开这个网站之后,你就同意我的看法了.如果还不够的话,可以下载它的芯片手册:STC90C516RD+ PDF,或者 烧录软件,体验体验. 开发板的产家叫做普中科技,一个连官方论坛都打不开的神秘企业,谢天谢地,它还是有官网的:www.prechin.com. 虽然山寨味浓厚,但是

51单片机指令详解

                                                            数据传递类指令 以累加器为目的操作数的指令  MOV A,Rn MOV A,direct MOV A,@Ri  MOV A,#data  第一条指令中,Rn代表的是R0-R7.第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的.第四条指令是将立即数data送到A中. 下面我们通过一些例子加以说明: MOV A,R1 :将工作寄存器R1中的值送入A,R

51单片机

STARTUP.A51//启动文件. 清理RAM.设置堆栈等.即执行完start.a51后跳转到.c文件的main函数 <reg51.h>  //特殊寄存器的字节地址和位地址,sfr定义字节变量.sbit定义位变量,用通俗名作为变量名,并赋地址值,从而用名称来使用这些特殊寄存器. <intrins.h> //定义了一些外部函数,在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便. /*-----------------------------