📄 ds18b20.asm
字号:
org 00h
ljmp start
org 30h
start:
mov sp,#60h
clr ea ;禁止中断
lcall init_1820 ;初始化
jnb f0,exit ;ds18b20不存在,退出
mov a,#0cch ;跳过rom
lcall write_byte
mov a,#4eh ;写暂存器地址2,3
lcall write_byte
mov a,#0ffh ;地址2值
lcall write_byte
mov a,#00h ;地址3值
lcall write_byte
lcall init_1820 ;初始化
mov a,#0cch ;跳过rom指令
lcall write_byte
mov a,#44h ;温度转换指令
lcall write_byte
; setb p1.0
; lcall delay_600ms ;不用独立电源时候需要上拉500ms以上
wait:
lcall read_byte
cjne a,#0ffh,wait ;等待温度转换完成
lcall init_1820 ;初始化
mov a,#0cch ;跳过rom
lcall write_byte
mov a,#0beh ;读暂存器 9个字节
lcall write_byte
lcall read_byte
mov 30h,a ;lsb
lcall read_byte
mov 31h,a ;msb
lcall read_byte
mov 32h,a ;th
lcall read_byte
mov 33h,a ;tl
lcall read_byte
mov 34h,a ;保留字节
lcall read_byte
mov 35h,a ;保留字节
lcall read_byte
mov 36h,a ;count remain
lcall read_byte
mov 37h,a ;count per C
lcall read_byte
mov 38h,a ;crc
exit:
ret
init_1820:
push acc
push b
setb p1.0
nop
clr p1.0 ;初始低电平 480us--960us
mov b,#250d
djnz b,$
setb p1.0 ;释放总线
mov b,#33d
djnz b,$
mov c,p1.0 ;读取1820返回存在脉冲
jc not_exist ;为1,则不存在1820
mov b,240d ;延迟480us
djnz b,$
setb f0 ;设置存在标志
pop b
pop acc
ret
not_exist:
clr f0 ;清楚存在标志
pop b
pop acc
ret
write_b:
push b
clr p1.0
nop
nop
nop
nop
nop
nop
mov p1.0,c
mov b,#33d
djnz b,$
setb p1.0
nop
nop
nop
pop b
ret
read_b:
push b
clr p1.0
nop
nop
nop
nop
nop
setb p1.0
nop
nop
mov c,p1.0
mov b,#33d
djnz b,$
setb p1.0
nop
nop
pop b
ret
read_byte: ;读取字节放在acc中
push b
mov b,#08h
loop_r8:
lcall read_b
rrc a
djnz b,loop_r8
pop b
ret
write_byte: ;要写的字节放在acc中
push b
mov b,#08h
loop_w8:
rrc a
lcall write_b
djnz b,loop_w8
pop b
ret
delay_600ms:
push b
mov r0,#06d
l1:
mov r1,#200d
l2:
mov b,#250d
djnz b,$
djnz r1,l2
djnz r0,l1
pop b
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -