?? 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 + -