Olá, galera,

Estou tentando simular o microcontrolador 8051 acionando 4 displays de 7 segmentos no Proteus, mas de modo algum eu consigo fazer com que os displays pareçam estar acionados simultaneamente. Consegui fazer um contador crescer e decrescer através de interrupções, mas os displays ficam piscando sequencialmente, mas não ficam como se estivessem acionados ao mesmo tempo. Alguém dá uma dica de como resolver? Imagem do circuito anexada.

Código usado:

TEMPO EQU    48353                                               ;define 17182us p/ cristal de 12MHz

 TEMPO2 EQU 60535                        ; define 5.000 us p/ cristal de 12MHz

 DISPLAY1 EQU 11100000B                  ;escreve no display 1

 DISPLAY2 EQU 11010000B                  ;escreve no display 2

 DISPLAY3 EQU 10110000B                  ;escreve no display 3

 DISPLAY4 EQU 01110000B                  ;escreve no display 4

 

         ORG 0000H

         LJMP INICIO

 

;##### ROTINA PARA INT0(Crescente) #####

        ORG 0003H

        MOV R6,#00H

        RETI

;##### ROTINA PARA INT1(Decrescente) #####

        ORG 0013H

        MOV R6,#01H

        RETI

         ORG 0040H

 INICIO:

         MOV IE,#85H              ;HABILITANDO INT0

         MOV TCON,#5H            ;BORDA INT0

         MOV TMOD,#11H                    ;timer0 e timer1 no modo 1

         MOV R0,#00H

         MOV R1,#00H

         MOV R2,#00H

         MOV R3,#00H

        

         MOV R6,#00H

 X:     

         LCALL CONTADOR

         LJMP X

 ;############################################################################

 ;

 ;                       Faz a contagem de 0 a 9 em cada digito incrementando

 ;

         ORG 0060H

       

CONTADOR:     

        CJNE R6,#00H,LBL1                ;Crescente 01, dec 00

        LCALL ESCREVE

        INC R0                   ; incrementa R0

        CJNE R0,#0AH,CONTADOR   ; verifica se R0 chegou em 10

        MOV R0,#00H

        INC R1

        CJNE R1,#0AH,CONTADOR

        MOV R0,#00H

        MOV R1,#00H

        INC R2

        CJNE R2,#0AH,CONTADOR

        MOV R0,#00H

        MOV R1,#00H

        MOV R2,#00H

        INC R3

        CJNE R3,#0AH,CONTADOR

        MOV R0,#00H

        MOV R1,#00H

        MOV R2,#00H

        MOV R3,#00H

        LCALL CONTADOR

        RET

 

 ;############################################################################

 ;

 ;                       Faz a contagem de 9 a 0 em cada digito decrementando

 ;

CONTADOR3:

LBL4:   DEC R3

LBL3:   DEC R2

LBL2:   DEC R1

LBL1:   CJNE R6,#01H,CONTADOR

        DEC R0

        LCALL ESCREVE                       

        CJNE R0,#00H,LBL1  

        MOV R0,#0AH

        CJNE R1,#00H,LBL2

        MOV R0,#0AH

        MOV R1,#0AH

        CJNE R2,#00H,LBL3

        MOV R0,#0AH

        MOV R1,#0AH

        MOV R2,#0AH

        CJNE R3,#00H,LBL4

        MOV R0,#0AH

        MOV R1,#09H

        MOV R2,#09H

        MOV R3,#09H

        ;LCALL ESCREVE 

        ;LCALL LBL1

        RET

 

 ;############################################################################

 ;

 ;                       Escreve os dados no PORT1

 ;

 

 ESCREVE:MOV R7,#0fh

 V2:     CLR TR1

         CLR TF1

         MOV TL1,#LOW(TEMPO2)

         MOV TH1,#HIGH(TEMPO2)

         SETB TR1

         MOV A,00H

         ORL A,#DISPLAY1        ;11100000B   escreve no display 1

         MOV P1,A

         LCALL ATRASO

         MOV A,01

         ORL A,#DISPLAY2        ;11010000B   escreve no display 2

         MOV P1,A

         LCALL ATRASO

         MOV A,02

         ORL A,#DISPLAY3        ;10110000B   escreve no display 3

         MOV P1,A

         LCALL ATRASO

         MOV A, 03

         ORL A,#DISPLAY4        ;01110000B   escreve no display 4

         MOV P1,A

         LCALL ATRASO

         JNB TF1,$

         CLR TR1

         CLR TF1

         DJNZ R7,V2

         RET

 

 ;############################################################################

 ;

 ;               Perde 17 ms

 

ATRASO:  CLR TR0

                   CLR TF0

                   MOV TL0,#LOW(TEMPO)

                   MOV TH0,#HIGH(TEMPO)

                   SETB TR0

                   JNB TF0,$

                   CLR TF0

                   RET

                   END

Exibições: 3721

Anexos

Responder esta

Respostas a este tópico

Você deve esta multiplexando os segmentos com os displays. 

Por isso fica piscando...

Obrigado, amigo pela dica! Verifiquei a possibilidade, mas foi necessário trocar o display da simulação!

Vc tem no simulador como medir a frequencia no pino que energiza o display ? deveria dar  1 pulso a cada 17ms ou pouca coisa mais.

Meu palpite é que para a apresentação não é possivel um simulador fazer na velocidade real do microcontrolador. O pulso estaria sendo gerado numa frequencia menor.

De qualquer forma minha sugestão seria rodar num protoboard. Hj com os 8051 flash serial fica mais fácil. Vide 80C8252

Ainda, uma simplificação: Se vc vai fazer o display multiplexado, ou seja: Vali ligar só 1 de cada vez, nao precisa de 1 ci de demux para cada display. Vc pode usar 1. Colocar os displays em paralelo depois do CI.

Concordo com a idéia de colocar os displays em paralelo, mas esse ci 4511 é um conversor BCD para 7 segmentos (evita mapear os pinos para segmentos).

De fato, nenhum integrado é preciso... Vc pode usar o microcontrolador pra gerar os pulsos corretamente.

Em função da saída do 8051 ser normalmente só dreno de corrente (transistor ao GND) pode ser preciso um transistor no pino comum (Anodo) para correto funcionamento, mas só o microcontrolador basta.

Retificando a informação que passei anteriormente, são exemplos de 8051 que facilmente podem ser ligados em protoboard pq podem ser gravados pela serial (de forma similar a um arduino, só que com o programa adequado:

Da atmel (o 80C8252 na verdade se chamava 89S8252 e saiu de linha para dar lugar ao 89S8253).

http://www.atmel.com/products/microcontrollers/8051Architecture/fla...

Da NXP (Philips):

Todos 89LCPxxx

Ex:

 http://www.nxp.com/documents/data_sheet/P89LPC933_934_935_936.pdf

Mas o uso em protoboard fica limitado em função da indisponibilidade de versões DIP (só tem SMD).

Exemplos de ligação sem integrados externos podem ser encontrados em:

https://www.google.com.br/search?#q=8051+7+segments+circuit&tbm...

O projeto era somente para ser simulado, não era necessário montar de fato o circuito. Verifiquei as dicas e observações, fiz algumas mudanças como a redução no número de ci's necessários. O problema continuou, fizemos uma alteração no display usado na simulação, então funcionou corretamente.

Muito obrigado a todos pela colaboração, com certeza levarei os conselhos daqui para outras situações!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço