Chat
Danh mục
Giao tiếp I2C và DS1307

Giao tiếp I2C và DS1307

Số lượng:
Thêm vào giỏ
Giao tiếp I2C và DS1307 đã được thêm vào giỏ hàng


Phần này mình xin giới thiệu về mạch giao tiếp và 1 chuơng trình asm giao tiếp DS1307 ở trang 8051projects.info
Lưu ý code chỉ mang tính tham khảo để các bạn hiểu rõ hơn cách giao tiếp với DS1307.
Code




;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


; PORT DECLERATION
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SDA EQU P3.5  ;SDA=PIN5
SCL EQU P3.4 ;SCL=PIN6

DS1307W   EQU    0D0H     ; SLAVE ADDRESS 1101 000 + 0 TO WRITE
DS1307R   EQU    0D1H     ; SLAVE ADDRESS 1101 000 + 1 TO READ



; **********************************************************
; Main Program
; **********************************************************
CALL OSC_CONTROL ;Initilize the RTC
REPEAT: CALL READ_CLOCK ;Read Clock
AJMP REPEAT

; **********************************************************
; SUB SETS THE DS1307 OSCILLATOR
; **********************************************************

OSC_CONTROL:
ACALL       SEND_START ; GENERATE START CONDITION
MOV         A,#DS1307W ; 1101 0000 ADDRESS + WRITE-BIT
ACALL       SEND_BYTE  ; SEND BYTE TO 1307
MOV         A,#00H     ; ADDRESS BYTE TO REGISTER 00H
ACALL       SEND_BYTE  ; SECONDS REGISTER, ALWAYS LEAVE
SETB        LASTREAD   ; REG 00H-BIT #7 = 0 (LOW)
ACALL       SEND_STOP  ; IF REG 00H-BIT #7 = 1 CLOCK
ACALL       SEND_START ; OSCILLATOR IS OFF.
MOV         A,#DS1307R ; 1101 0001 ADDRESS + READ-BIT
ACALL       SEND_BYTE  ;
ACALL       READ_BYTE  ; READ A BYTE FROM THE 1307
CLR         ACC.7      ; CLEAR REG 00H-BIT #7 TO ENABLE
OSC_SET:                        ; OSCILLATOR.
PUSH        ACC        ; SAVE ON STACK
ACALL       SEND_STOP  ;
ACALL       SEND_START ;
MOV         A,#DS1307W ; SETUP TO WRITE
ACALL       SEND_BYTE  ;
MOV         A,#00H     ; REGISTER 00H ADDRESS
ACALL       SEND_BYTE  ;
POP         ACC        ; GET DATA TO START OSCILLATOR
ACALL       SEND_BYTE  ; SEND IT
ACALL       SEND_STOP
RET
; **********************************************************
; THIS SUB CONTROLS THE SQW OUTPUT 1HZ
; **********************************************************
SQW_CONTROL_1HZ:
LCALL SEND_START ; SEND START CONDITION
MOV A,#DS1307W ; SET POINTER TO REG 07H ON
; DS1307
LCALL SEND_BYTE
MOV A,#07H
LCALL SEND_BYTE
MOV A,#90H ; SQW/OUT ON AT 1HZ
JNB SQW,SQW_SET ; JUMP IF SQW BIT IS ACTIVE
MOV A,#80H ; TURN SQW/OUT OFF – OFF HIGH
SQW_SET:
LCALL SEND_BYTE
LCALL SEND_STOP
RET
; **********************************************************
; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307
; **********************************************************

READ_BYTE:
MOV         BITCNT,#08H; SET COUNTER FOR 8-BITS DATA
MOV         A,#00H
SETB        SDA        ; SET SDA HIGH TO ENSURE LINE
; FREE
READ_BITS:
SCL_HIGH               ; TRANSITION SCL LOW-TO-HIGH
MOV         C,SDA      ; MOVE DATA BIT INTO CARRY
RLC         A          ; ROTATE CARRY-BIT INTO ACC.0
CLR         SCL        ; TRANSITION SCL HIGH-TO-LOW
DJNZ        BITCNT,READ_BITS
; LOOP FOR 8-BITS
JB          LASTREAD,ACKN
; CHECK TO SEE IF THIS IS
; THE LAST READ
CLR         SDA        ; IF NOT LAST READ SEND ACK-BIT

ACKN:
SCL_HIGH               ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CLR         SCL        ; OR NOT ACKNOWLEDGE BIT
RET

; **********************************************************
; SUB SENDS START CONDITION
; **********************************************************

SEND_START:
SETB        _2W_BUSY   ; INDICATE THAT 2-WIRE
CLR         ACKS        ; OPERATION IS IN PROGRESS
CLR         BUS_FLT    ; CLEAR STATUS FLAGS
JNB         SCL,FAULT
JNB         SDA,FAULT
SETB        SDA        ; BEGIN START CODITION
SCL_HIGH
CLR         SDA
ACALL       DEELAY
CLR         SCL
RET
FAULT:
SETB        BUS_FLT
RET

