Ⅰ 求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
引自:偉福單片機開發平台軟體實驗