- 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号
SN 单片机的实用双字节排序程序
关于数据排序,近日使用 SN8P2706A 做一个项目,里头就使用了数据排序.
简单介绍:
这个项目使用了 FP40,FP41,FP42 分别测量温度,湿度,空气清新度三项内容,如图:
;================================================
.DATA
RR0 DS 1
RR1 DS 1
EEH DS 1
EEL DS 1
TTH DS 1
TTL DS 1
SYSFL DS 1
FXCH EQU SYSFL .0 ;排序交换标志
;// 首先,定义了FP40,FP41,FP42 分别测量后数据的存放位置:
ORG 0100H ;在 RAM 库 1
AD40S EQU 00H ;温度
AD41S EQU 10H ;湿度
AD42S EQU 20H ;空气
;-------------------------------------------------------------------------
; 每一路数据测量 6 次后(每次是双字节),分别进行排序:
B_ADCDATA: ;子程序标号,由主程序 CALL .
MOV_ Z,#AD40S ;排序12字节/2=6组数据
CALL Z_PXU ;排序温度数据
MOV_ Z,#AD41S
CALL Z_PXU ;排序湿度数据
MOV_ Z,#AD42S
CALL Z_PXU ;排序空气数据
;至此,3 路各 6 组双字节排序完成! ;取排序后的中间 4 组累加起来
Z2M0 EEH,EEL
ZMN Y,#1
MOV_ Z,#AD40S+3 ;温度
CALL Z_2MADD ;双字节加法子程序,这里不再贴出了!
MOV_ Z,#AD40S+5
CALL Z_2MADD
MOV_ Z,#AD40S+7
CALL Z_2MADD
MOV_ Z,#AD40S+9
CALL Z_2MADD
MOV_ Z,#ADSS+1
CALL Z_MYZX2 ;累加结果放置到其它位置,这里也无需贴出的.
;下面湿度,空气的同样处理,不再重复......................
CLR Y
RET
;================================================
Z_PXU:;双字节排序
ZMN RR1,#5;//需要排列6-1=5次
Z_XCH:
MOV_ RR0,RR1 ;每轮减少一次比较
ZMN Y,#1
MOV_ EEH,@YZ ;@Ri必须先赋值
INCMS Z
MOV_ EEL,@YZ
INCMS Z
ZM0 Y
ZB0 FXCH
CALL Z_XCH0
BS1 FXCH
JMP Z_XCHRET
DECMS RR1
JMP Z_XCH
Z_XCHRET:
RET
;====================================================================
Z_XCH0:;把双字节二组数据移入EEH_EEL,DPTR+2
ZMN Y,#1
MOV_ TTH,@YZ
INCMS Z
MOV_ TTL,@YZ
INCMS Z
ZM0 Y
SBC2A EEH,EEL,TTH,TTL;相减
BS0 FC
JMP Z_XCH1
;交换
ZB1 FXCH ;=1,有交换
SUB_ Z,#4
ZMN Y,#1
MOV_ @YZ,TTH
INCMS Z
MOV_ @YZ,TTL
INCMS Z
MOV_ @YZ,EEH
INCMS Z
MOV_ @YZ,EEL
INCMS Z
ZM0 Y
JMP Z_XCH2
Z_XCH1:
CALL Z_2MXCH
Z_XCH2:
DECMS RR0
JMP Z_XCH0
RET
Z_2MXCH:
H_XCH EEH,TTH
H_XCH EEL,TTL
RET
;=======================================================
本排序程序段落直接从实际工程项目拷贝出来.供朋友们参考使用.(直接拷贝过去就可以使用.注意:数据存放位置 RAM 库和地址需要根据自己使用芯片的资源修改一下.)
仅供参考!