发表于:2006-10-17 08:58:00
285楼
;12MHZ,默认,读18B20序号
ORG 0000H
AJMP MAIN
ORG 0020H
MAIN: mov r3,#10h ;清楚存储编号单元
mov r0,#40h
ss: mov @r0,#0
inc r0
djnz r3,ss
MOV SP,#60H
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;初始化ds1820
MOV A,#33H
LCALL WRITE ;送入读ds1820的ROM命令
LCALL READ ;开始读出当前ds1820序列号
MOV 40H,A
LCALL READ
MOV 41H,A
LCALL READ
MOV 42H,A
LCALL READ
MOV 43H,A
LCALL READ
MOV 44H,A
LCALL READ
MOV 45H,A
LCALL READ
MOV 46H,A
LCALL READ
MOV 47H,A
SETB EA
SJMP $
;----------------------------------------------------------------
INT: ;初始化ds1820子程序
CLR EA
L0: CLR P3.5 ;ds1820总线为低复位电平
MOV R2,#200
L1: CLR P3.5
DJNZ R2,L1 ;总线复位电平保持400us
SETB P3.5 ;释放ds1820总线
MOV R2,#30
L4: DJNZ R2,L4 ;释放ds1820总线保持60us
jb p3.5,L0 ;存在吗 不存在则重新来
MOV R6,#80
L5: ORL C,P3.5
JC L3
DJNZ R6,L5
SJMP L0
L3: MOV R2,#240
L2: DJNZ R2,L2
RET
;-----------------------------------------------------------------------------
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1: SETB P3.5
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR P3.5 ;开始写入ds1820总线要处于复位(低)状态
WR2: DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV P3.5,C ;写入一个bit
MOV R4,#20
WR3: DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB P3.5 ;重新释放ds1820总线
RET
;------------------------------------------------------------------------------
READ: CLR EA
MOV R6,#8 ;连续读8个bit
RE1: CLR P3.5 ;读前总线保持为低
MOV R4,#4
NOP
SETB P3.5 ;开始读总线释放
RE2: DJNZ R4,RE2 ;持续8us
MOV C,P3.5 ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3: DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB P3.5 ;重新释放ds1820总线
RET
END