1. You can now buy finished microcontroller project from us, Check out the Store for the complete list of projects.
  2. Need a custom project, Send us some details about your project. So that we can quote the price for it.

RTC (DS1307) Interfacing with AT89C2051

interfacing the Real Time Clock with 8051 microcontroller.

  1. Binu
    Circuit Diagram
    [​IMG]
    Program
    Code (Text):
    1. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    2. ;                PORT DECLERATION
    3. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    4. SDA        EQU        P3.5  ;SDA=PIN5
    5. SCL        EQU        P3.4        ;SCL=PIN6
    6.  
    7. DS1307W  EQU    0D0H    ; SLAVE ADDRESS 1101 000 + 0 TO WRITE
    8. DS1307R  EQU    0D1H    ; SLAVE ADDRESS 1101 000 + 1 TO READ
    9.  
    10.  
    11.  
    12. ; **********************************************************
    13. ; Main Program
    14. ; **********************************************************
    15.               CALL OSC_CONTROL                ;Initilize the RTC
    16. REPEAT:        CALL READ_CLOCK                ;Read Clock
    17.               AJMP REPEAT
    18.  
    19. ; **********************************************************
    20. ; SUB SETS THE DS1307 OSCILLATOR
    21. ; **********************************************************
    22.  
    23. OSC_CONTROL:
    24.         ACALL      SEND_START ; GENERATE START CONDITION
    25.         MOV        A,#DS1307W ; 1101 0000 ADDRESS + WRITE-BIT
    26.         ACALL      SEND_BYTE  ; SEND BYTE TO 1307
    27.         MOV        A,#00H    ; ADDRESS BYTE TO REGISTER 00H
    28.         ACALL      SEND_BYTE  ; SECONDS REGISTER, ALWAYS LEAVE
    29.         SETB        LASTREAD  ; REG 00H-BIT #7 = 0 (LOW)
    30.         ACALL      SEND_STOP  ; IF REG 00H-BIT #7 = 1 CLOCK
    31.         ACALL      SEND_START ; OSCILLATOR IS OFF.
    32.         MOV        A,#DS1307R ; 1101 0001 ADDRESS + READ-BIT
    33.         ACALL      SEND_BYTE  ;
    34.         ACALL      READ_BYTE  ; READ A BYTE FROM THE 1307
    35.         CLR        ACC.7      ; CLEAR REG 00H-BIT #7 TO ENABLE
    36. OSC_SET:                        ; OSCILLATOR.
    37.         PUSH        ACC        ; SAVE ON STACK
    38.         ACALL      SEND_STOP  ;
    39.         ACALL      SEND_START ;
    40.         MOV        A,#DS1307W ; SETUP TO WRITE
    41.         ACALL      SEND_BYTE  ;
    42.         MOV        A,#00H    ; REGISTER 00H ADDRESS
    43.         ACALL      SEND_BYTE  ;
    44.         POP        ACC        ; GET DATA TO START OSCILLATOR
    45.         ACALL      SEND_BYTE  ; SEND IT
    46.         ACALL      SEND_STOP
    47.         RET
    48. ; **********************************************************      
    49. ; THIS SUB CONTROLS THE SQW OUTPUT 1HZ
    50. ; **********************************************************      
    51. SQW_CONTROL_1HZ:
    52.       LCALL SEND_START        ; SEND START CONDITION
    53.       MOV A,#DS1307W                ; SET POINTER TO REG 07H ON
    54.                               ; DS1307
    55.       LCALL SEND_BYTE
    56.       MOV A,#07H
    57.       LCALL SEND_BYTE
    58.       MOV A,#90H                ; SQW/OUT ON AT 1HZ
    59.       JNB SQW,SQW_SET                ; JUMP IF SQW BIT IS ACTIVE
    60.       MOV A,#80H                ; TURN SQW/OUT OFF – OFF HIGH
    61. SQW_SET:
    62.       LCALL SEND_BYTE
    63.       LCALL SEND_STOP
    64.       RET
    65. ; **********************************************************      
    66. ; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307
    67. ; **********************************************************
    68.  
    69. READ_BYTE:
    70.         MOV        BITCNT,#08H; SET COUNTER FOR 8-BITS DATA
    71.         MOV        A,#00H
    72.         SETB        SDA        ; SET SDA HIGH TO ENSURE LINE
    73.                                 ; FREE
    74. READ_BITS:
    75.         SCL_HIGH              ; TRANSITION SCL LOW-TO-HIGH
    76.         MOV        C,SDA      ; MOVE DATA BIT INTO CARRY
    77.         RLC        A          ; ROTATE CARRY-BIT INTO ACC.0
    78.         CLR        SCL        ; TRANSITION SCL HIGH-TO-LOW
    79.         DJNZ        BITCNT,READ_BITS
    80.                                 ; LOOP FOR 8-BITS
    81.         JB          LASTREAD,ACKN
    82.                                 ; CHECK TO SEE IF THIS IS
    83.                                 ; THE LAST READ
    84.         CLR        SDA        ; IF NOT LAST READ SEND ACK-BIT
    85.  
    86. ACKN:
    87.         SCL_HIGH              ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
    88.         CLR        SCL        ; OR NOT ACKNOWLEDGE BIT
    89.         RET
    90.  
    91. ; **********************************************************
    92. ; SUB SENDS START CONDITION
    93. ; **********************************************************
    94.  
    95. SEND_START:
    96.         SETB        _2W_BUSY  ; INDICATE THAT 2-WIRE
    97.         CLR        ACKS        ; OPERATION IS IN PROGRESS
    98.         CLR        BUS_FLT    ; CLEAR STATUS FLAGS
    99.         JNB        SCL,FAULT
    100.         JNB        SDA,FAULT
    101.         SETB        SDA        ; BEGIN START CODITION
    102.         SCL_HIGH
    103.         CLR        SDA
    104.         ACALL      DEELAY
    105.         CLR        SCL
    106.         RET
    107. FAULT:
    108.         SETB        BUS_FLT
    109.         RET
    110.  
    111. ; **********************************************************
    112. ; SUB SENDS STOP CONDITION
    113. ; **********************************************************
    114. SEND_STOP:
    115.         CLR        SDA
    116.         SCL_HIGH
    117.         SETB        SDA
    118.         CLR        _2W_BUSY
    119.         RET
    120. ; **********************************************************
    121. ; SUB DELAYS THE BUS
    122. ; **********************************************************
    123. DEELAY:
    124.         NOP                    ; DELAY FOR BUS TIMING
    125.         RET
    126. ; **********************************************************
    127. ; THIS SUB SENDS 1 BYTE OF DATA TO THE DS1307
    128. ; CALL THIS FOR EACH REGISTER SECONDS TO YEAR
    129. ; ACC MUST CONTAIN DATA TO BE SENT TO CLOCK
    130. ; **********************************************************
    131. SEND_BYTE:
    132.         MOV        BITCNT,#08H; SET COUNTER FOR 8-BITS
    133. SB_LOOP:
    134.         JNB        ACC.7,NOTONE; CHECK TO SEE IF BIT-7 OF
    135.         SETB        SDA        ; ACC IS A 1, AND SET SDA HIGH
    136.         JMP        ONE
    137. NOTONE:
    138.         CLR        SDA        ; CLR SDA LOW
    139. ONE:
    140.         SCL_HIGH              ; TRANSITION SCL LOW-TO-HIGH
    141.         RL          A          ; ROTATE ACC LEFT 1-BIT
    142.         CLR        SCL        ; TRANSITION SCL LOW-TO-HIGH
    143.         DJNZ        BITCNT,SB_LOOP; LOOP FOR 8-BITS
    144.         SETB        SDA        ; SET SDA HIGH TO LOOK FOR
    145.         SCL_HIGH              ; ACKNOWLEDGE PULSE
    146.         CLR        ACKS
    147.         JNB        SDA,SB_EX  ; CHECK FOR ACK OR NOT ACK
    148.         SETB        ACKS        ; SET ACKNOWLEDGE FLAG FOR
    149.                                 ; NOT ACK
    150. SB_EX:
    151.         CALL      DEELAY      ; DELAY FOR AN OPERATION
    152.         CLR        SCL        ; TRANSITION SCL HIGH-TO-LOW
    153.         CALL      DEELAY      ; DELAY FOR AN OPERATION
    154.         RET
    155. ; **********************************************************
    156. ; SUB READS THE CLOCK AND WRITES IT TO THE SCRATCHPAD MEMORY
    157. ; ON RETURN FROM HERE DATE & TIME DATA WILL BE STORED IN THE
    158. ; DATE & TIME REGISTERS FROM 24H (SECS) TO 2AH (YEAR)
    159. ; ALARM SETTINGS IN REGISTERS 2CH(HRS) AND 2DH(MINUTES).
    160. ; **********************************************************
    161. READ_CLOCK:
    162.         MOV        R1,#SECS  ; SECONDS STORAGE LOCATION
    163.         MOV        BYTECNT,#00H
    164.         CLR        LASTREAD
    165.         CALL      SEND_START
    166.         MOV        A,#DS1307W
    167.         CALL      SEND_BYTE
    168.         MOV        A,#00H
    169.         CALL      SEND_BYTE
    170.         CALL      SEND_STOP
    171.         CALL      SEND_START
    172.         MOV        A,#DS1307R
    173.         CALL      SEND_BYTE
    174.  
    175. READ_LOOP:
    176.         MOV        A,BYTECNT
    177.         CJNE        A,#09H,NOT_LAST
    178.         SETB        LASTREAD
    179.  
    180. NOT_LAST:
    181.         CALL      READ_BYTE
    182.         MOV        @R1,A
    183.         MOV        A,BYTECNT
    184.         CJNE        A,#00H,NOT_FIRST
    185.         MOV        A,@R1
    186.         CLR        ACC.7      ; ENSURE OSC BIT=0 (ENABLED)
    187.         MOV        @R1,A
    188. NOT_FIRST:
    189.         INC        R1
    190.         INC        BYTECNT
    191.         MOV        A,BYTECNT
    192.         CJNE        A,#0AH,READ_LOOP
    193.         CALL      SEND_STOP
    194.         RET
    195. ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    196. ;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
    197. ;                STORE THE TIME TO RTC CHIP
    198. ;(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((      
    199. STORE_RTC:
    200.       LCALL SEND_START                ; SEND 2WIRE START CONDITION
    201.       MOV A,#DS1307W                        ; LOAD DS1307 WRITE COMMAND
    202.       LCALL SEND_BYTE                ; SEND WRITE COMMAND
    203.       MOV A,#01H                        ; SET DS1307 DATA POINTER TO BEGINNING
    204.       LCALL SEND_BYTE                ; OF 00H
    205.       MOV A,MINS                        ; Send min
    206.       LCALL SEND_BYTE              
    207.       MOV A,HRS                        ;send hr
    208.       SETB ACC.6        ;12 HR MODE
    209.       JNB AMS,YUH
    210.       CLR ACC.5                        ;AM/PM                1=PM,0=AM
    211.       AJMP YUH1
    212. YUH: SETB ACC.5      
    213. YUH1:        LCALL SEND_BYTE
    214.       MOV A,DAY                        ; Send Day
    215.       LCALL SEND_BYTE              
    216.       MOV A,DATE1                        ; Send date
    217.       LCALL SEND_BYTE                      
    218.       MOV A,MONTH                        ; Send month
    219.       LCALL SEND_BYTE
    220.       MOV A,YEAR                        ; Send yr
    221.       LCALL SEND_BYTE
    222.       LCALL SEND_STOP                ; SEND 2WIRE STOP CONTION
    223.       RET
    224. ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    santos29 likes this.