"怎样编写程序将30H,31H,32H单元中的3个数字按从小到大的顺序排列,结果仍存放在这3个单元。”

这是一道单片机原理及接口技术的试验题。

可以考虑用DS18B20采用的单线的数据接口.
不过,我还没有用过,所以具体情况我也不太清楚...
我这儿有个程序或许可以参考一下...
电路图如下:

http://hi.baidu.com/37772166/album/item/5cc5a912977a8ac4c2fd7801.html
http://hi.baidu.com/37772166/album/item/5cc5a912977a8ac4c2fd7801.html
ORG 0000H ;DS18B20.ASM 0-125度的温度计 原创:陈永飞 QQ:49204743 地址:江苏省南京市
TEMPER_L EQU 41H ;用于保存读出温度的低8位 信箱:[email protected]
TEMPER_H EQU 40H ;用于保存读出温度的高8位
FLAG1 EQU 38H ;是否检测到DS18B20标志位
A_BIT1 EQU 31H ;数码管个位数存放内存位置
B_BIT1 EQU 32H ;数码管十位数存放内存位置
D_BIT1 EQU 35H ;数码管百位数存放内存位置
DQ EQU P3.2 ;30H,31H,32H,33H: X 个位 十位 X
MOD7: MOV SP,#60H
LCALL GET_TEMPER ;调用读温度子程序
LCALL TEMPCOV
LCALL JDQGZ
LCALL DISPLAY ;调用数码管显示子程序
AJMP MOD7
TEMP0: INC A
AJMP TEMP1
TEMPCOV: MOV A,TEMPER_L ;数据处理子程序TEMPCOV
MOV B,#16
DIV AB
JB B.3,TEMP0
TEMP1: MOV 34H,A ;将TEMPER_L的高四位右移四位,存入34H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 30H,A ;将小数后一位数.存入30H中
MOV A,TEMPER_H ;TEMPER_H中存放高8位数,权重16
MOV B,#16
MUL AB
ADD A,34H ;34H中存入温度值的整数部分
MOV B,#10
DIV AB
MOV 31H,B ;个位存入31H中
MOV B,#10 ;
DIV AB ;
MOV 32H,B ;十位存入32H中
MOV B,#10 ;
DIV AB ;
MOV 35H,B ;百位存入33H中
MOV A,TEMPER_H
MOV 33H,#10H ;
JB ACC.7,EXIT7
MOV 33H,#00H
EXIT7: RET
INIT_1820: ;这是DS18B20复位初始化子程序
SETB DQ
NOP
CLR DQ ;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DQ ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ;延时
TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
TSR7: SETB DQ
RET
;-------------------------------------------------
GET_TEMPER: ;读出转换后的温度值
SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCAL

参考资料:bba127d3abb9d8b4

温馨提示:答案为网友推荐,仅供参考
相似回答