Montei um relogio baseado no clock de um 8051. A precisão é boa, atraza alguns poucos segundos ao dia.
To colocando algumas fotos para mostrar o meu projetinho.
http://www.gvaconsultoria.com.br/ferro/ ... elogio.asp
Também fiz um filminho pra mostrar pra vocês verem.
http://www.youtube.com/watch?v=KOjKppBCAAQ
Agora, estou a tentar usar um chip RTC para controlar o relógio, mas todos eles usam esse maldito protocolo I2C, e estou apanhando muito dele. Peço ajuda e dicas de todos para construção de um protocolo para usar com o at89s52 o ci ds1302.
Segue código para quem achar interessante.
DD BIT P0.0 ;controlador do disp de 7 seg. D. Nivel alto ativa.
CC BIT P0.1 ;C
BB BIT P0.2 ;B
AA BIT P0.3 ;A
UM BIT P0.4 ;Disp. 7 Segm. da unidade dos minutos. Nivel baixo acente o disp.
DM BIT P0.5 ;Dezena dos minutos.
UH BIT P0.6 ;Unidade das horas.
DH BIT P0.7 ;Dezena das horas.
BTOHORA BIT P2.0 ;BOTAO DE ARRUMAR A HORA
BTOINC BIT P2.1 ;BTO DE INCREMENTAR, SE BTO HORA NAO ATIVO, INCREMENTA MINUTO
BTODEC BIT P2.2 ;BTO DE DECREMENTAR, SE BTO HORA NAO ATIVO, DECREMENTA MINUTO
PCON EQU 087H
PILHA EQU 60H
varDH EQU 31H
varUH EQU 32H
varDM EQU 33H
varUM EQU 34H
varS EQU 35H
AUXRELOGIO EQU 37H
AUXINCREMENTA EQU 38H
AUXDECREMENTA EQU 39H
AUXHORA EQU 40H
ORG 000H
LJMP Inicio ;SALTA VETORES DE INTERRUPCAO
ORG 00BH ;INTERRUPCAO DO TIMER 0
LJMP TIM0
ORG 030H
;************************* INICIO DO FIRMWARE **************************
Inicio:
;*********************** Teste leds dos segmentos ************************
AJMP VARIAVEIS
CALL DezHora
CALL Teste
CALL UniHora
CALL Teste
CALL DezMinuto
CALL Teste
CALL UniMinuto
CALL Teste
;*************************** CARREGA VARIAVEIS ***************************
VARIAVEIS: MOV AUXRELOGIO,#100 ;AUXILIAR 100 X 0.01 SEGUNDOS
MOV AUXINCREMENTA,#15 ;AUXILIAR DO BTO DE INCREMENTAR MINUTOS
MOV AUXDECREMENTA,#15 ;AUXILIAR DO BTO DE DECREMENTAR MINUTOS
MOV varDH,#0
MOV varUH,#0
MOV varDM,#0
MOV varUM,#0
MOV varS,#00H
MOV IE,#10000010B ;HABILITA TIMER T0
MOV TH0,#0D8H ;TIMER EM MILI SEGUNDOS COM CRISTAL DE 12MHz
MOV TL0,#0F0H
MOV TMOD,#01
SETB TR0
;*************************** MOSTRA AS HORAS ***************************
HORAS: CALL Limpa
MOV A,varDH
CALL VALOR
CALL DezHora
CALL FiveMili
CALL Limpa
MOV A,varUH
CALL VALOR
CALL UniHora
CALL FiveMili
CALL Limpa
MOV A,varDM
CALL VALOR
CALL DezMinuto
CALL FiveMili
CALL Limpa
MOV A,varUM
CALL VALOR
CALL UniMinuto
CALL FiveMili
;*************************** FIM DO FIRMWARE ***************************
AJMP HORAS
;************************* Inicio das Funções **************************
;*********************** INTERRUPÇÃO DO TIMER 0 ************************
TIM0: CLR TR0
MOV TH0,#0D8H ;TIMER EM MILI SEGUNDOS COM CRISTAL DE 12MHz
MOV TL0,#0F0H
SETB TR0
JB BTOHORA,STEP1
CALL INCDECHORA
STEP1: JB BTOINC,STEP2
CALL INCREMENTA
STEP2: JB BTODEC,STEP3
CALL DECREMENTA
STEP3: DJNZ AUXRELOGIO,FTIM0
MOV AUXRELOGIO,#100 ;AUXILIAR 100 X 0.001 SEGUNDOS
CALL SEGUNDOS
FTIM0: RETI
;************************* FUNCAO DO RELOGIO ***************************
SEGUNDOS: MOV A,varS
CJNE A,#3BH,FSEG0
CALL RELOGIO
MOV varS,#00H
JMP FSEG
FSEG0: INC A
MOV varS,A
FSEG: RET
RELOGIO: MOV A,varDH
CJNE A,#2,REL0
MOV A,varUH
CJNE A,#3,REL0
MOV A,varDM
CJNE A,#5,REL0
MOV A,varUM
CJNE A,#9,REL0
MOV varDH,#0
MOV varUH,#0
MOV varDM,#0
MOV varUM,#0
JMP REL3
REL0: MOV A,varUM
CJNE A,#9,REL1
MOV A,#0
MOV varUM,A
MOV A,varDM
CJNE A,#5,REL2
MOV A,#0
MOV varDM,A
MOV A,varUH
CJNE A,#9,REL4
MOV A,#0
MOV varUH,A
MOV A,varDH
INC A
MOV varDH,A
JMP REL3
REL4: INC A
MOV varUH,A
JMP REL3
REL2: INC A
MOV varDM,A
JMP REL3
REL1: INC A
MOV varUM,A
REL3: RET
;******************** FUNCAO DE INCREMENTAR MINUTO *********************
INCREMENTA: DJNZ AUXINCREMENTA,FINCREMENTA
MOV A,varDH
CJNE A,#2,INC0
MOV A,varUH
CJNE A,#3,INC0
MOV A,varDM
CJNE A,#5,INC0
MOV A,varUM
CJNE A,#9,INC0
MOV varDH,#0
MOV varUH,#0
MOV varDM,#0
MOV varUM,#0
JMP INC3
INC0: MOV A,varUM
CJNE A,#9,INC1
MOV A,#0
MOV varUM,A
MOV A,varDM
CJNE A,#5,INC2
MOV A,#0
MOV varDM,A
MOV A,varUH
CJNE A,#9,INC4
MOV A,#0
MOV varUH,A
MOV A,varDH
INC A
MOV varDH,A
JMP INC3
INC4: INC A
MOV varUH,A
JMP INC3
INC2: INC A
MOV varDM,A
JMP INC3
INC1: INC A
MOV varUM,A
INC3: MOV AUXINCREMENTA,#15 ;AUXILIAR DO BTO DE INCREMENTAR MINUTOS
FINCREMENTA: RET
;******************** FUNCAO DE DECREMENTAR MINUTO *********************
DECREMENTA: DJNZ AUXDECREMENTA,FDECREMENTA
MOV A,varUM
CJNE A,#0,DEC1
MOV A,#9
MOV varUM,A
MOV A,varDM
DEC A
MOV varDM,A
JMP DEC2
DEC1: DEC A
MOV varUM,A
DEC2: MOV AUXDECREMENTA,#15 ;AUXILIAR DO BTO DE DECREMENTAR MINUTOS
FDECREMENTA: RET
;********************** FUNCAO DE INCREMENTAR HORA **********************
INCDECHORA: DJNZ AUXHORA,FINCDECHORA
MOV A,varDH
CJNE A,#2,HOR0
MOV A,varUH
CJNE A,#3,HOR0
MOV varDH,#0
MOV varUH,#0
JMP HOR3
HOR0: MOV A,varUH
CJNE A,#9,HOR4
MOV A,#0
MOV varUH,A
MOV A,varDH
INC A
MOV varDH,A
JMP HOR3
HOR4: INC A
MOV varUH,A
JMP HOR3
HOR3: MOV AUXHORA,#15 ;AUXILIAR DO BTO DE INCREMENTAR HORAS
FINCDECHORA: RET
;*********************** COLOCA O MICRO EM IDLE ************************
DORMIR: MOV PCON,#00000001B ;POE COLOCA EM IDLE (DORMIR)
RET
;********************** QUAL O VALOR DO ACUMULADOR? **********************
VALOR: INC A
MOV R7,A
DJNZ R7,PRIMEIRO
CALL ZERO
RET
PRIMEIRO: DJNZ R7,SEGUNDO
CALL HUM
RET
SEGUNDO: DJNZ R7,TERCEIRO
CALL DOIS
RET
TERCEIRO: DJNZ R7,QUARTO
CALL TRES
RET
QUARTO: DJNZ R7,QUINTO
CALL QUATRO
RET
QUINTO: DJNZ R7,SEXTO
CALL CINCO
RET
SEXTO: DJNZ R7,SETIMO
CALL SEIS
RET
SETIMO: DJNZ R7,OITAVO
CALL SETE
RET
OITAVO: DJNZ R7,NONO
CALL OITO
RET
NONO: DJNZ R7,OUTRO
CALL NOVE
OUTRO: RET
;************************* Chamadas dos Displays *************************
DezHora: SETB UM
SETB DM
SETB UH
CLR DH
RET
UniHora: SETB UM
SETB DM
CLR UH
SETB DH
RET
DezMinuto: SETB UM
CLR DM
SETB UH
SETB DH
RET
UniMinuto: CLR UM
SETB DM
SETB UH
SETB DH
RET
Limpa: SETB UM
SETB DM
SETB UH
SETB DH
RET
;************************* Chamadas dos Numeros *************************
HUM: SETB AA
CLR BB
CLR CC
CLR DD
RET
DOIS: CLR AA
SETB BB
CLR CC
CLR DD
RET
TRES: SETB AA
SETB BB
CLR CC
CLR DD
RET
QUATRO: CLR AA
CLR BB
SETB CC
CLR DD
RET
CINCO: SETB AA
CLR BB
SETB CC
CLR DD
RET
SEIS: CLR AA
SETB BB
SETB CC
CLR DD
RET
SETE: SETB AA
SETB BB
SETB CC
CLR DD
RET
OITO: CLR AA
CLR BB
CLR CC
SETB DD
RET
NOVE: SETB AA
CLR BB
CLR CC
SETB DD
RET
ZERO: CLR AA
CLR BB
CLR CC
CLR DD
RET
;************************** Teste dos Displays **************************
Teste: CALL ZERO
CALL CemMili
CALL HUm
CALL CemMili
CALL DOIS
CALL CemMili
CALL TRES
CALL CemMili
CALL QUATRO
CALL CemMili
CALL CINCO
CALL CemMili
CALL SEIS
CALL CemMili
CALL SETE
CALL CemMili
CALL OITO
CALL CemMili
CALL NOVE
CALL CemMili
RET
;*************************** Rotinas de Tempo ***************************
;t = (((R0*2)+3)*R1+3)*R2+3 - Em micro segundos para cristal de 12MHz
;***************************** 0,25 segundos ****************************
QuartoSeg: MOV R2,#120 ;1 ciclo
Loop11: MOV R1,#33 ;1 ciclo
Loop1: MOV R0,#30 ;1 ciclo
DJNZ R0, $ ;2 ciclos
DJNZ R1, Loop1 ;2 ciclos
DJNZ R2, Loop11 ;2 ciclos
RET ;2 ciclos
;***************************** 0,5 segundos *****************************
MeioSeg: MOV R2,#60 ;1 ciclo
Loop21: MOV R1,#60 ;1 ciclo
Loop2: MOV R0,#68 ;1 ciclo
DJNZ R0, $ ;2 ciclos
DJNZ R1, Loop2 ;2 ciclos
DJNZ R2, Loop21 ;2 ciclos
RET ;2 ciclos
;***************************** 1 mili-segundos **************************
OneMili: MOV R2,#36 ;1 ciclo
Loop31: MOV R1,#5 ;1 ciclo
Loop3: MOV R0,#1 ;1 ciclo
DJNZ R0, $ ;2 ciclos
DJNZ R1, Loop3 ;2 ciclos
DJNZ R2, Loop31 ;2 ciclos
RET ;2 ciclos
;***************************** 5 mili-segundos *************************
fiveMili: MOV R2,#94 ;1 ciclo
Loop41: MOV R1,#10 ;1 ciclo
Loop4: MOV R0,#1 ;1 ciclo
DJNZ R0, $ ;2 ciclos
DJNZ R1, Loop4 ;2 ciclos
DJNZ R2, Loop41 ;2 ciclos
RET ;2 ciclos
;**************************** 100 mili-segundos *************************
CemMili: MOV R2,#231 ;1 ciclo
Loop51: MOV R1,#10 ;1 ciclo
Loop5: MOV R0,#20 ;1 ciclo
DJNZ R0, $ ;2 ciclos
DJNZ R1, Loop5 ;2 ciclos
DJNZ R2, Loop51 ;2 ciclos
RET ;2 ciclos
;**************************** FIM DAS FUNCOES *****************************
END