Cronometro com 89S8253

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Cronometro com 89S8253

Mensagempor Renato Nogueira » 22 Dez 2009 15:47

Olá.

Quero fazer um cronometro que vai de 1s a 5min. Com três displays de 7S. Mas decrescente.

Mas da forma que estou pensando, o programa vai ficar muito grande e confuso.

Pretendo fazer o seguinte: Serão 3 displays de 7S com uma micro chave tactil embaixo de cada um dos displays. Tipo, vamos supor que a chave do display que representa 8s(que é o primeiro da direita para esquerda) seja pressionada, então esse display passará para 9s e se for pressionado mais uma vez, passará para 0 e o segundo display a sua esquerda, continuaria em 0. Portanto, se eu quiser um cronometro decrescente de 10s, eu terei que deixar o primeiro display em 0 e o segundo em 1. E se quiser 1:10s, eu deixaria o terceiro display em 1, o segundo em 1 e o primeiro em 0, perfazendo 1min e 10s. Entenderam? rs

O problema é, como desenvolver uma lógica pra isso. De inicio eu estou tentando fazer com apenas um display para ficar mais simples, depois eu implemento os outros dois.
Renato Nogueira
Bit
 
Mensagens: 36
Registrado em: 13 Dez 2006 15:39

Mensagempor Renato Nogueira » 22 Dez 2009 15:56

Vou escrever o programinha da forma que estou pensando e depois volto aqui.

Ah, a base de tempo de 1s eu farei com o timer 0" ou "1". Eu carrego o timer para fazer uma contagem de 50000, fazendo isso duas vezes com um clock de 12MHz, eu terei 1s. Então se eu programar o cronometro para 8s, bastaria eu fazer essa rotina 16x. Agora o problema é que eu vou ter que ler os digitos que estão no display para saber quantos segundos serão, interpretá los e em seguida quando for pressionado uma outra chave, começar a decrementar 8s e a cada segundo decrementado ir mostrando no display. Ex: 7s, 6s, 5s...

Alguém poderia me dar uma luz de como pensar esse problema. Eu não quero que escrevam um código, quero apenas que me deem uma idéia de pelo menos como começar.

Abraços!
Renato Nogueira
Bit
 
Mensagens: 36
Registrado em: 13 Dez 2006 15:39

Mensagempor xultz » 22 Dez 2009 16:12

Eu não entendi direito qual parte você está com mais dificuldade do teu código. E se possível coloca aqui o diagrama, facilita muito.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor Djalma Toledo Rodrigues » 22 Dez 2009 16:40

Antes que pensar em Programa, µC , etc

Se pergunte como uma pessoa faria isso ?

Dicas:
< -------->O Sistema Decimal é claro essa pessoa conhece
< -------->O Sistema Binário é muito provável
< -------->O Sistema Hexadecimal idem

< -------->O Sistema Sexagesimal ?


DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor daniellp » 25 Jan 2010 20:39

dá uma olhada nisso aqui... acho que é o que vc. está procurando...

http://www.8051projects.info/proj.asp?ID=61
daniellp
Byte
 
Mensagens: 159
Registrado em: 15 Out 2006 11:10
Localização: Curitiba - PR

Mensagempor veioloko » 05 Fev 2010 15:36

Use uma variavel para alocar o valor decrito no display em segundos

por ter 3 displays o tempo maximo seria
9 minutos e 99 segundos?
converta pra segundos: 639 segundos

faça uma logica em cima dessa variavel
não se importe com o valor mostrado no display....trabalhe com a variavel
veioloko
Byte
 
Mensagens: 348
Registrado em: 10 Nov 2006 06:01
Localização: São Bernardo do Campo

Mensagempor Renato Nogueira » 06 Abr 2010 21:57

Obrigado pelas dicas....

Escrevi o seguinte código em ASM. Através de duas chaves (C_1 e C_2) você configura dois displays. E quando programar o tempo que deseja decrementar, basta apertar a CHAVE_C que o relógio começará a decrementar. Só que por enquanto ele decrementa "internamente" sem mostrar no visor ex: 42, 41, 40... ou seja, se você programar o tempo de 10s, quando for apertada a chave COMEÇA o relógio começará a decrementar e continuará mostrando o tempo 10s até o final, quando aparecerá no display 2 a letra "F" de FIM.

