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;
}
}