单片机实验报告1
单片机实验报告 实验一
数据传送 (RA M – 〉XRA M)
一、实验目得
熟悉星研集成环境软件或熟悉 Keil C51集成环境软件得使用方法。
熟悉 MCS51 汇编指令,能自己编写简单得程序,掌握数据传输得方法。
二、实验内容
1、熟悉星研集成环境软件或熟悉Keil C51 集成环境软件得安装与使用方法。
2、编写程序,实现内外部数据段得传送、校验。
三、程序框图
开始 堆栈指针初始化计数器、地址初始化内部RAM数据传送外部RAM一次地址指针+1
计数器-1=0?计数器、地址指针复位取内部RAM和对应的外部RAM比较是否相等地址指针+1
计数器-1=0?传送正确传送错误结束NNYYYN数据传送程序框图 四、实验步骤
MAR 据数部外测检,序程试调式方点断、步单用使;据数入输中HF3~ H03 MAR 部内在ﻩ得 1000H ~100FH 中得内容。熟悉查瞧特殊功能寄存器、内部数据 RAM、外部数据空间得各种方法. 五、程序清单
;将内部RAM Address1 开始得 16个字节送到外部RAM从 Address2开始得单元里,再作比较。
Address1 DATA 30H
Address2 XDATA 1000H
ORG 0000H
LJMP STAR
ORG 0100H
STAR: MOV SP,#60H
MOV R0,#Address1
MOV DPTR,#Address2
MOV R7,#10H
STAR1: MOV A,R0 ;传送
MOVX DPTR,A
INC R0
INC DPTR
DJNZ R7,STAR1
MOV R0,#Address1
MOV DPTR,#Address2
MOV R7,#10H
STAR2: MOV B,R0 ;比较
MOVX A,DPTR
CJNE A,B,STAR3
INC R0
INC DPTR
DJNZ R7,STAR2
SJMP $ ;传送正确 STAR3: SJMP $ ;传送错误
END
实验二
双字节 D BCD 码( ( 十进制数) ) 加法
一、实验目得
熟悉51 汇编指令,学会使用星研集成环境软件,能自己编写简单得程序,熟悉BCD 码,了解如何调用系统提供得子程序. 二、实验内容
从键盘上输入4位被加数、加数,实现双字节 BCD 码(四位数)得加法,结果显示在数码管上;熟悉使用断点、单步进入、单步、运行到光标处、修改 PC 指针、全速运行等各种调试手段;熟悉查瞧特殊功能寄存器、内部数据RAM、外部数据空间得各种方法。
三、实验框图
开始初始化堆栈设定"先清LED,再接收键输入"标志通过键盘获得4位被加数(压缩BCD码)置位"接收到第一个键后才清除LED"标志通过键盘获得4位加数(压缩BCD码)被加数与加数的低位字节不带进位加法被加数与加数的高位字节带进位加法十进制调整十进制调整压缩BCD码(结果)转换为非压缩BCD码高位0消隐显示结果双字节BCD加法程序框图
四、实验步骤
、1 :明说线连ﻩD3 区 :CLK -- B2区:2M D3 区 :CS -- A3 区:CS5 D3区 :A0 -— A3区:A0 2、在 F4 区得键盘上输入 4 位被加数、加数 3、结果显示在 F4 区得数码管上 五、程序清单
EXTRN CODE(Display8, GetBCDKey)
Buffer DATA 30H ;8 字节显示缓冲区 F1 BIT 0D1H ;PSW、1
ORG 0000H
LJMP START
ORG 0100H
START: MOV SP,#60H
CLR F1 ;先清除显示,再接收键输入 START1: MOV R0,#buffer
MOV A,#4 ;按键次数
LCALL GetBCDKey ;得到双字节十进制数(被加数)
SETB F1 ;接收到第一个键,才清除显示
MOV R0,#buffer+4
MOV A,#4 ;按键次数
LCALL GetBCDKey ;得到双字节十进制数(加数)
MOV A,buffer+1
ADD A,buffer+5
DA A
MOV buffer+5,A
MOV A,buffer
ADDC A,buffer+4
DA A
MOV buffer+4,A
CLR A
RLC A
Display: PUSH ACC ;显示结果
MOV R0,#buffer
MOV A,buffer+5 ;低位
ACALL B1toB2 ;压缩 BCD 码转换成非压缩 BCD 码
MOV A,buffer+4 ;高位
ACALL B1toB2
POP ACC ;进位
ACALL B1toB2
MOV R0,#10H ;最高二位消隐
INC R0
MOV R0,#10H
MOV R0,#buffer+5
MOV R7,#5
ACALL BlackDisplay ;将高位 0 消隐
MOV R0,#buffer
LCALL Display8
SJMP START1
;将一个字节压缩 BCD 码转换成二个字节非压缩 BCD 码 B1toB2: PUSH ACC
ANL A,#0FH
MOV R0,A
INC R0
POP ACC
ANL A,#0F0H
SWAP A
MOV R0,A
INC R0
RET
Bla ckDisplay: MOV A,R0 ;将高位0消隐
JNZ Exit
MOV A,#10H
MOV R0,A
DEC R0
DJNZ R7,BlackDisplay
Exit: RET
END
实验三
双字节 D BCD 码(十进制数)减法
一、实验目得
熟悉51 汇编指令,学会使用星研集成环境软件,掌握汇编语言得设计与调试方法.能瞧懂程序流程框图,能自己设计程序,熟悉 BCD 码、补码,了解如何调用系统提供得子程序。
二、实验内容
从键盘上输入4位被减数、减数,实现双字节 BCD 码(四位数)得减法,结果显示在数码管上;进一步熟悉使用断点、单步进入、单步、运行到光标处、修改 PC指针、全速运行等各种调试手段;熟悉查瞧特殊功能寄存器、内部数据 RAM、外部数据空间得各种方法。
三、程序框图
设定"先清LED,再接收键输入"标志堆栈初始化开始通过键盘获得双字节十进制被减数(压缩BCD码)置位"接收到第一个键后才清除LED"标志通过键盘获得双字节十进制减数(压缩BCD码)减数进行十进制取补双字节十进制加法操作C=1?C=0,有进位(结果为负),再执行一次求补运算,调整为正数高位0消隐,若结果为负,前面加上"-"显示结果YN双字节十进制减法程序框图
四、实验步骤
、1 :明说线连ﻩD3 区 :CLK —— B2区:2M
D3 区 :CS —— A3 区:CS5 D3 区 :A0 —— A3 区:A0 2、在 F4 区得键盘上输入 4 位被减数、减数 3、结果显示在 F4区得数码管上 五、程序清单
EXTRN CODE(Display8, GetBCDKey)
Buffer DATA 30H ;8 字节显示缓冲区 F1 BIT 0D1H ;PSW、1
ORG 0000H
LJMP START
ORG 0100H
START:
MOV SP,#60H
CLR F1 ;先清除显示,再接收键输入 START1: MOV R0,#buffer
MOV A,#4 ;按键次数
LCALL GetBCDKey ;得到双字节十进制数(被减数)
SETB F1 ;接收到第一个键,才清除显示
MOV R0,#buffer+4
MOV A,#4 ;按键次数
LCALL GetBCDKey ;得到双字节十进制数(减数)
MOV A,#9AH
CLR C
SUBB A,buffer+5
MOV buffer+5,A
MOV A,#99H
CLR C
SUBB A,buffer+4
MOV buffer+4,A ;减数取补
MOV A,buffer+1
ADD A,buffer+5
DA A
MOV buffer+5,A
MOV A,buffer
ADDC A,buffer+4
DA A
MOV buffer+4,A
MOV F0,C ;借位标志
JC Display
MOV A,#9AH
SUBB A,buffer+5
MOV buffer+5,A
MOV A,#99H
SUBB A,buffer+4
XCH A,buffer+5
ADD A,#00H
DA A
XCH A,buffer+5
ADDC A,#00H
DA A
MOV buffer+4,A
Display:
MOV R0,#buffer ;显示结果
MOV A,buffer+5 ;低位
ACALL B1toB2 ;压缩BCD 码转换成非压缩 BCD 码
MOV A,buffer+4 ;高位
ACALL B1toB2
MOV R0,#10H ;最高四位消隐
INC R0
MOV R0,#10H
INC R0
MOV R0,#10H
INC R0
MOV R0,#10H
MOV R0,#buffer+3
MOV R7,#3
ACALL BlackDisplay ;将高位 0 消隐
MOV R0,#buffer
LCALL Display8
SJMP START1
BlackDi splay:
MOV A,R0 ;将高位 0 消隐
JNZ Exit
MOV A,#10H
MOV R0,A
DEC R0
DJNZ R7, B l a c kDisplay
Exit: JB F0,Exit1
INC R0
MOV R0,#11H ;负数标志 Exit1: RET
B1toB2: PUSH ACC
ANL A,#0FH
MOV R0,A
INC R0
POP ACC
ANL A,#0F0H
SWAP A
MOV R0,A
INC R0
RET
BlackDispl ay:
MOV A,R0
JNZ Exit
MOV A,#10H
MOV R0,A
DEC R0
DJNZ R7,BlackDisplay
Exit:
RET
END
四 实验四 数制进十转数制进六十节字四ﻩ 四字节十六进制数转十进制数
一、实验目得
进一步熟悉51 汇编指令,了解十六进制数转十进制数得方法. 二、实验内容
从键盘上输入 8 位十六进制数,实现四字节十六进制数转8位十进制数,并在数码管上显示。注意输入数据必须在00000000H~05F00000H 范围,否则,结果超出8位十进制数,无法正确显示。
三、程序框图
初始化堆栈开始设定"先清LED,再接收键输入"标志通过键盘获得4字节十六进制数置位"接收到第一个键后,才清除LED"标志十六进制转十进制子程序显示开始0→R4,R5,R6,R7(用于存放压缩BCD码)32→B(循环次数)CLR
C四字节十六进制数带进位左移一位(R4R5R6R7)×2+进位位C→(R4R5R6R7),同时进行十进制调整主程序 十六进制转十进制子程序NY返回B-1=0? 四、实验步骤
、1
:明说线连ﻩD3区 :CLK -- B2 区:2M D3 区 :CS -— A3区:CS5 D3区 :A0 —- A3区:A0 2、在 F4区得键盘上输入 8 位十六进制数 3、结果显示在 F4 区得数码管上 五、程序清单
ﻩEXTRN CODE(Display8, GetKey) Buffer DATA 30H ;8 字节显示缓冲区 F1 BIT 0D1H ;PSW、1
ORG 0000H
LJMP START
ORG 0100H
START: MOV SP,#60H
CLR F1 ;先清除显示,再接收键输入 START1: MOV R0,#buffer
MOV A,#8 ;按键次数
LCALL GetKey ;得到4字节十六进制数
SETB F1 ;接收到第一个键后,才清除显示
MOV R0,buffer
MOV R1,buffer+1
MOV R2,buffer+2
MOV R3,buffer+3
ACALL B4toD4 ;转换成十进制数 Display: MOV R0,#buffer ;显示结果
MOV A,R7 ;低位
ACALL B1toB2 ;压缩BCD 码转换成非压缩BCD 码
MOV A,R6
ACALL B1toB2
MOV A, R5
ACALL B1toB2
MOV A,R4 ;高位
A C A LL B1toB2
MOV R0,#buffer+7
MOV R7,#7
ACALL BlackDisplay ;将高位0消隐
MOV R0,#buffer
LCALL Display8
SJMP START1
;四字节十六进制数转十进制数:R0R1R2R3为十六进制,R4R5R6R7为压缩 BCD码 B4toD4:
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,A
MOV B,#32
LOOP:
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R7
ADDC A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ B,LOOP
RET
B1toB2: PUSH ACC
ANL A,#0FH
MOV R0,A
INC R0
POP ACC
ANL A,#0F0H
SWAP A
MOV R0,A
INC R0
RET
BlackDisplay: MOV A,R0 ;将高位 0 消隐
JNZ Exit
MOV A,#10H
MOV R0,A
DEC R0
DJNZ R7, B lac kDisplay
Exit: RET
END
五 实验五 节字双ﻩ 双字节 D BCD 码( ( 十 进制数) ) 乘法
一、实验目得
进一步熟悉51 汇编指令,掌握汇编语言得设计与调试方法.根据程序流程图,自己设计程序,了解如何调用系统提供得子程序。
二、实验内容
从键盘上输入 4 位被乘数、乘数,实现四位十进制数得乘法,结果显示在数码管上。
三、程序框图
开始初始化堆栈设定"先清LED再接收键输入"标志通过键盘获得4位十进制被乘数转换成二进制数并压栈暂存置位"接收到第一个键后,才清除LED"标志通过键盘获得4位十进制乘数转换成二进制数(R2R3)被乘数出栈(R0R1)双字节十六进制乘法子程序十六进制结果转十进制压缩BCD码转非压缩BCD码将高位0消隐显示双字节BCD乘法程序框图
(R0)(R1) × (R2)(R3)(R3R1H)(R3R1L)(R3R0H)(R3R0L)(R2R1H)(R2R1L)(R2R0H)(R2R0L)R0
R1
R2
R3+双字节十六进制乘法示意图
四、实验步骤
、1
:明说线连ﻩD3 区 :CLK -— B2区:2M D3 区 :CS -— A3区:CS5 D3区 :A0 —— A3 区:A0 2、在F4 区得键盘上输入 4 位被乘数、乘数 3、结果显示在 F4 区得数码管上 五、程序清单
EXTRN CODE(Display8, GetBCDKey)
Buffer DATA 30H ;8字节显示缓冲区 F1 BIT 0D1H ;PSW、1
ORG 0000H
LJMP START
ORG 0100H
START: MOV SP,#60H
CLR F1 ;先清除显示,再接收键输入 START1: MOV R0,#buffer
MOV A,#4 ;按键次数
LCALL GetBCDKey ;得到双字节十进制数(被乘数)
MOV R0,#buffer
ACALL D4toB2 ;转换成二进制数
PUSH 02H
PUSH 03H
SETB F1 ;接收到第一个键,才清除显示
MOV R0,#buffer
MOV A,#4 ;按键次数
LCALL GetBCDKey ;得到双字节十进制数(乘数)
MOV R0,#buffer
ACALL D4toB2 ;转换成二进制数
POP 01H
POP 00H
ACALL WordMul ;(R0R1)*(R2R3)=R0R1R2R3
ACALL B4toD4 ;转换成十进制数 Display: MOV R0,#buffer ;显示结果
MOV A,R7 ;低位
ACALL B1toB2 ;压缩 BCD 码转换成非压缩 BCD 码
MOV A,R6
ACALL B1toB2
MOV A, R5
ACALL B1toB2
MOV A,R4 ;高位
ACALL B1toB2
MOV R0,#buffer+7
MOV R7,#7
ACALL BlackDisplay ;将高位 0 消隐
MOV R0,#buffer
LCALL Display8
SJMP START1
;双字节十六进制数乘以双字节十六进制数子程序 WordMul:
MOV A,R3 ; (
)1R()0Rﻩ MOV B,R1 ;
×
(R2)(R3)
MUL AB ;—- - ---—-———-—— -——————---———
XCH A,R3 ;
(R3R1H)(R3R1L)
MOV R7,B ;
(R3R0H)(R3R0L)
MOV B,R0 ;
(R2R1H)(R2R1L)
MUL AB ;(R2R0H)(R2R0L)
ADD A,R7 ; — - - --——-— -————-—-—------————--——
MOV R7,A ;
R0
R1
R2
R3
CLR A
ADDC A,B
XCH A,R1
MOV B,R2
MUL AB
ADD A,R7
XCH A,R2
PUSH ACC
MOV A,B
ADDC A,R1
MOV R1,A
CLR A
RLC A
XCH A,R0
POP B
MUL AB
ADD A,R1
MOV R1,A
MOV A,R0
ADDC A,B
MOV R0,A
RET
;双字节十进制数转二进制数 ,R0-—指向双字节十进制数,结果在 R2R3 中 D4toB2: MOV A,R0
ANL A,#0FH
XCH A,R0
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
ADD A,R0
INC R0
MOV B,#10
MUL AB
MOV R2,B
MOV R3,A
MOV A,R0
ANL A,#0FH
XCH A,R0
ANL A,#0F0H
SWAP A
ADD A,R3
XCH A,R2
ADDC A,#0
MOV B,#10
MUL AB
XCH A,R2
MOV B,#10
MUL AB
ADD A,R0
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
B1toB2:
PUSH ACC
ANL A,#0FH
MOV R0,A
INC R0
POP ACC
ANL A,#0F0H
SWAP A
MOV R0,A
INC R0
RET
BlackDisplay: MOV A,R0 ;将高位 0 消隐
JNZ Exit
MOV A,#10H
MOV R0,A
DEC R0
DJNZ R7,BlackDisplay
B4toD4:
ﻩ CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,A
MOV B,#32
Exit: RET END 实验六
双字节BC C D码除于单字节 D BCD 码
一、实验目得
进一步熟悉 51 汇编指令,掌握汇编语言得设计与调试方法.自己设计程序,了解如何调用系统提供得子程序。
二、实验内容
从键盘上输入 4 位被除数、二位除数,实现双字节 BCD码除于单字节BCD 码,结果显示在数码管上。
三、程序框图
开始初始化堆栈设定"先清LED,再接收键输入"标志通过键盘获得4位被除数,转换为十六进制数并暂存通过键盘获得单字节除数,转换为16进制数显示子程序置位"接收到第一个键后,才清除LED"标志单字节除法:被除数的高字节除以除数,结果为最终商的高8位双字节除以单字节(商为16位)双字节除以单字节(商只有8位)子程序最终获得结果(16位的商,8位余数)双字节除以单字节(商为16位)子程序循环次数8→R716位被除数(R2,R3)带进位左移一位(最低位补0, C →F0)R2-除数(B)F0=1?C=1?差→R2,R3自加1R7-1=0?双字节除以单字节(商为8位)子程序开始 开始返回返回主程序YYYNNN双字节BCD除法程序框图 四、实验步骤
1、连线说明:
D3 区 :CLK —— B2 区:2M D3 区 :CS -- A3区:CS5 D3 区 :A0 —— A3 区:A0 2、在 F4 区得键盘上输入 4 位被乘数、乘数 3、使用各种手段调试程序 4、结果显示在 F4 区得数码管上 单 五、程序清单 ﻩﻩ
ﻩEXTRN ﻩ CODE(Display8, GetBCDKey) Buffer DATA 30H ;8 字节显示缓冲区 F1 BIT 0D1H ;PSW、1
ORG 0000H
LJMP START
ORG 0100H
START: MOV ﻩ SP,#60H
CLR F1 ;先清除显示,再接收键输入 START1: MOV R0,#buffer
MOV A,#4 ;按键次数
LCALL GetBCDKey ;得到双字节十进制数(被除数)
SETB F1 ;接收到第一个键,才清除显示
MOV R0,#buffer
ACALL D4toB2 ;转换成二进制数
MOV R0,#buffer
MOV A,#2
LCALL GetBCDKey ;得到 1 字节十进制数(除数)
MOV R0,#buffer
ACALL D2toB2 ;转换成二进制数
JNZ START2
ACALL DisplayError ;除数为0,出错
SJMP START
START2:
ACALL B2_DIV_B1 ;被除数 / 除数
ACALL Display ;显示商与被除数
SJMP START1
; 双字节除于单字节,R2R3为 16位二进制数,B 为除数,商在 R2R3中, 余数在 A 中 B2_DIV_B1:
PUSH B
MOV A,R2
DIV AB
MOV R2,B
POP B
PUSH ACC
CALL DIV_B2_B1
POP ACC
XCH A,R2
RET
;双字节除于单字节,R2R3 为被除数,B为除数,结果:商 R3 中,余数在 R2中 DIV_B2_B1: MOV R7,#8 ;双字节除于单字节 DIV2: CLR C ;R2R3 为被除数,B 为除数,
MOV A,R3 ;结果:商R3 中,余数在 R2 中
RLC ﻩ A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV F0,C
CLR C
SUBB A,B
JB F0,DIV3
JC DIV4
DIV3: MOV R2,A
INC ﻩ R3
DIV4: DJNZ R7,DIV2
RET
;4 字节二进制数转十进制数,R2R3 为 16位二进制数,R4R5R6为压缩BCD 码 B2toD5:
CLR
A
MOV R4,A ;
MOV R5,A
MOV R6,A
MOV R7,#16
LOOP:
CLR ﻩ C
MOV A,R3
RLC ﻩ A
MOV R3,A
MOV A,R2
RLC ﻩ A
MOV R2,A
MOV A,R6
ADDC A,R6
DA ﻩ A
MOV R6,A
MOV A,R5
ADDC A,R5
DA ﻩ A
MOV R5,A
MOV A,R4
ADDC
A,R4
DA ﻩ A
MOV R4,A
DJNZ R7,LOOP
RET
D2toB2: MOV A,R0 ;1 字节十进制数转二进制数
ANL A,#0FH ;R0——指向 1 字节十进制数,结果在B中
XCH A,R0
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
ADD A,R0 ;转换成二进制数
MOV B,A
RET
Display:
PUSH ACC ;商在低四位,余数在高三位
ACALL B2toD5 ;二进制数转十进制数
MOV R0,#buffer
MOV A,R6
ACALL B1toB2 ;压缩BCD码转换成非压缩 BCD 码
MOV A,R5
ACALL B1toB2
DEC R0
MOV R7,#3
ACALL BlackDisplay ;将高位0消隐
MOV buffer+4,#10H ;消隐
MOV R0,#buffer+7
POP ﻩ ACC
MOV
B,#100
DIV ﻩ AB
MOV R0,A
DEC R0
MOV A,B
MOV B,#10
DIV ﻩ AB
MOV R0,A
DEC R0
MOV R0,B
MOV R0,#buffer+7
MOV R7,#2
ACALL BlackDisplay ;将高位 0 消隐
MOV R0,#buffer
LCALL Display8
RET
Displa y E rror:
MOV
R0,#buffer
MOV R7,#8
MOV A,#0FH
DisplayError1:
MOV ﻩ R0,A
INC ﻩ R0
DJNZ R7,DisplayError1
MOV R0,#buffer
LCALL Display8
RET
D4toB2:
MOV A,R0
ANL A,#0FH
XCH A,R0
ANL A,#0F0H
SWAP A
MOV B,#10
MUL AB
ADD A,R0
INC R0
MOV B,#10
MUL AB
MOV R2,B
MOV R3,A
MOV A,R0
ANL A,#0FH
XCH A,R0
ANL A,#0F0H
SWAP A
ADD A,R3
XCH A,R2
ADDC A,#0
MOV B,#10
MUL AB
XCH A,R2
MOV B,#10
MUL AB
ADD A,R0
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
B1toB2:
PUSH ACC
ANL A,#0FH
MOV R0,A
INC R0
POP ACC
ANL A,#0F0H
SWAP A
MOV R0,A
INC R0
RET
Blac k D i splay:
MOV A,R0 ;将高位0消隐
JNZ Exit
MOV A,#10H
MOV R0,A
DEC R0
DJNZ R 7 , Bl a ckD isplay
END
实验八
冒泡排序
一、实验目得
熟悉使用 MCS51 指令,掌握汇编语言得设计与调试方法,了解如何使用高效方法对数据排序. 二、实验内容
。列排新重大到小从据数组一将法泡冒用使求要,序程序排个一试调并写编ﻩ
三、程 序框图
开始初始化堆栈将待排序数组转移到内部30H开始的RAM中数据数-1→R7,数据交换标志bSort=0
PUSH
07H被比较数地址R0=30H比较数地址R1=R0+1DEC
R7@R0>@R1?@R0与@R1互换1→bSortINC R0INC R1POP R7R7=R7-1 R7=0?bSort=0?结束NNNYYY冒泡排序程序框图 四、实验步骤
。列排序顺得大到小从按否是就据数中 HF3~H03 MAR部内查检,序程试调式方点断用使ﻩ单 五、程序清单 ﻩ ﻩbSort BIT F0
ORG 0000H
LJMP STAR
ORG 0100H
STAR: MOV SP,#60H ;堆栈
MOV R0,#30H ;存放待排序数据得首地址
MOV R7,#16 ;数据个数
MOV DPTR,#TAB_1
STAR1:
CLR A
MOVC A,A+DPTR
MOV R0,A ;将数据移入内部 RAM中
INC R0
INC DPTR
DJNZ R7,STAR1
MOV R7,#16-1 ;存放比较次数 STAR2: PUSH 07H
MOV R0,#30H ;存放启始地址
CLR bSort
MOV R1,00H
INC R1
MOV A,R0
STAR3:
MOV B,A
MOV A,R1
CJNE A,B,$+3
JNC
STAR5
XCH A,R0
MOV R1,A
SETB bSort
STAR5: INC R0
INC R1
DJNZ R7,STAR3
POP 07H
JNB bSort,Exit
DEC R7
SJMP STAR2
Exit:
SJMP $
TAB_1:
DB 0H,5H,6H,3H,8H,92H,04H,57H,46H,01H,0FFH,0A0H,45H,99H,55H,66H
END