/*******************1-wire bus *************************************/
/*******************************************************************/
/*******************************************************************/
;返回参数:ROM1991,ID1991,PASSWORD,S_DATA
NAME DS1991
?PR?RWDS1991?DS1991 SEGMENT CODE ;可执行的程序代码:RWDS1991,DS1991
?DT?RWDS1991?DS1991 SEGMENT DATA OVERLAYABLE ;RWDS1991,DS1991为内部数据区
;
PUBLIC RWDS1991
ROM1991 EQU 8200H
ID1991 EQU 8210H
S_DATA EQU 8220H
PASSWORD EQU 8330H
RSEG ?DT?RWDS1991?DS1991 ;内部数据存储区 在data中声明的目标
?RWDS1991?BYTE:
FLAG1?01: DS 1 ;int valuable FLAG1?01为一个字节长度的变量
ROM1992: DS 1
RSEG ?PR?RWDS1991?DS1991 ;Program segment
USING 0 ;using 函数属性用来指定一个函数所用的寄存器组
RWDS1991:
CLR EA
START:
SETB P3.2
LCALL TSRESET ;如果p3.2=1,则FLAG?01=#0FH
;如果p3.2=0,则FLAG?01=#00H
MOV A,#0FH
CLR C
SUBB A,FLAG1?01
JNZ TSS1 ;#00H,P3.2为0
LJMP TSS20 ;#0FH,END 结束
TSS1: MOV R7,#33H ;Read Rom功能指令
LCALL TSWRITE ;把#33H传输到p17.
MOV DPTR,#ROM1991
MOV R5,#08H
LCALL TSREAD ;读取64位DS1991 ROM代码
LCALL TSRESET
MOV A,#0FH
CLR C
SUBB A,FLAG1?01
JNZ TSS2
LJMP TSS20
TSS2: MOV R7,#0CCH ;Skip ROM [CCH]允许主机直接访问存储器
LCALL TSWRITE
MOV R7,#66H ;Read Subkey [66H]:用于提取选中的子密钥区内的数据
LCALL TSWRITE
MOV R7,#10H ;DS1991命令结构的第二个字节,选择第0区。
LCALL TSWRITE
MOV R7,#0EFH ;DS1991命令结构的第三个字节,为第二个字节的补码
LCALL TSWRITE
MOV DPTR,#ID1991
MOV R5,#08H ;8个字节ID1991
LCALL TSREAD ;读取8个字节ID1991
;传输8个字节的PASSWORD
MOV R1,#08H
MOV DPTR,#PASSWORD
TSS3: MOVX A,@DPTR
MOV R7,A
LCALL TSWRITE
INC DPTR
DJNZ R1,TSS3
MOV DPTR,#S_DATA
MOV R5,#08H
LCALL TSREAD ;读取8个字节的S_DATA
LCALL TSRESET
TSS20: SETB EA
RET ;END PROCEDURE ;此程序结束
/************************************************************/
;*****DALLAS 1-WIRE RESET SUBPROGRAM*****
TSRESET:
SETB P3.2
NOP
CLR P3.2
;MOV R0,#240 ;392us
MOV R0,#120
NOP
TSR1:
DJNZ R0,TSR1
SETB P3.2
;MOV R0,#30 ;
MOV R0,#30
DD: ;NOP
DJNZ R0,DD
;MOV R0,#100
MOV R0,#80
TSR2: JNB P3.2,TSR3
DJNZ R0,TSR2 ;等待p3.2=1, 218us
LJMP TSR4
TSR3: MOV FLAG1?01,#00H
LJMP TSR5
TSR4: MOV FLAG1?01,#0FH ;通讯结束,复位失败
LJMP TSR7
TSR5: MOV R0,#120
;MOV R0,#240 ;延时392us
TSR6: NOP
DJNZ R0,TSR6
TSR7:
SETB P3.2
RET
;*****1-WIRE WRITE A BYTE SUBPROGRAM*****
TSWRITE:
MOV A,R7
;CPL A
MOV R6,#08H ;传送8位
WST:
;CLR P1.7
SETB P3.2
MOV R0,#13
;MOV R0,#24 ;延时设置,26us
TSW0: DJNZ R0,TSW0
TSW1:
;SETB P1.7
CLR P3.2
;MOV R0,#04H ;延时设置 4us
MOV R0,#04H
;MOV R0,#04H
TSW2: DJNZ R0,TSW2
RRC A ;通过标志位c实现传输
;MOV P1.7,C
MOV P3.2,C
MOV R0,#33
;MOV R0,#60 ;延时设置 65us
TSW3: DJNZ R0,TSW3
DJNZ R6,WST
RET
;*****FROM 1-WIRE READ R5 BYTES*****
/*************读64位数据****************************/
TSREAD:
TSRD1: MOV R6,#08H
TSRD2: SETB P3.2
NOP
MOV R0,#09
; MOV R0,#09H
TSRD3: DJNZ R0,TSRD3
CLR P3.2
MOV R0,#02
;MOV R0,#4
TSRD4: DJNZ R0,TSRD4
SETB P3.2
MOV R0,#03H
;MOV R0,#09H
TSRD5: DJNZ R0,TSRD5
MOV C,P3.2
RRC A
MOV R0,#33
;MOV R0,#60
TSRD6: DJNZ R0,TSRD6
DJNZ R6,TSRD2
MOVX @DPTR,A
INC DPTR
DJNZ R5,TSRD1 ;传输R5个字节
RET
END ;本文件结束