❶ 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个数全部打印出来了。 (实际还应以调试结果为准)
❷ 单片机排序程序
MOV R5,#16
MOV R6,#40H
LONG:
MOV R4,#15;16个数比较15次
MOV A,30H;将30H里面的内容复给A
MOV R0,#31H;让其从31H开始自加到3FH
L:
SUBB A,@R0;31H里面的内容和30H里面的内容进行相减比较求C
JC XU;如果C=0则表示A里面的内容大于@R0里面的内容否则小于跳转XU
INC R0;R0加1到下一单元地址
DJNZ R4,L;15次比较没有结束跳转到L继续执行
AJMP LL;如果15次循环完毕则求出最大值,然后再循环求出次大值
XU:
MOV A,R0;放比较数的地址送A,以清零方便为第二次比较
MOV R1,A;方便清零
MOV A,@R0;最大值送A
INC R0
AJMP LL
LL:
MOV @R1,#00H;最大值地址清零,然后再比较15次求次大值
MOV R6,A;最大值送40H
INC R6
DJNZ R5,LONG;判断是否全部从大到小排完
AJMP TT
TT:
END
❸ 单片机实验数据排序
原发布者:瀚海湛蓝
实验一、数据排序实验一、实验目的熟悉8031指令系统,掌握程序设计方法。二、实验内容编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中几个单元字节无符号的正整数,按从小到大的次序重新排列。三、实验程序框图NNN四、实验步骤1把8032片内RAM区50H—5AH中放入不等的数据(用寄存器读写方法)。2用连续运行方式从起始地址0100H开始运行程序(输入0100后按EXEC键)。3排序结束,显示“P.”。4用寄存器读写方法检查50—5AH中内容应从小到大排列。五、参考程序DORDE:MOVSP,#60H;设置栈指针MOVR3,#50HDORDE1:MOVA,R3MOVR0,A;数据指针传送到R0MOVR7,#0AH;长度送到R7CLR00H;清零标志位MOVA,@R0DORDE2:INCR0MOVR2,ACLRC;清零进位标志MOV22H,@R0CJNEA,22H,DORDE3;是否相等SETBCDORDE3:MOVA,R2JCDORDE4;小于或等于不交换SETB00HXCHA,@R0DECR0XCHA,@R0;大于交换位置INCR0DORDE4:MOVA,@R0DJNZR7,DORDE2JB00H,DORDE1;未完继续MOVR0,#7EH;完,关显示器前三位MOVA,#0FFHMOVR4,#06HDORDE5:MOV@RO,ADECR0DJNZR4,DORDE5MOV7EH,#0CH
❹ 使用单片机汇编语言冒泡法排序
一、实验要求
给出一组随机数,将此组数据排序,使之成为有序数列
二、实验目的
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
引自:伟福单片机开发平台软件实验
❺ 51单片机汇编语言-请编写程序将内部RAM 40H到4FH 中的16个数据按从小到大顺序重新排列。 尽量简单一点的
冒泡排序程序如下:
ORG 0000H
LCALL SORT ; 跳转到排序程序
SJMP $ ; 。
SORT: ; 数据冒泡排序程序
MOV R6, #16 ;参加排序数据的总个数
DEC R6 ; 比较次数 比 数据总数 少 1
L1:
MOV R0, #40H ; 把数据的起始地址40h付给R0
MOV A, R6 ;调整比较次数
MOV R7, A
CLR F0 ; 清交换标志
L2: ;比较
MOV A, @R0 ; 取前一个数启知
INC R0
MOV B, @R0 ; 取后一个数
CJNE A, B, L3 ; 前面的数 与 后面的数 比较, 前-后
L3: ;判断、处理
JC N_JH ; 后面的伏薯数 大于 前面的数,不交换
XCH A,B ; 否则前后两数交换存放
MOV @R0,缺旁者A
DEC R0
MOV @R0,B
INC R0
SETB F0 ; 设交换标志
N_JH:
DJNZ R7, L2 ; 没有比较完,就继续
JNB F0, L_END ; 没有交换过,就结束
DJNZ R6, L1
L_END:
RET ; 排序完成。
;结果是:
;40H中存放着最小的数;
;4FH中存放着最大的数。
❻ 51单片机汇编 排序问题 请各位赐教
单片机排序问题,可以参考:
http://..com/question/148407042.html
试设计一个子程序,其功能为将(RO)指出的内部RAM中6个单字节正整数按从小到大的次序重新排列。
仿真测试通过.
ORG 0000H
MOV 40H, #8AH
MOV 41H, #3BH
MOV 42H, #0B9H
MOV 43H, #47H
MOV 44H, #29H
MOV 45H, #0AFH
CALL SORT6 ;调用排序子程序
NOP
NOP
SJMP $
;-------------------------------------
SORT6: ;排序子程序
MOV R6, #5
S1:
MOV B, R6
MOV R7, B
MOV R0, #40H ;起始地址
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
N_JH:
DJNZ R7, S2
DJNZ R6, S1
RET
;-------------------------------------
END
三字节的加法,在我的空间,也有。
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0
❼ 有谁懂单片机的冒泡法排序吗
懂的人很多的...
就和C语言的是一个道理..
冒泡排序是很费时的...每一次只冒一个..
虽说可能用不了,N-1次,但在某些组合的情况下是会用到那么多次..
这也是为了完全排出大小...
❽ 单片机io口怎么排序呢
这里的PIO口都是个一字节的寄存器,芯片内部规定P2.0为最低位,P2.7为最高位;
而数据的表示方式按约定是高位在左低位在右的排序,所以有你看到的1111 1110的顺序;
而当数据按位进行串行传输,同时先传低位时,就有你想看到的0111 1111 的顺序了;
❾ 编写简单的单片机c语言程序 1、指定数组找最大值 2、排序
#include<stdio.h>
#defineNR10//数组元素个数
/*从主函数开始*/
intmain(intargc,char**argv)
{
intar[NR];
inti;
fprintf(stdout,"请输入%d个整数: ",NR);
/*获取并检查用户输入*/
while(1)
{
/*循环获取NR个数据*/
for(i=0;i<NR;i++)
{
if(fscanf(stdin,"%d",&ar[i])!=1)
{
fprintf(stdout,"输入错误!请重新输入: ");
while(getchar()!=' ');//丢弃多余非法字符
break;//打破内层for循环
}
}
/*检查是否获取到NR个数据*/
if(i!=NR)
{
continue;
}
else
{
break;
}
}
/*查找最大值和最小值*/
intmax,min;
max=ar[0];//假定第一个数为最大值
min=ar[0];//同时假定也第一个数为最大值
/*从第二个数开始比较查找最值*/
for(i=1;i<NR;i++)
{
if(ar[i]>max)//最大值
{
max=ar[i];
}
if(ar[i]<min)//最小值,不能使用elseif,否则会跳过比较
{
min=ar[i];
}
}
fprintf(stdout,"最大值为:%d最小值为:%d ",max,min);
/*接下来:查找第二大值*/
intsecond;
/*先获取前两个数的第一大和第二大值*/
ar[0]>ar[1]?(max=ar[0],second=ar[1]):
(max=ar[1],second=ar[0]);
/*从第2个数开始比较查找*/
for(i=2;i<NR;i++)
{
if(ar[i]>max)//查找最大值:目的是为了比较第二大值
{
second=max;//先把最大值保存给第二大值
max=ar[i];
}
elseif(second<ar[i])//比最大值小的数再看看是否大于第二大值
{
second=ar[i];
}
}
fprintf(stdout,"第二大值为:%d ",second);
return0;
}
(9)单片机中排序的方法有哪些扩展阅读
一、c语言程序求数组内所有数的和:
1、通过索引的方式就可以访问到数组内部的元素,索引是从0到数组长度-1。
2、数组点Lenth就是数组的长度。
二、c语言程序冒泡排序:
1、比较相邻的两个元素的大小,如果第一个比第二个大就互换一下。
2、然后每一对都做如上操作,如此一来最后一个元素肯定是最大的数了。
3、除了最后一个元素,重复以上步骤。然后倒数第二个就是次大的值了
4、一次按照这个逻辑直到没有任何数字可以比较了。