O programa está com a data de janeiro, mas voltei a trabalhar nele ontem.

Segue o programa:

; ---------------- RENATO NOGUEIRA -------------
; PROGRAMA: Cronometro decrescente de 59 / 00s |
; MICRO: 89S52 - 12MHz |
; DATA: 09/01/10 |
; ----------------------------------------------
;
;
;=============================== DECLARACAO DE EQUS ===============================

ORG 00H

D_1 EQU P1
D_2 EQU P2

CHAVE_1 EQU P3.1
CHAVE_2 EQU P3.2
CHAVE_C EQU P3.6


;=============================== INICIO DO PROGRAMA ===============================

INICIO: MOV DPTR, #TABELA_1
MOV R1, #0
MOV A, R1
MOVC A, @A+DPTR
MOV D_1, A
MOV DPTR, #TABELA_2
MOV R2, #0
MOV A,R2
MOVC A, @A+DPTR
MOV D_2,A
MOV R4, #0


;=============================== LEITURA DA CHAVE_1 ===============================

LER_CHAVE_1: JB CHAVE_1, LER_CHAVE_2
INC R1
MOV A, R1
MOV DPTR, #TABELA_1
MOVC A, @A+DPTR
MOV D_1, A
JNB CHAVE_1, $
CJNE R1, #10, LER_CHAVE_2
MOV R1, #0


;=============================== LEITURA DA CHAVE_2 ===============================

LER_CHAVE_2: JB CHAVE_2, LER_CHAVE_C
INC R2
MOV A, R2
MOV DPTR, #TABELA_2
MOVC A, @A+DPTR
MOV D_2, A
JNB CHAVE_2, $
CJNE R2, #7, LER_CHAVE_C
MOV R2, #0


;=============================== LEITURA DA CHAVE_C ===============================


LER_CHAVE_C: JB CHAVE_C, LER_CHAVE_1
MOV A, R2
MOV B, #10
MUL AB
MOV B, R1
ADD A, B
JNB CHAVE_C, $



;===================================== COMECA =====================================

COMECA: INC R4
MOV 30H, R4
CJNE A, 30H, COMECA
DECREMENTA: ACALL TEMPO
DJNZ R4, DECREMENTA
MOV D_2, #1110001B ; MOSTRA UM "F"



;================================= FIM DO PROGRAMA ================================

FIM: AJMP FIM

;================================== ROTINA DE 1S ==================================

TEMPO: MOV R7, #16
TT_1S: MOV TMOD, #00000001B
MOV TH0, #HIGH(15000-65000)
MOV TL0, #LOW(15000-65000)
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
DJNZ R7, TT_1S
RET


;==================================== TABELAS =====================================
TABELA_1:
DB 0111111B ; 0
DB 0000110B ; 1
DB 1011011B ; 2
DB 1001111B ; 3
DB 1100110B ; 4
DB 1101101B ; 5
DB 1111101B ; 6
DB 0000111B ; 7
DB 1111111B ; 8
DB 1100111B ; 9
DB 0111111B ; 0


TABELA_2:
DB 0111111B ; 0
DB 0000110B ; 1
DB 1011011B ; 2
DB 1001111B ; 3
DB 1100110B ; 4
DB 1101101B ; 5
DB 1111101B ; 6
DB 0111111B ; 0



END


---------------------

A minha primeira pergunta é a respeito do tempo de 1 segundo. No caso R7 deveria ser carregado com 20, mas quando faço isso dá um erro de 8/10 segundos quando comparado com o relógio do computador.

Ainda não testei o programa no hardware.

Depois eu posto a foto do esquema no proteus e um outro programa, mas desta vez mostrando o decremento. Tenho uma dúvida nele também! :lol:
Renato Nogueira
Bit
 
Mensagens: 36
Registrado em: 13 Dez 2006 15:39

Mensagempor Silvio51 » 28 Jun 2010 14:17

MOV TH0, #HIGH(15000-65000)
MOV TL0, #LOW(15000-65000)


15000-65000 ?

Geralmente se faz assim:

TEMPO EQU 15535 ; Base de tempo de 50.000us com 12MHz

MOV TH0,#HIGH(TEMPO)
MOV TL0,#LOW(TEMPO)

Daí entäo vocë carrega R7 com 20 (20 x 50.000us = 1s) e pronto...
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil


Voltar para 8051

Quem está online

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

x