Introducción al Proyecto
Se presenta una solución integral para la monitorización de entorno térmico utilizando la arquitectura de microcontrolador STC89C52. La interfaz principle se establece mediante comunicación serie asíncrona con una computadora externa, permitiendo gestionar las siguientes capacidades operativas:
- Captura de valores térmicos desde un sensor digital.
- Gestión activa de indicadores luminosos y señalizadores acústicos.
- Configuración remota de parámetros de alerta.
- Alternancia entre modos de operación supervisada y autónoma.
- Detección automática de desviaciones fuera de rango con activación de avisos.
Esta arquitectura abarca competencias clave en desarrollo embebido como protocolos unificilares, transmisión de datos RS-232/UART, gestión de vectores de interrupción temporal y técnicas de multiplexado visual.
Especificaciones de Hardware
Para materializar el diseño físico se requiere la siguiente selección de componentes electrónicos:
| Componente | Especificación Técnica | Cantidad |
|---|---|---|
| Procesador | MCU STC89C52RC | 1 u. |
| Sensor Térmico | Transductor Digital DS18B20 | 1 u. |
| Pantalla | Módulo de 4 dígitos, cátodo común | 1 u. |
| Indicador Visual | Diodo Emisor de Luz estándar | 2 u. |
| Alarma Sonora | Buzzer pasivo (requiere onda cuadrada) | 1 u. |
| Oscilador | Cristal de cuarzo 11.0592MHz | 1 u. |
| Conversión de Interfaz | Módulo USB a TTL (CH340) | 1 u. |
| Elemento Pasivo | Resistencia pull-up 4.7kΩ | 1 u. |
Diagrama de Interconexión Eléctrica
Interfaz con Sensor de Temperatura
La conexión del transductor DS18B20 requiere atención especial en la línea de datos para garantizar la integridad de la señal unidireccional.
| Pin Sensor | Asignación MCU |
|---|---|
| GND | Tierra comúan |
| DQ (Datos) | Puerto P3.7 (con resistencia de 4.7kΩ hacia VCC) |
| VDD | 5V DC |
Aviso Crítico: La omisión de la resistencia de carga en la línea DQ resultará en fallos de lectura sistemáticos.
Modulo de Visualización Numérica
Utilizando una configuración típica para placas educativas estándar:
- Líneas de Selección de Dígitos: Asignadas a P1.0 hasta P1.3.
- Líneas de Segmentación: Conectadas al puerto paralelo P0.
Sales de Control Actuatorial
Los periféricos de salida se configuran bajo los siguientes parámetros de voltaje lógico:
- LED Principal: Pin P2.0 (Activación en Nivel Bajo).
- Buzzer: Pin P2.1 (Requiere modulación de ancho de pulso o inversión lógica periódica).
Enlace de Comunicación Serie
La transferencia de datos se realiza cruzando las líneas TX/RX entre el microcontrolador y el adaptador USB-TTL. La configuración de trama es: 2400 bps, 8 bits de datos, sin paridad, 1 bit de parada.
Definición del Protocolo de Comunicación
Trama de Comando (Host a Dispositivo)
Cada solicitud enviada por el software superior consta de exactamente 7 bytes estructurados de la siguiente manera:
HEADER | ID_DISPOSITIVO | CODIGO_OPCION | PAR_AM1 | PAR_AM2 | CHECKSUM | FOOTER
AA | 01 | CMD_ID | ARG1 | ARG2 | SUMA | BB
| Bite Código | Funcionalidad | Param 1 | Param 2 |
|---|---|---|---|
| 0x01 | Solicitar Lectura Térmica | N/A | N/A |
| 0x02 | Acción sobre Periférico | ID Salida | Estado (0/1) |
| 0x03 | Actualizar Límites | Tope Max | Tope Min |
| 0x04 | Habilitar Modo Autónomo | N/A | N/A |
| 0x05 | Habilitar Modo Manual | N/A | N/A |
Identificador de Salida: 0x01 (Luz), 0x02 (Sonido).
Respuesta del Noddo (Dispositivo a Host)
El microcontrolador responde confirmando la acción con un formato idéntico pero con contenido de datos específico:
AA 01 CMD BYTE_ALTURA_BYTE_BAJA_CHECKSUM_BB
Estructura del Software
El código fuente se organiza en tres módulos principales para mejorar la mantenibilidad:
nucleo_principal.c: Contiene la funciónmain, inicialización de drivers y lógica central.gestor_temporal.c: Implementa rutinas de barrido visual y generación de frecuencias.definiciones_globales.h: Declaración de interfaces compartidas.
Análisis de Segmentos Críticos
Rutina de Interrupción de Entrada/Salida
El manejo de la recepción serial debe ser eficiente para evitar pérdida de paquetes.
void ISR_ReceptorSerie(void) interrupt 4 {
unsigned char dato_rx;
if (RI == 1) {
RI = 0; // Limpiar bandera de hardware
// Verificación de límites antes de escritura
if (indiceBuffer < TAMAÑO_TRAMA) {
bufferEntrada[indiceBuffer++] = SBUF;
// Verificar finalización de trama completa
if (indiceBuffer == TAMAÑO_TRAMA) {
estadoFrameRecibido = TRUE;
}
} else {
// Reseteo si se excede o error de sincronismo
indiceBuffer = 0;
}
}
}
Lectura del Transductor Termométrico
Dada la sensibilidad al tiempo del protocolo One-Wire, es imperativo suspender otras interrupciones durante la secuencia de lectura.
int leerValorTermico(void) {
int resultadoCalculado = 0;
unsigned char byteBajo, byteAlto;
// Secuencia de Inicialización de Bus
ResetBusOneWire();
EscribirByteBus(0xCC); // Skip ROM
EscribirByteBus(0x44); // Iniciar conversión
// Espera de estabilidad (aprox 750ms)
RetardoMilesimas(800);
// Protección crítica contra interrupciones
EA = 0;
ResetBusOneWire();
EscribirByteBus(0xCC);
EscribirByteBus(0xBE); // Comando Read Scratchpad
byteBajo = LeerByteBus();
byteAlto = LeerByteBus();
EA = 1; // Restaurar contexto
// Construcción de entero de 16 bits
resultadoCalculado = ((byteAlto << 8) | byteBajo);
// Ajuste a escala Celsius entera
return resultadoCalculado >> 4;
}
Gestor de Temporizador 0 (Multitarea)
Este vector maneja múltiples funciones simultáneas: actualizacion de display, tono de alarma y reloj maestro.
void ISR_TimerPrincipal(void) interrupt 1 {
static uint8_t contadorScan = 0;
static uint8_t pulsosSalpicadero = 0;
static uint16_t cuentaSegundos = 0;
// Recarga del valor (base ~200us a 11.0592MHz)
TH0 = 0xFC;
TL0 = 0x18;
// Generación de onda cuadrada para Buzzer
if (activarAlarmaSonora) {
PIN_BUZZER = !PIN_BUZZER;
}
// Lógica de Barrido de Pantalla (4x200us = 800us ciclo)
pulsosSalpicadero++;
if (pulsosSalpicadero >= 4) {
pulsosSalpicadero = 0;
MostrarDigito(contadorScan);
// Rotación de posición
contadorScan++;
if (contadorScan > 3) contadorScan = 0;
}
// Acumulador de tiempo real (cada ~20ms efectiva)
cuentaSegundos++;
if (cuentaSegundos >= 50) { // Ciclo de 1 segundo aprox
cuentaSegundos = 0;
dispararEventoPeriodico = 1;
}
}
Máquina de Estados de Comandos
La interpretación de instrucciones recibidas se delega en un bloque condicional dentro del bucle principal.
switch (bufferEntrada[2]) {
case 0x01: // Consulta Térmica
temperaturaLeida = leerValorTermico();
actualizarDisplay(temperaturaLeida);
enviarConfirmacion(0x01, temperaturaLeida);
break;
case 0x02: // Operación Periférico
manejarSalida(bufferEntrada[3], bufferEntrada[4]);
enviarConfirmacion(0x02, 0x00);
break;
case 0x03: // Ajuste Calibración
umbralSuperior = bufferEntrada[3];
umbralInferior = bufferEntrada[4];
enviarConfirmacion(0x03, 0x00);
break;
default: // Modos de Trabajo
configurarModo(bufferEntrada[2]);
enviarConfirmacion(bufferEntrada[2], 0x00);
}
Algoritmo de Regulación Automática
Se ejecuta únicamente cuando se activa la bandería de modo autónomo y transcurre el intervalo definido.
if (modoOperacion == AUTOMATICO && dispararEventoPeriodico) {
dispararEventoPeriodico = 0;
float lectActual = leerValorTermico();
// Evaluación de condiciones límite
if (lectActual > umbralSuperior) {
forzarEstadoLed(ALTO);
silenciarBuzzer(BAJO); // Alerta máxima
}
else if (lectActual < umbralInferior) {
forzarEstadoLed(ALTO);
silenciarBuzzer(ALTO); // Alerta baja
}
else {
resetearSalidas(); // Estado normal
}
}
Flujo Operacional General
- Inicialización: Arranque del sistema, configuración de pines y activación de temporizadores.
- Bucle Infinito: Ejecución continua esperando eventos.
- Evaluación de Input: Si existe un comando completo en búfer, procesar instrucción.
- Evaluación de Tiempo: Si modo es automático y tick llega a 1s, ejecutar lógica de seguridad térmica.
- Actualización UI: Mantener el display refrescado independientemente de la tarea principal.