完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1k0Oo_BN8qDBL8oKiMFd7mg?pwd=8888
部分代码展示
RTE EQU 22H
RTG EQU 30H
RTO EQU 32H
RSH EQU 35H
TEMPL EQU 40H;存放温度值低位
TEMPH EQU 41H;存放温度值高位
TEMP EQU 50H
ORG 000H
LJMP MAIN
ORG 1000H
MAIN:MOV SP,#60H
SETB P1.0
LCALL RST;调用复位子程序
JNB RTO,MA;判断复位是否成功
MOV A,#0CCH;跳过RAM
LCALL WRS ;调用写子程序
MOV A,#44H;启动温度转换
LCALL WRS
LCALL RST
MOV A,#0CCH
LCALL WRS
MOV A,#0BEH;读内部RAM命令
LCALL WRS
NOP
LCALL RRS
NOP
LCALL WDZ;调用温度转换子程序
LCALL SMX;调用数码管显示程序
MA: LJMP MAIN
/*DS18B20初始复位程序*/
RST: SETB P1.0
NOP
NOP
CLR P1.0 ;下拉数据线
LCALL DELAY1;调用延时程序延时540微妙
NOP
SETB P1.0;释放数据线
MOV RTE,#03H;短暂延时等待
RTD: DJNZ RTE,RTD
JNB P1.0,RTH;判断是否收到复位成功信号
CLR RTO;复位失败RT0清零
NOP
ACALL RTA
RTH: SETB RTO ;复位成功RT0置一
NOP
MOV RTG ,#5BH;短暂延时
RTT: DJNZ RTG ,RTT
RTA: SETB P1.0;使P1.0置一
RET
/*DS18B20写时序子程序*/
WRS: CLR C ;
MOV R4,#8;字节数
NOP
W0: CLR P1.0
MOV R2,#05H
W1: DJNZ R2, W1
RRC A ;循环右移
MOV P1.0,C ;将结果送入
NOP
MOV R3,#28;延时
W2: DJNZ R3,W2
SETB P1.0
DJNZ R4,W0;判断送完没
SETB P1.0
RET
/*DS18B20读时序子程序*/
RRS: MOV R5, #2;字节行数
MOV R0,#40H
RL0 : MOV R6,#8;每行字节数
RL1: CLR C
SETB P1.0
NOP
NOP
NOP
CLR P1.0
MOV RSH ,#05H ;延时
RL2: DJNZ RSH,RL2
NOP
SETB P1.0
NOP
NOP
NOP
MOV C,P1.0 ;将P1.0位信息放到C
MOV R2, #30
RL3: DJNZ R2,RL3
NOP
NOP
RRC A
DJNZ R6,RL1;判断送完没
MOV @R0,A ;将数据放在TEMPL中
INC R0 ;TEMPH
DJNZ R5, RL0;判断整个数据送完没
RET
/*温度转换子程序*/
WDZ:MOV A,TEMPH
ANL A,#80H;判断温度正负
JZ WD2;正温度跳转WD2
SETB P1.1;负温度则使P1.1置1
CLR C ;负温度转换部分
MOV A,TEMPL
CPL A ;取反
ADD A,#01H;加1
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
WD1:MOV A,TEMPL
ANL A, #0F0H;屏蔽小数位
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH ;屏蔽符号位
SWAP A
ORL A,TEMPL
MOV TEMP,A ;将转换后温度置及8字节数据放在TEMP
RET
WD2:CLR P1.1 ;使P1.1清零作为正温度标志
LCALL WD1 ;转到温度处理部分
RET
/*数码管显示子程序*/