; **********************************************************
; SUB SENDS STOP CONDITION
; **********************************************************
SEND_STOP:
CLR         SDA
SCL_HIGH
SETB        SDA
CLR         _2W_BUSY
RET
; **********************************************************
; SUB DELAYS THE BUS
; **********************************************************
DEELAY:
NOP                    ; DELAY FOR BUS TIMING
RET
; **********************************************************
; THIS SUB SENDS 1 BYTE OF DATA TO THE DS1307
; CALL THIS FOR EACH REGISTER SECONDS TO YEAR
; ACC MUST CONTAIN DATA TO BE SENT TO CLOCK
; **********************************************************
SEND_BYTE:
MOV         BITCNT,#08H; SET COUNTER FOR 8-BITS
SB_LOOP:
JNB         ACC.7,NOTONE; CHECK TO SEE IF BIT-7 OF
SETB        SDA        ; ACC IS A 1, AND SET SDA HIGH
JMP         ONE
NOTONE:
CLR         SDA        ; CLR SDA LOW
ONE:
SCL_HIGH               ; TRANSITION SCL LOW-TO-HIGH
RL          A          ; ROTATE ACC LEFT 1-BIT
CLR         SCL        ; TRANSITION SCL LOW-TO-HIGH
DJNZ        BITCNT,SB_LOOP; LOOP FOR 8-BITS
SETB        SDA        ; SET SDA HIGH TO LOOK FOR
SCL_HIGH               ; ACKNOWLEDGE PULSE
CLR         ACKS
JNB         SDA,SB_EX  ; CHECK FOR ACK OR NOT ACK
SETB        ACKS        ; SET ACKNOWLEDGE FLAG FOR
; NOT ACK
SB_EX:
CALL       DEELAY      ; DELAY FOR AN OPERATION
CLR         SCL        ; TRANSITION SCL HIGH-TO-LOW
CALL       DEELAY      ; DELAY FOR AN OPERATION
RET
; **********************************************************
; SUB READS THE CLOCK AND WRITES IT TO THE SCRATCHPAD MEMORY
; ON RETURN FROM HERE DATE & TIME DATA WILL BE STORED IN THE
; DATE & TIME REGISTERS FROM 24H (SECS) TO 2AH (YEAR)
; ALARM SETTINGS IN REGISTERS 2CH(HRS) AND 2DH(MINUTES).
; **********************************************************
READ_CLOCK:
MOV         R1,#SECS   ; SECONDS STORAGE LOCATION
MOV         BYTECNT,#00H
CLR         LASTREAD
CALL       SEND_START
MOV         A,#DS1307W
CALL       SEND_BYTE
MOV         A,#00H
CALL       SEND_BYTE
CALL       SEND_STOP
CALL       SEND_START
MOV         A,#DS1307R
CALL       SEND_BYTE

READ_LOOP:
MOV         A,BYTECNT
CJNE        A,#09H,NOT_LAST
SETB        LASTREAD

NOT_LAST:
CALL       READ_BYTE
MOV         @R1,A
MOV         A,BYTECNT
CJNE        A,#00H,NOT_FIRST
MOV         A,@R1
CLR         ACC.7      ; ENSURE OSC BIT=0 (ENABLED)
MOV         @R1,A
NOT_FIRST:
INC         R1
INC         BYTECNT
MOV         A,BYTECNT
CJNE        A,#0AH,READ_LOOP
CALL       SEND_STOP
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
; STORE THE TIME TO RTC CHIP
;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
STORE_RTC:
LCALL SEND_START ; SEND 2WIRE START CONDITION
MOV A,#DS1307W ; LOAD DS1307 WRITE COMMAND
LCALL SEND_BYTE ; SEND WRITE COMMAND
MOV A,#01H ; SET DS1307 DATA POINTER TO BEGINNING
LCALL SEND_BYTE ; OF 00H
MOV A,MINS ; Send min
LCALL SEND_BYTE
MOV A,HRS ;send hr
SETB ACC.6        ;12 HR MODE
JNB AMS,YUH
CLR ACC.5 ;AM/PM 1=PM,0=AM
AJMP YUH1
YUH: SETB ACC.5
YUH1: LCALL SEND_BYTE
MOV A,DAY ; Send Day
LCALL SEND_BYTE
MOV A,DATE1 ; Send date
LCALL SEND_BYTE
MOV A,MONTH ; Send month
LCALL SEND_BYTE
MOV A,YEAR ; Send yr
LCALL SEND_BYTE
LCALL SEND_STOP ; SEND 2WIRE STOP CONTION
RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$




Theo ktmk.byethost8.com