- Inserir um tempo inicial no RTC (DS1307), isto já consegui via dado serial do microcontrolador 8051.
Desconfio que não, o RTC é I2C e desconheço algum modo simples de "conversar" com ele pela serial.
Abaixo estão as rotininhas que uso para comunicação com o RTC, para entender como usá-las é interessante dar uma lida no data-sheet do 1307 para entender como ele funciona.
Não se esqueça que o formato dos dados nos registros dele é BCD.
;-------------| Rotina Le Byte do RTC |---------------
; R3 = Endereco no RTC da variavel a ser lida; A = Valor lido
READBYTEHEX: CLR EA
CALL DS1307START
MOV A,#DS1307W
CALL DS1307SEND
MOV A,R3
CALL DS1307SEND
CALL DS1307STOP
CALL DS1307DELAY ; DELAY FOR AN OPERATION
CALL DS1307START
MOV A,#DS1307R
CALL DS1307SEND
SETB LASTREAD
CALL DS1307READ
SETB EA
RET
;-------------| Rotina Escreve Byte no RTC |---------------
; R3 = Endereco no RTC da variavel a ser escrita; R2 = Variavel ajustada
WRITEBYTEHEX: CLR EA
CALL DS1307START
MOV A,#DS1307W
CALL DS1307SEND
MOV A,R3
CALL DS1307SEND
MOV A,R2
; MOV B,#0AH
; DIV AB
; SWAP A
; ADD A,B
CALL DS1307SEND
CALL DS1307STOP
SETB EA
RET
; **********************************************************
; Envia 1 byte ao RTC A = Byte a ser enviado
; **********************************************************
; Deve ser feita previamente a inicializacao do ponteiro do RTC
DS1307SEND: PUSH 04H
MOV R4,#8
CLR C
DS1307SENDL1: RLC A
CLR SDA
JNC DS1307SENDD1
SETB SDA
DS1307SENDD1: NOP
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
CALL DS1307DELAY
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
DJNZ R4,DS1307SENDL1
SETB SDA ; SET SDA HIGH TO LOOK FOR
SCL_HIGH ; ACKNOWLEDGE PULSE
JNB SDA,DS1307SENDD2; CHECK FOR ACK OR NOT ACK
;SETB DS1307ERR ; SET ACKNOWLEDGE FLAG FOR ERROR
DS1307SENDD2: CALL DS1307DELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
CALL DS1307DELAY ; DELAY FOR AN OPERATION
POP 04H
RET
; **********************************************************
; Le 1 byte do RTC
; **********************************************************
DS1307READ: PUSH 03H
MOV R3,#08H ; SET COUNTER FOR 8-BITS DATA
MOV A,#0
SETB SDA ; SET SDA HIGH TO ENSURE LINE FREE
DS1307READL1: 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 R3,DS1307READL1 ; LOOP FOR 8-BITS
JB LASTREAD,DS1307READD1 ; CHECK TO SEE IF THIS IS THE LAST READ
CLR SDA ; IF NOT LAST READ SEND ACK-BIT
DS1307READD1: SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CALL DS1307DELAY
CLR SCL ; OR NOT ACKNOWLEDGE BIT
POP 03H
RET
; **********************************************************
; Gera condicao START
; **********************************************************
DS1307START: SETB SDA ; Rotina START
SCL_HIGH
CLR SDA
CALL DS1307DELAY
CLR SCL
RET
; **********************************************************
; Gera condicao STOP
; **********************************************************
DS1307STOP: CLR SDA ; Rotina STOP
SCL_HIGH
SETB SDA
RET
; **********************************************************
; Delay
; **********************************************************
DS1307DELAY: MOV B,#08H ; DELAY FOR BUS TIMING
DJNZ B,$
RET