为了直观,我只接一个ds18b20,使用isis模拟,读出的温度放在30h,31h。读出值全是1。我用的是汇编。
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:
UL:
ACALL DS18B20
AJMP UL
;------------------ 18B20子程序------------
DS18B20:
LCALL I18B20
JNB 20H.0,UL ;判断是否有挂载
MOV A,0CCH
LCALL W18B20
MOV A,44H
LCALL W18B20
MOV R7,#1EH
DJNZ R7,$
MOV A,#0cch
LCALL W18B20
MOV A,0BEH
LCALL W18B20
LCALL R18B20
RET
;-------------------18b20初始化------------------
I18B20:
SETB P3.7
NOP
NOP
CLR P3.7
MOV R7,#0 ;延时513us
DJNZ R7,$
SETB P3.7
MOV R7, #25H ; 延时74us
DJNZ R7,$
MOV R7,80H
INIT2:
JNB P3.7,INIT1
DJNZ R7,INIT2
CLR 20H.0
SETB P3.7
MOV 40H,#11H
RET
INIT1:
SETB 20H.0
SETB P3.7
MOV 40H,#22H
MOV R7,#0F0H ;延时
DJNZ R7,$
RET
;-------------------18b20写------------------
W18B20:
MOV R6,#8H
CLR C
WR1:
CLR P3.7
MOV R7,#07H
DJNZ R3,$
RRC A
MOV P3.7,C
MOV R3,#32H
DJNZ R3,$
SETB P3.7
NOP
DJNZ R2,WR1
SETB P3.7
RET
;-------------------18b20读------------------
R18B20:
MOV R6,#2
MOV R1,#30H
RE00:
MOV R5,#8H
RE01:
CLR CY
SETB P3.7
NOP
NOP
CLR P3.7
NOP
NOP
NOP
SETB P3.7
MOV R7,#9H
DJNZ R7,$
MOV C,P3.7
MOV R7,#3CH
DJNZ R7,$
RRC A
DJNZ R5,RE01
MOV @R1,A
INC R1
DJNZ R6,RE00
RET
END
|