附录1:系统程序
RLC A SWAP A MOV 31H,A MOV A,B
MOV C,40H;将28H中的最低位移入C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A MOV 29H,A
LCALL DISPLAY;调用数码管显示子程序 RET
;****************************************************************** INIT_1820:
SETB P1.0 NOP
CLR P1.0;主机发出延时537微秒的复位低脉冲 MOV R1,#3 DJNZ R0,$ DJNZ R1,TSR1
SETB P1.0;然后拉高数据线 NOP NOP NOP
MOV R0,#25H DJNZ R0,TSR2 LJMP TSR4 ; 延时
TSR1: MOV R0,#107
TSR2: JNB P1.0,TSR3;等待DS18B20回应
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
30
附录1:系统程序
LJMP TSR5 LJMP TSR7
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在 TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间 TSR7: SETB P1.0
RET; 读出转换后的温度值
;*************************************************** GET_TEMPER:
SETB P1.0
LCALL INIT_1820;先复位DS18B20 JB FLAG1,TSS2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回 LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待ADLCALL DISPLAY
LCALL INIT_1820;准备读温度前先复位 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到35H/36H RET;写DS18B20的子程序(有具体的时序要求)
TSS2: MOV A,#0CCH ; 跳过ROM匹配
转换结束,12位的话750微秒
;*********************************************************** WRITE_1820:
MOV R2,#8;一共8位数据 CLR C MOV R3,#6 DJNZ R3,$ RRC A
31
WR1: CLR P1.0
附录1:系统程序
MOV P1.0,C MOV R3,#23 DJNZ R3,$ SETB P1.0 NOP
DJNZ R2,WR1
RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;**************************************************************** READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00: MOV R2,#8;数据一共有8位 RE01: CLR C
SETB P1.0 NOP NOP CLR P1.0 NOP NOP NOP SETB P1.0 MOV R3,#9 MOV C,P1.0 MOV R3,#23 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET
RE10: DJNZ R3,RE10
RE20: DJNZ R3,RE20
32
附录1:系统程序
INIT_18201:
SETB P1.1 NOP
CLR P1.1;主机发出延时537微秒的复位低脉冲 MOV R1,#3 DJNZ R0,$ DJNZ R1,TSR11
SETB P1.1;然后拉高数据线 NOP NOP NOP
MOV R0,#25H DJNZ R0,TSR21 LJMP TSR41 ; 延时 LJMP TSR51 LJMP TSR71
TSR11: MOV R0,#107
TSR21: JNB P1.1,TSR31;等待DS18B20回应
TSR31: SETB FLAG2 ; 置标志位,表示DS1820存在 TSR41: CLR FLAG2 ; 清标志位,表示DS1820不存在 TSR51: MOV R0,#117
TSR61: DJNZ R0,TSR61 ; 时序要求延时一段时间 TSR71: SETB P1.1
RET; 读出转换后的温度值
;*************************************************** GET_TEMPER1:
SETB P1.1
LCALL INIT_18201;先复位DS18B20 JB FLAG2,TSS21
RET ; 判断DS1820是否存在?若DS18B20不存在则返回 LCALL WRITE_18201
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_18201;这里通过调用显示子程序实现延时一段时间,等待AD
33
TSS21: MOV A,#0CCH ; 跳过ROM匹配
附录1:系统程序
转换结束,12位的话750微秒
LCALL DISPLAY
LCALL INIT_18201;准备读温度前先复位 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_18201
MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_18201
LCALL READ_182001; 将读出的温度数据保存到35H/36H RET;写DS18B20的子程序(有具体的时序要求)
;*********************************************************** WRITE_18201:
MOV R2,#8;一共8位数据 CLR C MOV R3,#6 DJNZ R3,$ RRC A MOV P1.1,C MOV R3,#23 DJNZ R3,$ SETB P1.1 NOP
DJNZ R2,WR11
RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
WR11: CLR P1.1
;**************************************************************** READ_182001:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE001: MOV R2,#8;数据一共有8位 RE011: CLR C
SETB P1.1 NOP NOP CLR P1.1
34