;|--------------------------------------------------|
;| 读出ds1820序列号应用程序,P1.0接ds1820 |
;|--------------------------------------------------|
ORG 0000H
AJMP MAIN
ORG 0020H
;===========================================================
MAIN: 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
LCALL READ
MOV 48H,A
LCALL READ
MOV 49H,A
SETB EA
SJMP $
;===========================================================
INT: CLR EA ;初始化ds1820子程序
L0: CLR P1.0 ;ds1820总线为低复位电平
MOV R2,#200
L1: CLR P1.0
DJNZ R2,L1 ;总线复位电平保持400us
SETB P1.0 ;释放ds1820总线
MOV R2,#30
L4: JNZ R2,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号(存在C=1,不存在c=0)
ORL C,P1.0
JC L0 ;存在吗?不存在则重新来
MOV R6,#80
L5: ORL C,P1.0
JC L3
DJNZ R6,L5
SJMP L0
L3: MOV R2,#240
L2: JNZ R2,L2
RET
;===========================================================
WRITE: CLR EA ;向ds1820写操作命令子程序
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WT1: SETB P1.0
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR P1.0 ;开始写入ds1820总线要处于复位(低)状态
WT2: JNZ R4,WT2 ;ds1820总线复位保持16us
MOV P1.0,C ;写入一个bit
MOV R4,#20
WT3: JNZ R4,WT3 ;等待40us
DJNZ R3,WT1 ;写入下一个bit
SETB P1.0 ;重新释放ds1820总线
RET
;===========================================================
READ: CLR EA
MOV R6,#8 ;连续读8个bit
RE1: CLR P1.0 ;读前总线保持为低
MOV R4,#4
NOP
SETB P1.0 ;开始读,总线释放
RE2: JNZ R4,RE2 ;持续8us
MOV C,P1.0 ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3: JNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB P1.0 ;重新释放ds1820总线
RET
;===========================================================
END
文章评论(0条评论)
登录后参与讨论