;************************************************************
;-----------------------------------------------------------*
; DS18B20 sub start *
;-----------------------------------------------------------*
;************************************************************
;************************DS18B20主函数************************
DS18B20_Start:
call DS18B20_Init
mov A,#0CCH
call DS18B20_Write
mov A,#044H
call DS18B20_Write
call DS18B20_Init
mov A,#0CCH
call DS18B20_Write
mov A,#0BEH
call DS18B20_Write
call DS18B20_Read
clr Temper_dp
clr Temper_Int
bts0 Read_Buf.3
bset Temper_dp.3
bts0 Read_Buf.2
bset Temper_dp.2
bts0 Read_Buf.1
bset Temper_dp.1
bts0 Read_Buf.0
bset Temper_dp.0
bts0 Read_Buf.7
bset Temper_Int.3
bts0 Read_Buf.6
bset Temper_Int.2
bts0 Read_Buf.5
bset Temper_Int.1
bts0 Read_Buf.4
bset Temper_Int.0
call DS18B20_Read
bts0 Read_Buf.3
bset Temper_Int.7
bts0 Read_Buf.2
bset Temper_Int.6
bts0 Read_Buf.1
bset Temper_Int.5
bts0 Read_Buf.0
bset Temper_Int.4
b0mov R,#0
mov A,Temper_Int
call _HEX_TO_DEC
nop
ret
;----------------------------------------
;----------- DS18B20 Init ---------------
DS18B20_Init:
bset DataPinM
bset DataPin
nop
nop
bclr DataPin ;拉低480us-960us
b0mov R,#250 ;
decms R
jmp $-1
bclr DataPinM ;然后释放总线等待15us-60us
b0mov R,#10
decms R
jmp $-1
bts0 DataPin ;等待低电平
jmp $-1
bts1 DataPin ;等待释放总线电平
jmp $-1
ret
;----------------------------------------
;----------- DS18B20 Write Byte ---------
DS18B20_Write:
mov Write_Buf,A
mov_ WR_Cnt,#8
DS18B20_Write_Loop:
rrcm Write_Buf ;从低位开始写
bts0 FC
jmp DS18B20_Write1
bts1 FC
jmp DS18B20_Write0
DS18B20_Write0:
bset DataPinM
bclr DataPin
b0mov R,#80
decms R
jmp $-1
bclr DataPinM
jmp DS18B20_Write_Ex
DS18B20_Write1:
bset DataPinM
bclr DataPin ;写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束
nop
nop
bclr DataPinM
b0mov R,#80
decms R
jmp $-1
jmp DS18B20_Write_Ex
DS18B20_Write_Ex:
decms WR_Cnt
jmp DS18B20_Write_Loop
ret
;----------------------------------------
;----------- DS1302 Read Byte -----------
DS18B20_Read:
clr Read_Buf
mov_ WR_Cnt,#8
DS18B20_Read_Loop:
bset DataPinM ;
bset DataPin
bclr DataPin ;拉低1us之后马上开始读
nop
nop
bclr DataPinM
nop
nop
b0mov R,#8 ;14个us之内必须读完
decms R
jmp $-1
bclr FC
bts0 DataPin
bset FC
rrcm Read_Buf ;从低位开始读
b0mov R,#60
decms R
jmp $-1
decms WR_Cnt
jmp DS18B20_Read_Loop
mov A,Read_Buf
ret
;************************************************************
;-----------------------------------------------------------*
; DS18B20 sub end *
;-----------------------------------------------------------*
;************************************************************ |