目的:进一步熟悉51 单片机的指令系统。
任务:掌握数据排序程序的设计方法。
将片内RAM 30H 开始的32 个单元中分布的随机8 位二进制数,按从小到大的顺序进行排序,排序后的数据仍然保存到30H 开始的32 个单元中(低地址存放小数据)。
- 实验过程和结果
首先,在程序存储器中构建一个表格,该表格具有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 个单元的数据并找出其中最大者,并记下其所在位置,遍历完这一遍后将找到的最大数据保存在倒数第二个单元(对于所有数据来说它是次最大数据,所以保存在倒数第二个单元),并将倒数第二个单元原来的数据保存在刚刚找到的那个最大值原来所在的位置处,完成第二轮的排序。依次类推,用同样的方法把所有的数据排好序即可。
编写排序之前,我遇到的最大问题是如何打表,如何将ROM中的表格读入到RAM中。我参考书上将表头的地址赋值给DPTR,使用MOVC指令通过A的偏移量将表格读入到内存中,通过循环限制输入的数量为32。
在编写排序时,我将两个“指针”保存到R0和R1,因为只有这两个可以进行寄存器间接寻址。我通过过将两个值相减之后判断进位标志位确定是否执行换位操作。
我在这次的实验报告中熟悉了循环的使用,理解了表格和打表。对汇编语言有了更加深入的认识。
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