下面是我向ds2433写如两个字节的程序,可是怎么都写不进去,用protues模拟看,可以写进暂存器,也可以读暂存器和ds2433的memery,但是就是写不尽memery,请大神帮助看看哪里出现问题了,程序执行过程中,ds2433的e/s寄存器的PS位始终是1,按道理应该是零,这是只读寄存器,未找到原因。 DQ BIT P3.7 ; 1 wire line
;***************************************************************
ORG 0000H
LJMP MAIN
; Main program
MAIN:
LCALL RSTSNR ; Init of the DS2433
JNB F0,KEND ;查看f0位,是零则器件无应答,跳转到程序尾
MOV R0,#0CCH ;cc命令是越过rom
LCALL SEND_BYTE
MOV R0,#00FH ;0fh写暂存器
LCALL SEND_BYTE ;
MOV R0,#001h ;TA1地址低位
LCALL SEND_BYTE ;
MOV R0,#000h ;TA2地址高位
LCALL SEND_BYTE ; Send a Convert Command
MOV R0,#0AAH ;第一个字节
LCALL SEND_BYTE ; Send a Convert Command
MOV R0,#0cch ;第二个字节
LCALL SEND_BYTE ; Send a Convert Command
mov r6,#0ffh
djnz r6,$
LCALL RSTSNR ; Init of the ds2433
JNB F0,KEND ;查看f0位,是零则器件无应答,跳转到程序尾
MOV R0,#0CCH ;cc命令是越过rom
LCALL SEND_BYTE
MOV R0,#0aah ; 0aa读暂存器
LCALL SEND_BYTE ; Send a Convert Command
lcall readbyte ;读取TA1、TA2、ES寄存器和两个字节数据
mov 33h,a
lcall readbyte
mov 34h,a
lcall readbyte
mov 35h,a
lcall readbyte
mov 36h,a
lcall readbyte
mov 37h,a
mov r6,#0ffh
djnz r6,$
LCALL RSTSNR ; Init of the ds2433
JNB F0,KEND
MOV R0,#0CCH ;cc命令是越过rom
LCALL SEND_BYTE
MOV R0,#055H ;055h从暂存器写到内存
LCALL SEND_BYTE ; Send a Convert Command
MOV R0,33h ;TA1地址低位
LCALL SEND_BYTE ; Send a Convert Command
MOV R0,34h ;TA2地址高位
LCALL SEND_BYTE ; Send a Convert Command
MOV R0,35h ;ES寄存器
LCALL SEND_BYTE ; Send a Convert Command
setb DQ
mov r7,#0ffh
loop12: mov r6,#0ffh
djnz r6,$
djnz r7,loop12
KEND:
ljmp main
;**********************************************************
; ;*************************************************
; Read a byte from the 1 wire line
READBYTE:
MOV R5,#8
READ1: LCALL READ
RRC A
DJNZ R5,READ1 ;
MOV R0,A
RET
;*************************************************
;*************************************************
READ: SETB DQ ;
NOP
NOP
CLR DQ
NOP
NOP
SETB DQ ;
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DQ
MOV R6,#23
DJNZ R6,$
RET
;*************************************************
; Send a byte to the 1 wire line
SEND_BYTE: ;
MOV A,R0
MOV R5,#8
SEN3: CLR C
RRC A
JC SEN1
LCALL WRITE_0
SJMP SEN2
SEN1: LCALL WRITE_1
SEN2: DJNZ R5,SEN3 ;
RET
;*************************************************
; Reset 1 wire line
RSTSNR: SETB DQ
NOP
NOP
CLR DQ
MOV R6,#250 ;
DJNZ R6,$
MOV R6,#50
DJNZ R6,$
SETB DQ ;
MOV R6,#15
DJNZ R6,$
CALL CHCK ;
MOV R6,#60
DJNZ R6,$
SETB DQ
RET
;*************************************************
; low level subroutines
CHCK: MOV C,DQ
JC RST0
SETB F0 ; 应答成功
SJMP CHCK0
RST0: CLR F0 ;
CHCK0: RET
;*************************************************
WRITE_0:
CLR DQ
MOV R6,#30
DJNZ R6,$
SETB DQ
RET
;*************************************************
WRITE_1:
CLR DQ
NOP
NOP
NOP
NOP
NOP
SETB DQ
MOV R6,#30
DJNZ R6,$
RET
;*************************************************
end
|