📄 ds18b20.asm
字号:
DAT EQU P1.0
ORG 00H
JMP GETWD
;--------------------------------------------------------------
INIT: CLR EA
INI10: SETB DAT
MOV R2,#200
INI11: CLR DAT
DJNZ R2,INI11 ;主机发复位脉冲持续3×200US
SETB DAT ;主机释放总路线,口线改为输入
MOV R2,#30
INI12: DJNZ R2,INI12 ;等待2×30US
CLR C
ORL C,DAT ;数据线变低
JC INI10 ;未准备好,重新初始化
MOV R6,#80
INI13: ORL C,DAT
JC INI14 ;数据线变高,初始化成功
DJNZ R6,INI13 ;数据线变低,可持续3×80US
SJMP INI10 ;初始化失败,重来
INI14: MOV R2,#240
INI15: DJNZ R2,INI15 ;应答时间最少2×240US
RET
;--------------------------------------------------------------
WRITE: CLR EA
MOV R3,#8 ;循环8次,写一个字节
WR11: SETB DAT
MOV R4,#8
RRC A ;写入位从A中移到CY
CLR DAT
WR12: DJNZ R4,WR12 ;等待16US
MOV DAT,C ;命令字按位依次送给DS18B20
MOV R4,#20
WR13: DJNZ R4,WR13 ;保证写过程持续60US
DJNZ R3,WR11 ;示送完一个字节继续
SETB DAT
RET
;--------------------------------------------------------------
READ: CLR EA
MOV R6,#8 ;循环8次,读一个字节
RD11: CLR DAT
MOV R4,#4
NOP ;低电平持续2US
SETB DAT ;口线设过输入
RD12: DJNZ R4,RD12 ;等待8US
MOV C,DAT ;主机按位依次读入DS18B20的数据
RRC A ;读取的数据移入A
MOV R5,#30
RD13: DJNZ R5,RD13 ;保证读过程持续60US
DJNZ R6,RD11 ;读完一个字节的数据,存入A中
SETB DAT
RET
;-------------------------------------------------------------
GETWD: LCALL INIT
MOV A,#0CCH
LCALL WRITE ;发跳过ROM命令
MOV A,#44H
LCALL WRITE ;发启动转换命令
LCALL INIT
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH ;发读存储器命令
LCALL WRITE
LCALL READ
MOV 50h,A ;温度低位字节送入WDLSB
LCALL READ
MOV 51h,A ;温度高位字节送入WDMSB
JMP GETWD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -