Relógio digital com AT89s52 e displays de 7 segmentos.

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Relógio digital com AT89s52 e displays de 7 segmentos.

Mensagempor carvalhocortes » 03 Out 2010 00:22

Amigos,
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
NOT HERE, NOT ALONE
carvalhocortes
 
Mensagens: 2
Registrado em: 26 Set 2010 14:33

Mensagempor Francesco » 03 Out 2010 21:30

Meu amigo, muito bacana seu projeto! Legal por dispor para todos.
Acho que ainda tenho um código de I2C para 8051 na gaveta, vou encontrá-lo e posto para você.

Francesco
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Legal

Mensagempor jonowsky » 04 Out 2010 09:23

Parabens carvalhocortes!!

Nunca me esqueço que no inicio de um curso de eletrônica que fiz no senai (há uns 6 anos atrás) comentei com um amigo meu, que tinha muita experiencia em eletrônica, que eu ia fazer um relógio digital utilizando portas lógicas etc... O que ele me disse foi bem "motivador" -> "Cara, pega 10 pila e compra um nos camelôs!!". Mas não desisti, e fiz o bixinho :)

Parabéns amigo!!!
Avatar do usuário
jonowsky
Byte
 
Mensagens: 148
Registrado em: 26 Mai 2009 15:18
Localização: Rio Grande do Sul

Mensagempor enigmabox » 04 Out 2010 10:00

Legal Carvalhocortes,

Estou fazendo algo parecido mas é com AVR, RTC PCF8563, Sensor de umidade e temperatura I2C e display matriz de leds 32x8.
Digo que no inicio achei o I2C bem trabalhoso, mas depois de alguns testes, consegui fazer tudo funcionar.
Na maioria dos casos o protocolo de comunicação I2C segue o seguinte procedimento onde, o MCU tem que enviar o START, Endereço I2C do Periferico Slave, START , Endereço da memoria do periferico Slave, Dados, STOP. Mas entre estes comandos tem varias confirmações que podem ser feitas via HW o SW, depende do MCU e cada confimação tem um codigo que depende de quem está confirmando ou seja o Master ou o Slave.
Fiz tudo em C, mas tu fez pela linguagem de máquina que é mais trabalhoso.
Não coloquei botões, pois vou atualizar a hora via RS232. O modulo RTC PCF8563 tem uma bateria de Litium de longa duração.
Outro RTC que já usei é o DS1287, mais caro, mas tem tudo interno, com barramento multiplexado adaptável para sistema Intel ou Motorola. Este funciona bem com o 8051.
enigmabox
 

Mensagempor Sergio38br » 04 Out 2010 10:21

Sei o que é massante ficar verificando o I2C e descobrir que tendo um osciloscópio digital ajuda pacas, mas ja tentou este site...


http://www.8052.com/codelib

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor carvalhocortes » 06 Out 2010 19:50

Como sou novo aqui, e ainda não me apresentei primeiramente peço desculpas pela falta de educação ao postar sem me apresentar. E vamos lá:
Me chamo Fernando, tenho 26 anos moro em São Paulo .Sou Eng Elétrico e atualmente trabalho com Telecomunicações (procuro vaga na área de eletrônica, hehehe).
Um dos meus Hobby’s são esses pequenos projetos eletrônicos, os quais produzo da maneira mais artesanal possível. A canetinha de retroprojetor e o percloreto estão sempre sobre a minha bancada. Editores de PCB ainda são um quase mistério pra mim. kkkk
Tenho que confessar que agora meu inglês está ficando razoável, mas antes sempre encontrei muitas dificuldades com referências e projetos em português e sempre que encontrava, vinham com resalvas de ‘não funciona direito’ ou na maioria incompletos.
Já farto de ver todos perguntando como faz ou porque não funcionou, alem das muitas postagens de "AJUDA URGENTE" e nunca de uma resposta concreta de como se faz ou qual a falha real que impedia o funcionamento, estou aqui para postar meus pequenos projetos, afim de ajudar aqueles que tem menos experiência do que eu mas gostariam de construir algo.
Obrigado Francesco, jonowsky, enigmabox e Sergio38br, por prestigiarem o meu post.
Ps. Se alguém tiver algo sobre I2C e não se importe de que eu poste a solução posteriormente espero MP.

Um abraço.
NOT HERE, NOT ALONE
carvalhocortes
 
Mensagens: 2
Registrado em: 26 Set 2010 14:33

Mensagempor brasilma » 07 Out 2010 09:57

Carvalho,

Quando estiver em casa, vou te enviar minhas rotinas para isto em assembler.

São justamente para comunicar com o RTC.

A precisão e estabilidade com ele é excelente, só que usava o DS1307, vc vai precisar ver se há alguma diferença.

Conclui semana passada a montagem de um painelzão que possui dois placares para pontos e um relógio central que marca a hora ou tempo da partida, tudo controlado a distância por controle remoto - feito por hobby!!!

Os displays são aqueles grandes com digitos do tamanho de uma lata de cerveja e tensão de operação de 12V.

Abraços,
MArcos.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor jeanfernandes » 29 Nov 2010 22:00

Se nao estou enganado, o DS1302 nao é I2C. Da uma olhada nisso direito. :) Usei isso tem uns anos.

Hoje uso o RTC DS3232N que tem o oscilador interno (um TXCO), tem sensor de temperatura interno, e mecanismos de mudar umas coisas de capacitancia para melhorar o aging conforme temperatura. Esse sim é I2C.

:P
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x