Microcontrolador 8051 - comunicação RS232

  • Descrição:
  • Este experimento busca explorar a comunicação RS232 do 8051. Nesta demonstração, a comunicação é efetuada entre o kit e um computador, por meio do software Hyper Terminal (Software padrão do windows) cuja atalho foi criado no seu menu iniciar juntamente com os outros programas.
    Neste experimento o programa gravado no 8051 enviara continuamente o caracter “A”, sendo que a ideia é visualizarmos o dado chegando na tela do computador por meio do Hyper Terminal.

    Obs: O Baud Rate fixado nesta comunicação é de 9600bps.

    Módulos utilizados:
    • CPU-8051-USB
    Procedimento:
    1. Grave o programa do experimento na CPU-8051-USB.
    2. Não deixe nenhuma módulo conectado a nenhum port do 8051 (Nenhuma conexão)
      imagem ports
    3. Habilite o Led LD0, conforme imagem abaixo.
      imagem led LD0 habilitado
    4. Conecte o cabo RS232 fornecido junto com o kit na CPU-8051-USB, conforme imagem abaixo.
      imagem conexao
    5. Conecte a outra ponto na COM do computador.
    6. Habilite a comunicação RS232 por meio da chave S1, conforme imagem abaixo.
      Trimpot
      ORS232 Habilitado = Chave travada em baixo.
    7. Abra o Software Hyper terminal
      Imagem hyper terminal
    8. De um nome qualquer para a conexão.
      nome conexão
    9. Selecione da COM do seu computador que será usada para a comunicação.
      Imagem selecionando COM
    10. Selecione Baud Rate de 9600 e controle de fluxo = Nenhum, como na imagem abaixo e clique em OK.
      Imagem selelcionando blaud rate e controle de fluxo
    11. Pressione e solte o botão RESET da CPU-8051-USB
    12. Na tela do Hyper Terminal você verá caracteres “A” sendo recebidos a cada 0,3 segundos
      imagem do programa em execução
      Obs: A cada caracter enviado, o 8051 inverte o estado do Led LD0, sendo que o usuário consegue vê-lo piscando.
    Código Utilizado(Disponível em C ou Assembly):
    									//# EMPRESA:            ========== CONTROL CHIP ENGENHARIA ========                              #
    //# SITE:               http://www.controlchip.com.br                                            #
    //#==============================================================================================#
    //# PROGRAMADOR:        Israel Cortez                                                            #
    //# DATA DO SOFTWARE:   20/05/2009                                                               #
    //# VERSÃO ATUAL:       VR3.3                                                                    #
    //#==============================================================================================#
    //# Hardware Necessário: CPU-8051-USB                                                            #
    //#==============================================================================================#
    //# Descrição:        Envia ciclicamente o caracter (A) através da porta serial a 9600bps        #
    //#                   e a cada envio, inverte o estado do bit 0 da porta P0, sendo que isso pode #
    //#                   ser observado através do LED (LD0) na propria CPU-8051-USB                 #
    //#==============================================================================================#
    //========== INCLUDES ==========
    #include "8051.H"                //Flags do 8051
    //========== PROTITIPOS ==========
    void TIMER(unsigned char);
    //-------------------------------------------------------------
    //=========================== MAIN ============================
    //-------------------------------------------------------------
    void main (void)
    {
        IE=0;
        PCON=0;
        SCON=0x54;     //canal serial ajustado para modo assincrono
        TMOD=0x20;     //TIMER 1 no modo 2 - temporizador de 8 bits com autoreload
        PCON=0;        //NAO Dobra BAUDRATE                     
        TL1=0xFD;      //carrega taxa de transmissao
        TH1=0xFD;      //carrega taxa de transmissao
        TR1=1;         //Liga TIMER 1 p/ geração do BAUD_RATE             
        //----- Loop infinito -----
        while (1)        
        {     
            TI=0;            //Zera flag de Status de envio
            SBUF='A';
            while(TI==0);   //Espera fim da transmissão
            TIMER(100);
        }
    }
    
    //#############################################################
    //-------------------------------------------------------------
    //======================= SUB ROTINAS =========================
    //-------------------------------------------------------------
    //#############################################################
    //----------------------------------------------------------------
    //========================= TEMPORIZADOR =========================
    //----------------------------------------------------------------
    void TIMER(unsigned char TEMPO)
    {
        unsigned char CONTA1=0;
        unsigned char CONTA2=0;
        unsigned char CONTA3=0;   
        while(CONTA1<=TEMPO)
        {
            CONTA1++;
            CONTA2=0;
            while(CONTA2<=2)
            {
                CONTA2++;
                CONTA3=0;
                while(CONTA3<=90)
                {
                CONTA3++;
                }
            }   
        }   
    }
    									
    								
    									;################################################################################################
    ;# EMPRESA:            ========== CONTROL CHIP ENGENHARIA ========                              #
    ;# SITE:               http://www.controlchip.com.br                                            #
    ;#==============================================================================================#
    ;# PROGRAMADOR:        Israel Cortez                                                            #
    ;# DATA DO SOFTWARE:   20/05/2009                                                               #
    ;# VERSÃO ATUAL:       VR3.3                                                                    #
    ;#==============================================================================================#
    ;# Hardware Necessário: CPU-8051-USB                                                            #
    ;#==============================================================================================#
    ;# Descrição:        Envia ciclicamente o caracter (A) através da porta serial a 9600bps        #
    ;#                   e a cada envio, inverte o estado do bit 0 da porta P0, sendo que isso pode #
    ;#                   ser observado através do LED (LD0) na propria CPU-8051-USB                 #
    ;#==============================================================================================#
    BAUD_RATE   EQU 0FDH     ;taxa de transmissao de 9600 bps COM CLOCK DE 11.0592MHz                      
    
    ;================================================================
    ;-------------------- PARAMETRIZAÇÃO DE T1 ----------------------
    ;No 8051 o Baud Rate é gerado pelo T1
    ;VALOR_TH1 = 256 - [ (2^SMOD x freqcristal) / (32 x 12 x taxa) ]
    ;===============================================================
    ORG 0000H        
    LJMP INICIO
    ORG 03H
    RETI
    ORG 13H
    RETI
    ORG 0BH
    RETI
    ORG 1BH
    RETI
    ORG 23H
    RETI
    ORG 2BH
    RETI
    
    
    
    ORG 30H
    INICIO:
            MOV IE,#0
            MOV PCON,#0
            MOV SCON,#01010100B     ;canal serial ajustado para modo assincrono
            MOV TMOD,#20H           ;TIMER 1 no modo 2 - temporizador de 8 bits com autoreload
            MOV PCON,#0             ;NAO Dobra BAUDRATE                     
            MOV TL1,#BAUD_RATE      ;carrega taxa de transmissao
            MOV TH1,#BAUD_RATE      ;carrega taxa de transmissao
            SETB TR1                ;liga TIMER 1 p/ geração do BAUD_RATE             
    ;========================================
    ;========== PROGRAMA PRINCIPAL ==========
    ;========================================
    ENVIA:  ; ---- Envia Letra (A) ----
            MOV A,#'A'
            MOV SBUF,A              ;Envia o Caracter A
    ESPERA: JNB TI ,ESPERA          ;Aguarda termino da transmissão
            CLR TI                  ;Limpa flag TI
            CPL P0.0                ;A cada caracter enviado, inverte o estado do led 
            CALL TIMER              ;Chama temporizador
            LJMP ENVIA              ;Volta ao inicio p/ enviar A novamente
    ;===================================
    ;========= TEMPORIZADOR 1 ==========
    ;===================================
    TIMER:          MOV  R1,#200D
                    MOV  R2,#200D
    REPETE_TEMPO:   NOP                    
                    NOP
                    DJNZ R1,REPETE_TEMPO
                    MOV  R1,#200D
                    DJNZ R2,REPETE_TEMPO
                    RET                       
    END
    ;#################################################################################################################
    ;=================================================================================================================
    ;============================================= OBSERVAÇÕES GERAIS ================================================
    ;=================================================================================================================
    ;#################################################################################################################
    
    ;########################################################
    ;================== MAPA DE MEMORIA =====================
    ;########################################################
    ;==================================================================================================
    ;00h - 07h ------------------------------- R0 - R7 do banco 0   |
    ;08h - 0Fh ------------------------------- R0 - R7 do banco 1   |
    ;10h - 17h ------------------------------- R0 - R7 do banco 2   | -> Interligado a ULA
    ;18h - 1Fh ------------------------------- R0 - R7 do banco 3   |
    ;==================================================================================================
    ;20h - 2Fh ------------------------------- Uso geral            | -> endereçavel bit a bit 128 bits
    ;==================================================================================================
    ;30h - 7Fh ------------------------------- Uso Geral
    ;==================================================================================================
    
    
    ;#################################################################################################################
    ;=================================================================================================================
    ;=================================== DESCRIÇÃO DOS REGISTRADORES ENVOLVIDOS ======================================
    ;=================================================================================================================
    ;#################################################################################################################
    
    ;#############################################
    ;================== SCON =====================
    ;#############################################
    ; --- --- --- --- --- --- -- --
    ;|SM0|SM1|SM2|REN|TB8|RB8|TI|RI| 
    ; --- --- --- --- --- --- -- --
    ;  |   |   |   |   |   |  |   |________INTERRUPÇÃO POR RECEPÇÃO
    ;  |   |   |   |   |   |  |____________INTERRUPÇÃO POR TRNASMISSÃO
    ;  |   |   |   |   |   |_______________OITAVO BIT RECEBIDO
    ;  |   |   |   |   |___________________OITAVO BIT PARA A TRASMISSÃO
    ;  |   |   |   |_______________________HABILITAR RECEPÇÃO SERIAL
    ;  |   |   |___________________________COMUNICAÇÃO MULTIPROCESSADOR 
    ;  |   |_______________________________BIT 1 DO MODO
    ;  |___________________________________BIT 0 DO MODO
    
    ;|-----|----|----|--------------------------------|---------------------------------------------------------|
    ;|MODO | M0 | M1 |           DESCRIÇÃO            |          TAXA DE COMUNICAÇÃO (Baud Rate )               |
    ;|-----|----|----|--------------------------------|---------------------------------------------------------|
    ;|  0  | 0  | 0  | Transmissão Sincrona de 8 bits | Fixo = Clock/12                                         |
    ;|-----|----|----|--------------------------------|---------------------------------------------------------|
    ;|  1  | 0  | 1  | UART de 8 bits                 | Variável: definida pelo bit SMOD e pelo timer1          |
    ;|-----|----|----|--------------------------------|---------------------------------------------------------|
    ;|  2  | 1  | 0  | UART de 9 bits                 | CLOCK/64 (SMOD=0)  OU CLOCK/32 (SMOD=1) / SMOD =PCON.7  |                         
    ;|-----|----|----|--------------------------------|---------------------------------------------------------|
    ;|  3  | 1  | 1  | UART de 9 bits                 | Variável: definida pelo bit SMOD e pelo timer1          |
    ;|-----|----|----|--------------------------------|---------------------------------------------------------|
    
    
    ;#############################################
    ;=================== IE ======================
    ;#############################################
    ;--- -- -- -- --- --- --- ---
    ;|EA|--|--|ES|ET1|EX1|ET0|EX0| 
    ;--- -- -- -- --- --- --- ---
    ; |  |  |  |   |   |   |   |________HABILITA INTERRUPÇÃO EXTERNA 0
    ; |  |  |  |   |   |   |____________HABILITA INTERRUPÇÃO PELO TIMER 0
    ; |  |  |  |   |   |________________HABILITA INTERRUPÇÃO EXTERNA 1
    ; |  |  |  |   |____________________HABILITA INTERRUPÇÃO PELO TIMER 1
    ; |  |  |  |________________________HABILITA INTERRUPÇÃO SERIAL
    ; |  |  |___________________________RESERVADO
    ; |  |______________________________RESERVADO
    ; |_________________________________HABILITA A ESCOLHA DE TODAS AS INTERRUPÇÕES 
    
    
    ;#############################################
    ;================== TMOD =====================
    ;#############################################
    ; ---- --- -- -- ---- --- -- --
    ;|GATE|C/T|M1|M0|GATE|C/T|M1|M0| 
    ; ---- --- -- -- ---- --- -- --
    ;  |    |  |  |   |    |  |  |__Define o modo de operação dos Timer0/Contador0 
    ;  |    |  |  |   |    |  |_____Define o modo de operação dos Timer0/Contador0
    ;  |    |  |  |   |    |________=0: Timer0 (entrada de clock interno - fcristal/12) // =1: Contador (entrada de clock pelo pino externo TX).
    ;  |    |  |  |   |_____________=0: Timer/Contador hab sempre TR0=1 ( software) // =1:Timer/Contador habilitado pelo pino INT0 = 1 e TR0 =1 (software e hardware )
    ;  |    |  |  |_________________Define o modo de operação do Timer1/Contador1
    ;  |    |  |____________________Define o modo de operação dos Timer1/Contador1
    ;  |    |_______________________=0: Timer1 (entrada de clock interno - fcristal/12) // =1: Contador (entrada de clock pelo pino externo TX).
    ;  |____________________________=0: Timer/Contador hab sempre TR1=1 ( software) // =1:Timer/Contador habilitado pelo pino INT1 = 1 e TR1 =1 (software e hardware )
    
    
    ;-------------------------------------------------------------------------------------------------------------------------------|
    ;MODO | M1 | M0 |                                              DESCRIÇÃO                                                        |
    ;-------------------------------------------------------------------------------------------------------------------------------|
    ;  0  | 0  | 0  | Timer de 13 bits (THX8=xxxx xxxx TLX5= ***x xxxx)                                                             |
    ;-------------------------------------------------------------------------------------------------------------------------------|
    ;  1  | 0  | 1  | Timer/Contador de 16 bits (THX8 TLX8)                                                                         |  
    ;-------------------------------------------------------------------------------------------------------------------------------|
    ;  2  | 1  | 0  | Timer/Contador de 8 bits com recarga automática. (TLx é recarregado automaticamente com o valor de THx)       |
    ;-------------------------------------------------------------------------------------------------------------------------------|
    ;  3  | 1  | 1  | TL0= TIMER DE 8 BITS usando TR0 e TF0 // TH0= TIMER DE 8 BITS usando TR1 e TF1 //TIMER 1 NÃO PODERÁ SER USADO |
    ;-------------------------------------------------------------------------------------------------------------------------------|
    
    
    ;#############################################
    ;================== PCON =====================
    ;#############################################
    ; ---- ---- --- --- ---- --- --- ---
    ;|SMOD|/POR|PFW|WTR|EPFW|EWT|---|---| 
    ; ---- ---- --- --- ---- --- --- ---
    ;  |    |    |   |   |    |   |   |__RESERVADO
    ;  |    |    |   |   |    |   |______RESERVADO
    ;  |    |    |   |   |    |__________Quando =1 Habilita o RESET do TIMEOUT do WATCHDOG 
    ;  |    |    |   |   |_______________Quando =1 habilita o alarme de falha na alimentação (PFW), Quando =0 Desabilita
    ;  |    |    |   |___   _____________Quando =1 Indica que ocorreu um TIMEOUT do WATCHDOG (P/ voltar a 0 é necessária uma leitura de PCON)
    ;  |    |    |_______________________Quando =1 Indica que alimentação esta abaixo do aceitavel (P/ voltar a 0 é necessária uma leitura de PCON)
    ;  |    |____________________________Quando =0 significa que o ultimo reset foi feito numa sequencia de POWER-ON
    ;  |_________________________________Quando =1 Duplica o BAUDRATE da UART quando nos modos 1,2 ou 3
    									
    								

    VENHA TRABALHAR COM A GENTE