Comunicación UART para depuración en microcontrolador 8051 con terminal serie

El microcontrolador 8051 utiliza la interfaz UART para la comunicación serial, lo que permite la depuración mediante un asistente de terminal serie. Es esencial configurar los registros de control como SCON para establecer el modo de operación, TMOD para el temporizador utilizado en la generación de baudios, y PCON para ajustar la duplicación de la tasa de baudios. El temporizador 1 se emplea típicamente para la generación de baudios, y se debe deshabilitar su interrupción. Los datos se transmiten y reciben a través del registro SBUF, con los indicadores TI y RI para la finalización de operaciones, los cuales deben restablecerse manualmente en el código.

Ejemplo de código en C

#include <reg52.h>

typedef unsigned int entero_sin_signo;
typedef unsigned char caracter_sin_signo;

void retardo_ms(int milisegundos);
void EnviarByteUART(caracter_sin_signo byte);
void EnviarCadenaUART(char *cadena);

void ConfigurarUART() {
    SCON = 0x50;          // Modo 1, 8 bits, recepción habilitada
    TMOD = 0x20;          // Temporizador 1 en modo 2 (auto-reload)
    PCON = 0x00;          // Sin duplicación de baudios
    TH1 = 0xFA;           // Valor para 4800 baudios con reloj de 12MHz
    TL1 = 0xFA;
    ES = 1;               // Habilitar interrupción de UART
    EA = 1;               // Habilitar interrupciones globales
    TR1 = 1;              // Iniciar temporizador 1
}

void main() {
    ConfigurarUART();
    while (1) {
        retardo_ms(1000);
        EnviarCadenaUART("mensaje_prueba\n");
    }
}

void EnviarByteUART(caracter_sin_signo byte) {
    SBUF = byte;
    while (!TI);          // Esperar a que la transmisión se complete
    TI = 0;               // Restablecer indicador de transmisión
}

void EnviarCadenaUART(char *cadena) {
    while (*cadena) {
        EnviarByteUART(*cadena++);
    }
}

void RutinaUART() interrupt 4 {
    if (RI) {             // Verificar si se recibieron datos
        P2 = ~SBUF;       // Mostrar dato recibido en LEDs (invertido)
        EnviarByteUART(SBUF); // Reenviar dato recibido
        RI = 0;           // Restablecer indicador de recepción
    }
}

Función de retardo

#include <reg52.h>
#include <intrins.h>

void retardo_ms(int milisegundos) {
    int contador_externo, contador_interno;
    for (contador_externo = 0; contador_externo < milisegundos; contador_externo++) {
        for (contador_interno = 0; contador_interno < 120; contador_interno++) {
            _nop_();      // Ciclo de máquina para aproximadamente 1 µs a 12MHz
        }
    }
}

Para probar la comunicación, se puede utilizar un asistente de terminal serie. Al enviar datos desde el microcontrolador, se debe seleccionar la tasa de baudios correcta (4800 en este ejemplo) en el terminal. Si la tasa no coincide, los datos aparecerán ilegibles.

Ejemplo de recepción y respuesta condicional

Modificando la rutina de interrupción, se puede implementar lógica para responder a comandos específicos. Por ejemplo, si se recibe el carácter '1', el microcontrolador responde con un mensaje de confirmación.

void RutinaUART() interrupt 4 {
    if (RI) {
        if (SBUF == '1') {
            EnviarCadenaUART("CONFIRMACION_CORRECTA\n");
        }
        RI = 0;
    }
}

Etiquetas: 8051 UART microcontrolador C depuración serial

Publicado el 7-9 19:22