单片机--数据排序实验

  1. 实验目的和任务

目的:进一步熟悉51 单片机的指令系统。

任务:掌握数据排序程序的设计方法。

  1. 实验内容

将片内RAM 30H 开始的32 个单元中分布的随机8 位二进制数,按从小到大的顺序进行排序,排序后的数据仍然保存到30H 开始的32 个单元中(低地址存放小数据)。

  1. 实验过程和结果

首先,在程序存储器中构建一个表格,该表格具有32 个随机产生的8位二进制数,如:

TABLE: DB 1,3,9,2,17,4,11,6

DB 5,20,100,64,21,14,79,35

DB 92,7,91,23,65,16,13,18

DB 18,73,65,101,27,19,62,69

然后利用查表指令“MOVC A,@A+DPTR”将它们读取到30H-4FH 单元中,然后再利用“冒泡法排序法”将它们排序即可。

“冒泡法排序法”的基本原理是:遍历所有32 个数据找出其中的最大者,并记下最大数据所在的存储位置,然后将这个最大的数据放置在最后一个单元,同时,将最后一个单元原来的数据保存到这个最大值原来所处的位置,完成第一轮的排序。然后,再遍历除了最后一个单元以外的前面31 个单元的数据并找出其中最大者,并记下其所在位置,遍历完这一遍后将找到的最大数据保存在倒数第二个单元(对于所有数据来说它是次最大数据,所以保存在倒数第二个单元),并将倒数第二个单元原来的数据保存在刚刚找到的那个最大值原来所在的位置处,完成第二轮的排序。依次类推,用同样的方法把所有的数据排好序即可。

  1. 实验心得

编写排序之前,我遇到的最大问题是如何打表,如何将ROM中的表格读入到RAM中。我参考书上将表头的地址赋值给DPTR,使用MOVC指令通过A的偏移量将表格读入到内存中,通过循环限制输入的数量为32。

在编写排序时,我将两个“指针”保存到R0和R1,因为只有这两个可以进行寄存器间接寻址。我通过过将两个值相减之后判断进位标志位确定是否执行换位操作。

我在这次的实验报告中熟悉了循环的使用,理解了表格和打表。对汇编语言有了更加深入的认识。

  1. 附录(代码)

ORG 0000H

AJMP MAIN

ORG 0030H           定义程序入口地址

MAIN:MOV R2,#0H        

MOV R3,#20H

MOV R0,#30H

MOV R4,#0H

MOV R5,#21H

MOV R1,#50H

MOV R7,#1H         将立即数送给寄存器R0-R7

MOV DPTR,#TABLE          将TABLE中数据装入DPTR

S2: CLR C          将C清零

MOV A,R2         将R2送给累加器A

MOVC A,@A+DPTR         将DPTR内容送给累加器A

MOV @R0,A       将A中内容送给寄存器R0

INC R0

INC R2           R0和R2增一

MOV A,R2       将R2送给累加器A  

SUBB A,R3       将R3送给累加器A

JNC S1      进位标志位为0则转移

SETB C            进位标志位取反

JC S2             进位标志位为1则转移

S1:MOV A,30H          将30H 内容送给累加器A

MOV R2,#0H          将0H送给寄存器R2

MOV R0,#30H         将30H送给寄存器R0

S4:CLR C                 进位标志位清零

INC R0           

INC R2         R0、R2增一

MOV A,30H

MOV R4,A    ;R4负责存每次比完较大的那个数

MOV A,R2

SUBB A,R3   ;当比完最后一个数时,R2=32

JNC S5      进位标志位为0则转移

MOV A,30H        将30H 内容送给累加器A

SUBB A,@R0       间接寻址R0中内容送给累加器A

JC S3               进位标志位为1则转移

SETB C            进位标志位取反

JC S4               进位标志位为1则转移

S5:MOV A,R3          将R3送给累加器A 

SUBB A,R5          累加器内容送给A

JC S6 

S7:CLR C             进位标志位清零

MOV A,30H           将30H 内容送给累加器A

MOV R2,#0H         将0H 内容送给累加器A

MOV R0,#30H    将30H 送给累加器A         

SETB C      进位标志位置一

JC S4

S3:MOV A,@R0         将R0内容送给累加器A

MOV @R0,30H      J将30H内容送给30H

MOV 30H,A          将累加器A中内容送给累加器A

SETB C          进位标志位置一

JC S4        进位标志位为一则跳转

S6:DEC R0               

MOV 30H,@R0        将R0内容间接寻址到30H

MOV A,R4            奖R4内容送给A

MOV @R0,A          将A中内容送给R0

DEC R1

DEC R3

MOV A,R3         将R3内容送给累加器A

SUBB A,R7        累加器内容减去R7内容

JC S8      进位标志位为1转移

SETB C          进位标志位置一

JC S7         进位标志位为1转移

TABLE:  DB 1,3,9,2,17,4,11,6

        DB 5,20,100,64,21,14,79,35

        DB 92,7,91,23,65,16,13,18

        DB 18,73,65,101,27,19,62,69

S8:SJMP $            

END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜航一直在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值