Microcontrolador 8051 - RS232 Envia e Recebe

  • 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 reenviara de volta qualquer informação que chegar pela serial.
    Usaremos o Hyper Terminal para enviarmos dados quaisquer, e a ideia é vermos esses dados retornarem a tela, uma vez que o 8051 reenviará de volta.

    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. Uma vez na tela do Hyper Terminal, basta começar a escrever que tudo será devolvido a tela, dando a impressão que esta escrevendo direto no Hyper Terminal.
      Vale lembrar que você não esta escrevendo direto na tela, pois o que aparece na tela é o retorno que o 8051 enviou de volta.
      Um bom teste a se fazer é no meio da escrita, desplugar o cabo RS232 do kit, que imediatamente o usuário perceberá que nada mais esta sendo escrito na tela.
      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.1                                                                    #
    //#==============================================================================================#
    //# Hardware Necessário: CPU-8051-USB                                                            #
    //#==============================================================================================#
    //# Descrição:   Quando um dado é recebido pela serial, o microcontrolador inverte o LED do kit  #
    //#              LD0 e envia de volta o mesmo dado que foi recebido.                             #
    //========== INCLUDES ==========
    //------------------------------
    #include "8051.H"                //Flags do 8051
    //========== PROTITIPOS ==========
    void TIMER(unsigned char);
    //========== VARIAVEIS DE USO GERAL ==========
    unsigned char DADO=0;
    //#############################################################
    //=========================== MAIN ============================
    //#############################################################
    void main (void)
    {    
        IE=0x90;    //Habilita interrupcoes pela Serial
        TMOD=0x20;  //Timer 1 no modo 2 (8 bits com auto recarga) usado na geração do BaudRate
        //---------- USART ----------
        SCON=0x54;  //canal serial ajustado para modo assincrono
        PCON=0;     //Não Dobra BAUDRATE mantendo em 9600bps                     
        TL1=0xFD;   //carrega taxa de transmissao p/ 9600bps
        TH1=0xFD;   //carrega taxa de transmissao p/ 9600bps
        TR1=1;      //Start Timer p/ geração do Baud Rate da Serial         
        //----- Loop infinito -----
        while (1)        
        {     
        }
    }
    
    //#############################################################
    //-------------------------------------------------------------
    //======================= SUB ROTINAS =========================
    //-------------------------------------------------------------
    //#############################################################
    void int_serial (void) interrupt 4 using 1
    {
        // ----- Verifica se Int é de RECEPÇÃO -----
        if (RI ==1) 
        {
            DADO=SBUF;      //Guarda dado Recebido pela serial
            TI=0;           //Zera flag de Status de envio
            SBUF=DADO;      //Reenvia o dado Recebido
            while(TI==0);   //Espera fim da transmissão        
            P0_0=!P0_0;     //Inverte estado do Led
            RI = 0;         //limpa pedido de interrupção de recepção 
        }
    }
    									
    								
    									;################################################################################################
    ;# EMPRESA:            ========== CONTROL CHIP ENGENHARIA ========                              #
    ;# SITE:               http://www.controlchip.com.br                                            #
    ;#==============================================================================================#
    ;# PROGRAMADOR:        Israel Cortez                                                            #
    ;# DATA DO SOFTWARE:   20/05/2009                                                               #
    ;# VERSÃO ATUAL:       VR3.1                                                                    #
    ;#==============================================================================================#
    ;# Hardware Necessário: CPU-8051-USB                                                            #
    ;#==============================================================================================#
    ;# Descrição:   Quando um dado é recebido pela serial, o microcontrolador inverte o LED do kit  #
    ;#              LD0 e envia de volta o mesmo dado que foi recebido.                             #
    ;#==============================================================================================#
    ;# Procedimento:                                                                                #
    ;# -------------                                                                                #
    ;# - Habilite o LD0 presente na placa através do Dip Switch p/ que possa visualizar o Led aceso #
    ;# - Conecte o Kit com o PC pelo cabo RS232                                                     #
    ;# - Grave este programa na CPU-8051-USB                                                        #
    ;# - Abra o software Hyper terminal e configure a COM e o BaudRate de 9600bps                   #
    ;# - Precione o botão RESET e pronto, a cada dado recebido o estado do led será invertido	#
    ;#   sendo que o mesmo dado recebido será retransmitido de volta e poderá ser visualizado       #
    ;#   no hyperterminal                                                                           #
    ;################################################################################################
    ORG     00H
    LJMP    INICIO
    ;=======================================
    ;===== TRATAMENTO DAS INTERRUPÇÕES =====
    ;=======================================
    ORG     23H
        MOV A,SBUF
        MOV SBUF,A              ;Envia de volta o que foi recebido
        ESPERA: JNB TI ,ESPERA  ;Aguarda termino da transmissão
        CLR TI                  ;Limpa flag TI
        CPL P0.0                ;Inverte estado do LED.
        CLR RI
    RETI
    ;-----------------------------------------------------
    ;================== PARAMETRIZAÇÃO ===================
    ;-----------------------------------------------------
    INICIO:
    ;---------- T0 ----------
    MOV IE,#90H    ;Habilita interrupcoes pela Serial
    MOV TMOD,#20H  ;Timer 1 no modo 2 (8 bits com auto recarga) usado na geração do BaudRate
    ;;---------- USART ----------
    MOV SCON,#54H  ;canal serial ajustado para modo assincrono
    MOV PCON,#00   ;Não Dobra BAUDRATE mantendo em 9600bps                     
    MOV TL1,#0FDH  ;carrega taxa de transmissao p/ 9600bps
    MOV TH1,#0FDH  ;carrega taxa de transmissao p/ 9600bps
    SETB    TR1    ;Start Timer p/ geração do Baud Rate da Serial  
    ;==============================
    ;===== PROGRAMA PRINCIPAL =====
    ;==============================
    LOOP_INFINITO:LJMP LOOP_INFINITO    ; Fica em loop infinito
    
    END
    
    
    ;#################################################################################################################
    ;=================================================================================================================
    ;=================================== 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 | M1 | M0 |           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