Ⅰ 求MCS51单片机冒泡法排序程序!高手进!
ORG 0000H
;------------------------下面先准备6个数字
MOV 40H, #8AH
MOV 41H, #3BH
MOV 42H, #0B9H
MOV 43H, #47H
MOV 44H, #29H
MOV 45H, #0AFH
CALL SORT6 ;调用排序子程序
SJMP $ ;停止,此时可以观察排序结果
;-------------------------------------
SORT6: ;排序子程序
MOV R6, #5 ;6个数字,比较5次
S1:
MOV R0, #40H ;起始地址
MOV B, R6
MOV R7, B
CLR PSW.5 ;交换标志清零
S2:
MOV B, @R0 ;取出前一个数
INC R0
MOV A, @R0 ;取出后一个数
CJNE A, B, S3 ;后-前
S3:
JNC N_JH ;够减就不用交换
MOV @R0, B ;交换存放
DEC R0
MOV @R0, A
INC R0
SETB PSW.5 ;设立交换标志位
N_JH:
DJNZ R7, S2
JNB PSW.5, S_END ;没有交换过,就结束
DJNZ R6, S1
S_END:
RET
;-------------------------------------
END
Ⅱ 单片机实验在冒泡排序中,如何实现两个数据大小比较的
用C语言编程,直接比较,例 如
if(a>=b).......
Ⅲ 51单片机冒泡排序中一些细节不懂
SORT:
MOV A, R0 ;R0为首地址
MOV R1, A ;
MOV A, R2 ;R2为字节数n
MOV R5, A ;R5为字节数n
DEC R5 ;循环比较n-1次
CLR F0 ;互换标志位F0清零
LOOP:
MOV A, @R1 ;取前一个数
MOV R3, A ;存到R3
INC R1 ;指向下一个数
MOV A, @R1 ;取下一个数
CLR C ;
SUBB A, R3 ;后-前
JNC LOOP1 ;无借位转移
MOV A, R3 ;取前面大数
XCH A, @R1 ;互换
DEC R1 ;前一个地址
XCH A, @R1 ;小数放到前面
INC R1 ;下一个地址
SETB F0 ;发生互换就把F0置1
LOOP1:
DJNZ R5, LOOP ;循环比较n-1次
JB F0, SORT ;为1转移,即:如果发生互换,就再去比较一轮
RET ;如果没有互换,就说明全都排好了,结束
稍稍改动了一点,便于理解。
Ⅳ C51单片机“冒泡法”排序实例
用keil调试下,就可以知道结果了。
感觉楼主的分析是正确的……
只是不清楚这个程序段的意图是对数组a[]的全部数据进行排序还是仅对其前9个数据排序。
printf("the unsorted numbers:\n");
for(i=0;i<9;i++)
printf("%bx",a[i]);
printf("\n");
printf("the sorted number:\n");
for(i=0;i<=10;i++)
printf("%bx",a[i]);
按常理,这两段应该是对应的,判断条件下面的那个更合理,按分析前面那段只打印未排序前的a[0]~a[8];后面那段却将11个数全部打印出来了。 (实际还应以调试结果为准)
Ⅳ 单片机编程冒泡程序`
打的我手都发麻了,还是一个吧。
程序如下:
ORG 1000H
MOV R0, #40H ; 数据区首址送R0
MOV R3, #63H ; 设置外循环次数在R3中
LP0: CLR 7FH ; 交换标志位2FH.7清0
MOV A, R3 ; 取外循环次数
MOV R2, A ; 设置内循环次数
MOV R0,#40H ; 重新设置数据区首址
LP1: MOV 20H, @R0 ; 数据区数据送20H单元中
MOV A, @ R0 ; 20H内容送A
INC R0 ; 修改地址指针(R0+1)
MOV 21H, @ R0 ; 下一个地址的内容送21H
CLR C ; Cy清0
SUBB A, 21H ; 前一个单元的内容与下一个单元的内容比较
JC LP2 ;若有借位(Cy =1),前者小,程序 转移到 LP2处执行,
若无借位(Cy =0),前者大,不转移,程序往下执行 MOV @ R0, 20H ; 前、后内容交换
DEC R0
MOV @ R0, 21H
INC R0 ; 修改地址指针(R0+1)
SETB 7FH ; 置位交换标志位2FH.7为1
LP2: DJNZ R2, LP1 ; 修改内循环次数R2(减少),
若R2≠0,则程序转到LP1 处仍执行循环,
若R2=0,程序结束循环,程序往下执行
JNB 7FH, LP3 ; 交换标志位2FH.7若为0,则程序转到LP3处结束循环
DJNZ R3, LP0 ; 修改外循环次数R3(减少),
若R3≠0,程序转到LP0处, 执行仍循环,
若R3=0,程序结束循环,往下执行
LP3: SJMP $ ; 程序执行完,“原地踏步”
END
Ⅵ 有谁懂单片机的冒泡法排序吗
懂的人很多的...
就和C语言的是一个道理..
冒泡排序是很费时的...每一次只冒一个..
虽说可能用不了,N-1次,但在某些组合的情况下是会用到那么多次..
这也是为了完全排出大小...
Ⅶ 使用单片机汇编语言冒泡法排序
一、实验要求
给出一组随机数,将此组数据排序,使之成为有序数列
二、实验目的
1.了解数据排序的简单算法。
2.了解数列的有序和无序概念
三、实验说明
有序的数列更有利于查找。本程序用的是“冒泡排序”法,算法是将一个数与后面的
数相比较,如果比后面的数大,则交换,如此将所有的数比较一遍后,最大的数就会在
数列的最后面。再进行下一轮比较,找出第二大数据,直到全部数据有序。
四、程序框图
Size equ 10 ; 数据个数
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
引自:伟福单片机开发平台软件实验