附录
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;调用数码管显示子程序 AJMP MAIN; 这是DS18B20复位初始化子程序
INIT_1820:SETB P1.0
NOP
CLR P1.0;主机发出延时537微秒的复位低脉冲 MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$ DJNZ R1,TSR1
SETB P1.0;然后拉高数据线 NOP NOP NOP
MOV R0,#25H
TSR2:JNB P1.0,TSR3;等待DS18B20回应
DJNZ R0,TSR2 LJMP TSR4 ; 延时
TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在
27
附录
LJMP TSR7 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不存在则返回
TSS2:MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话
750微秒 LCALL DISPLAY
LCALL INIT_1820;准备读温度前先复位 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到35H/36H RET;写DS18B20的子程序(有具体的时序要求) WRITE_1820:MOV R2,#8;一共8位数据
CLR C
WR1:CLR P1.0
MOV R3,#6 DJNZ R3,$ RRC A MOV P1.0,C
28
附录
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 RE10: DJNZ R3,RE10
MOV C,P1.0 MOV R3,#23
RE20: DJNZ R3,RE20
RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET
29
附录
DISPLAY:CLR C
SUBB A, #30 JNB CY, T1 MOV A, B CLR C SUBB A,#25 JNB CY, XIANSHI CLR P1.1 LJMP XIANSHI
T1:CLR P1.2 XIANSHI:MOV A,B
MOV B,#10 ;10进制/10=10进制 DIV AB
MOV B_BIT,A ;十位在A MOV A_BIT,B ;个位在B MOV R0,#4 CLR C;多加的
DPL1: MOV R1,#250 ;显示1000次 DPLOP:MOV DPTR,#NUMTAB1
MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码 MOV P0,A ;送出个位的7段代码 CLR P2.1 ;开个位显示 ACALL D1MS ;显示1MS SETB P2.1 MOV DPTR,#NUMTAB MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码 MOV P0,A ;送出十位的7段代码
30
附录
CLR P2.2 ;开十位显示 ACALL D1MS ;显示1MS SETB P2.2 JC XSW;多加的 MOV A,31H MOV B,#160 DIV AB MOV XS,B
XSW:MOV A,XS
MOVC A,@A+DPTR MOV P0,A CLR P2.0 ACALL D1MS SETB P2.0 SETB C;多加的
DJNZ R1,DPLOP ;250次没完循环 DJNZ R0,DPL1 ;4个250次没完循环 RET;1MS延时(按12MHZ算) D1MS: MOV R7,#80
DJNZ R7,$ RET
NUMTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,7FH,7FH,7FH,7FH,7FH
NUMTAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH END
31
7FH,