Componente · Controlador
8051 Microcontroller
El microcontrolador de 8 bits con arquitectura Harvard: 256 bytes de RAM, puertos cuasi-bidireccionales y temporización exacta en ciclos de máquina.
Qué es
El 8051 no es una placa ni, realmente, un chip concreto: es una arquitectura. Intel la publicó en 1980 y después licenció el núcleo tan ampliamente que la pieza que compras hoy viene de otro. En un kit de laboratorio eso es casi siempre el AT89S52 de Atmel: un núcleo 8051 con 8 KB de flash, 256 bytes de RAM, tres temporizadores y programación en sistema por cuatro pines.
Lo que llega es un DIP de 40 pines y nada más. Sin USB, sin regulador, sin bootloader, sin
pinMode(). Antes de ejecutar una sola instrucción tienes que darle un cristal, dos condensadores
de carga, una red de reset y una conexión de EA a +5 V. esa desnudez es toda la razón por la que
sigue en el temario: no hay ninguna capa entre tu código y el silicio que te sirva para descartar
un comportamiento que no entiendes.
Cómo funciona
El 8051 es una máquina Harvard: la memoria de programa y la de datos son espacios de direccionamiento separados, alcanzados por instrucciones distintas. El código vive en la flash; las variables viven en 256 bytes de RAM interna que a su vez se dividen en cuatro bancos de registros, una ventana direccionable por bits y lo que quede para tu pila.
Los tiempos son inusualmente fáciles de razonar. Un ciclo máquina son doce periodos del oscilador, y la mayoría de las instrucciones tardan uno o dos. A 11,0592 MHz eso es 1,085 µs por ciclo, así que puedes contar instrucciones y saber —no estimar— cuánto tarda un bucle. Muy pocas piezas modernas te permiten eso.
Los 32 pines de E/S se agrupan en cuatro puertos con personalidades distintas:
- P1 es el único sencillo: ocho pines de uso general con pull-ups internos.
- P3 duplica cada pin con una función alternativa: el RXD/TXD de serie, las dos interrupciones externas, las dos entradas de temporizador y los pulsos de lectura y escritura de memoria externa.
- P2 transporta el byte alto de dirección cuando hay memoria externa conectada.
- P0 es open-drain. Sin resistencias de pull-up externas no puede sacar un nivel lógico alto, y además transporta el byte multiplexado de dirección baja y datos.
Lo que el chip no tiene importa igual: ni entradas analógicas ni hardware PWM. Leer la tensión de un sensor necesita un ADC externo, y variar la velocidad de un motor significa generar la forma de onda tú mismo desde una interrupción de temporizador.
Cuándo usarlo
Recurre al 8051 cuando lo que busca es aprender la máquina: una asignatura de
microcontroladores, un miniproyecto universitario, o tu propia curiosidad por lo que hace de
verdad analogWrite(). Escribir un generador de PWM por software enseña más en una tarde que un
año llamando a una biblioteca que lo esconde.
Elige casi cualquier otra cosa cuando lo que importa es el robot. Un Arduino Uno te da PWM por hardware, entradas analógicas y una biblioteca para cada sensor que vayas a encontrar; un ESP32 añade Wi-Fi y mucha más memoria. Ambos cuestan más o menos lo mismo que una placa de desarrollo de 8051. Elegir el 8051 para un proyecto que tiene que funcionar en lugar de enseñar significa reconstruir a mano cosas que las alternativas te dan gratis.
Errores comunes
- EA debe estar unido a +5 V. El pin 31 selecciona memoria de programa interna o externa. Al aire o a masa, el chip busca en silencio en una memoria externa que no está ahí y no hace absolutamente nada: sin error, sin luz, sin pista. Esta es la razón más habitual de que una primera placa con 8051 parezca muerta.
- El reset es activo a nivel ALTO. A diferencia de casi todos los demás microcontroladores que conocerás, el 8051 se reinicia cuando RST se lleva hacia arriba. El circuito estándar de encendido es un condensador de 10 µF de +5 V a RST y una resistencia de 10 kΩ de RST a masa.
- El puerto 0 necesita pull-ups externos. Es open-drain. Conecta resistencias de 10 kΩ a +5 V o nunca podrá leer ni generar un alto.
- Los pines drenan, no sourcing. El pull-up interno suministra solo decenas de
microamperios, mientras que el transistor de bajada drena miliamperios. Los LEDs van del ánodo a
la alimentación y del cátodo al pin, y un
0los enciende. Cablearlos al revés produce un resplandor muy tenue y mucha confusión. - La pila empieza en 08h, encima del banco de registros 1. El puntero de pila se reinicia a 07h. Si cambias al banco 1 sin mover antes SP, tus registros y tus direcciones de retorno ocupan los mismos bytes.
Por qué 11,0592 MHz, de todos los números posibles
Esa frecuencia de cristal parece arbitraria y es una de las decisiones más deliberadas de toda la arquitectura.
El 8051 genera su velocidad de baudios serie desbordando el Timer 1 en modo 8 de recarga automática de 8 bits:
baud = (2^SMOD / 32) x (oscillator / 12) / (256 - TH1)
Con SMOD = 0 y un cristal de 11,0592 MHz, apuntando a 9600 baudios:
TH1 = 256 - (11059200 / (12 x 32 x 9600)) = 256 - 3 = 253 = 0xFD
Exactamente 3. Sin redondeo, sin error. Todas las velocidades de baudios estándar —1200, 2400, 4800, 9600, 19200— dan un número entero de recargas de temporizador.
Ahora prueba con un cristal redondo de 12 MHz:
TH1 = 256 - (12000000 / 3686400) = 256 - 3.26 -> must round to 3
actual baud = 10417, against a target of 9600 -> 8.5% error
Un enlace serie tolera alrededor de un 2–3 % de error total entre los dos extremos. Con un 8,5 % el encuadre se desvía dentro de un byte y cada carácter llega corrupto. Por eso existe 11,0592 MHz, por eso está en todas las placas de laboratorio con 8051, y por eso sustituir el cristal de 12 MHz del cajón produce un chip que funciona perfectamente hasta que intentas imprimir algo.
El intercambio es que la aritmética de tiempos se vuelve incómoda: un ciclo máquina es de 1,085 µs en lugar de un redondo 1 µs. Un cristal de 12 MHz da ciclos de exactamente 1 µs y una serie inservible. Elige según cuál de las dos cosas necesite tu proyecto.
Temporizadores, y generar PWM a mano
El 8051 tiene tres temporizadores de 16 bits y ningún hardware PWM. Variar la velocidad de un motor significa generar la forma de onda tú mismo, y hacerlo es lo mejor que tiene aprender en este chip.
Los temporizadores tienen cuatro modos; dos importan:
| Modo | Amplitud | Recarga | Úsalo para |
|---|---|---|---|
| 0 | 13 bits | Manual | Heredado; ignóralo |
| 1 | 16 bits | Manual | Retardos largos y precisos. Hay que recargar en la ISR |
| 2 | 8 bits | Automática | Velocidades de baudios y cualquier tick de periodo fijo |
| 3 | T0 dividido | — | Cuando necesitas un tercer temporizador a toda costa |
El modo 2 es al que hay que recurrir cuando quieras un tick constante, porque la recarga ocurre en hardware y no se cuela vibración de la ISR en el periodo.
Un generador de PWM por software sobre el Timer 0, a unos 1 kHz con 100 pasos de resolución:
#include <reg52.h>
sbit MOTOR_L = P1^0;
sbit MOTOR_R = P1^1;
volatile unsigned char dutyL = 0, dutyR = 0; // 0..99
volatile unsigned char tick = 0;
void timer0_isr(void) interrupt 1 {
/* Mode 1 is not self-reloading: put the value back first, before
anything else, or the period stretches by the ISR's own length. */
TH0 = 0xFF; TL0 = 0xA4; /* ~10 us at 11.0592 MHz */
if (++tick >= 100) tick = 0; /* 100 ticks = ~1 ms period */
MOTOR_L = (tick < dutyL) ? 1 : 0;
MOTOR_R = (tick < dutyR) ? 1 : 0;
}
void main(void) {
TMOD = (TMOD & 0xF0) | 0x01; /* Timer 0, mode 1 */
TH0 = 0xFF; TL0 = 0xA4;
ET0 = 1; /* enable timer 0 interrupt */
EA = 1; /* global interrupt enable */
TR0 = 1; /* start */
dutyL = 70; dutyR = 70;
while (1) { } /* PWM runs entirely in the ISR */
}
Dos cosas que conviene llevarse de ahí. Recarga siempre primero: en el modo 1 el temporizador sigue contando desde cero tras el desbordamiento, así que cada instrucción ejecutada antes de la recarga se suma al siguiente periodo. Y el coste es real: esta ISR se dispara 100 000 veces por segundo, y a 1,085 µs por ciclo máquina un manejador de doce instrucciones consume una porción notable de todo lo que el chip puede hacer. Ese presupuesto es exactamente lo que te compra un periférico de PWM por hardware, y no lo aprecias hasta que lo has pagado a mano.
El presupuesto de corriente de los puertos
Esto pilla a la gente porque los puertos del 8051 son asimétricos de una manera que las piezas modernas no lo son.
| Drena (salida LOW) | Suministra (salida HIGH) | |
|---|---|---|
| Por pin, P1/P2/P3 | ~10 mA | ~60 µA (solo el pull-up interno) |
| Por pin, P0 | ~10 mA | 0: open drain, sin pull-up alguno |
| Por puerto, total | ~26 mA | — |
| Todo el chip | ~71 mA | — |
Sesenta microamperios no es una errata. El pull-up interno es una resistencia débil, no un etapa de salida, así que un pin que saca HIGH puede suministrar más o menos una milésima parte de lo que drena.
De ahí se siguen tres consecuencias directamente:
Los LEDs van del cátodo al pin, del ánodo a través de una resistencia a +5 V, y escribir 0 los
enciende. Cableados al revés brillan muy tenuemente, lo que se lee como un LED atenuado o
defectuoso en lugar de como un malentendido.
Nunca excites nada directamente. Ni un relé, ni un zumbador a volumen, ni un motor. Usa un transistor, una matriz de drivers ULN2003, o un controlador de motores como es debido.
El puerto 0 necesita pull-ups externos: 10 kΩ a +5 V en cada pin que quieras usar como E/S. Sin ellos no puede sacar un alto ni leer uno con fiabilidad, y es el puerto que la mayoría de placas de laboratorio lleva a la LCD.
Memoria, y dónde se van los 256 bytes
Ocho kilobytes de flash suenan ajustados y rara vez lo son. 256 bytes de RAM son la restricción real, y no son 256 bytes planos:
| Dirección | Tamaño | Qué vive ahí |
|---|---|---|
| 00h–1Fh | 32 bytes | Cuatro bancos de registros, R0–R7 cada uno |
| 20h–2Fh | 16 bytes | Direccionable por bits: 128 bits direccionables individualmente |
| 30h–7Fh | 80 bytes | Memoria temporal general, y donde suele ir la pila |
| 80h–FFh | 128 bytes | Solo direccionamiento indirecto (los SFR ocupan el espacio directo) |
El puntero de pila se reinicia a 07h, lo que coloca la pila justo encima del banco de
registros 1. Si cambias al banco 1 sin mover antes SP, tus registros y tus direcciones de retorno
comparten bytes, y el fallo es espectacular: el programa vuelve a una dirección aleatoria.
SP = 0x30; como primera línea de main() es práctica habitual.
La región direccionable por bits merece pena porque es realmente elegante. Cualquier bit de 20h–2Fh se puede activar, borrar o comprobar en una sola instrucción, lo que hace que las banderas de estado sean gratis:
bit lineDetected; /* the compiler allocates this in 20h-2Fh */
bit motorEnabled; /* one bit each, one instruction to test */
Ocho de esas cosas ocupan un byte, y comprobar una es un solo ciclo máquina. En un chip con 256 bytes de RAM eso importa.
Resolución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
| El chip no hace absolutamente nada | EA al aire o a masa |
Une el pin 31 a +5 V. Comprueba esto primero, siempre |
El chip no hace nada, EA está en alto |
No hay oscilación del cristal | Comprueba los condensadores de carga de 33 pF y las soldaduras del cristal |
| Se reinicia constantemente | RST mantenido en alto | Aquí el reset es activo a nivel ALTO: comprueba la red de 10 µF / 10 kΩ |
| El puerto 0 no lee ni escribe nada | Open drain, sin pull-ups | 10 kΩ de cada pin a +5 V |
| LED muy tenue | Cableado para suministrar corriente | Cátodo al pin; escribe 0 para encenderlo |
| El serie imprime basura | Cristal de 12 MHz | Usa 11,0592 MHz: 12 MHz da un 8,5 % de error de baudios |
| El serie funciona solo en un sentido | TX/RX sin cruzar, o sin masa común | Crúzalos; une las masas |
| El programa vuelve a ninguna parte | La pila se solapa con el banco de registros 1 | SP = 0x30; al principio de main() |
| El periodo del PWM vibra | Recargando el temporizador tarde en la ISR | Recarga como primera instrucción, o usa el modo 2 |
| Comportamiento errático al crecer el código | Sin RAM | 256 bytes en total; revisa el mapa del enlazador |
| El programador no ve el chip | Pines ISP ocupados, o sin control de reset | Libera P1.5–P1.7 y RST durante la programación |
¿8051 o un microcontrolador moderno?
| 8051 (AT89S52) | Arduino Uno | ESP32 | |
|---|---|---|---|
| Flash / RAM | 8 KB / 256 B | 32 KB / 2 KB | 4 MB / 520 KB |
| PWM por hardware | Ninguno | 6 canales | 16 canales |
| Entrada analógica | Ninguna | 6 × 10 bits | 18 × 12 bits |
| Baudios del serie | Necesita el cristal correcto | Cualquiera | Cualquiera |
| Bibliotecas | Escríbelas tú | Miles | Miles |
| Lo que aprendes | La máquina | El proyecto | El sistema |
La posición honesta: el 8051 es una pieza de enseñanza, y una excelente. Escribir un generador de PWM por software, calcular a mano una recarga de baudios y descubrir que un pin de puerto no puede suministrar corriente te enseña qué están haciendo realmente por ti todos los periféricos modernos. Ese entendimiento se traslada de forma permanente, y es la razón por la que la arquitectura sigue en los temarios cuarenta y cinco años después de que Intel la publicara.
Para un robot que tiene que funcionar, elige casi cualquier otra cosa. Construir un seguidor de línea con 8051 significa escribir el PWM, añadir un ADC externo o usar sensores con salida de comparador, y calcular a mano todas las constantes de tiempo, todo lo cual te da un Uno por el mismo dinero. Hazlo cuando lo que importa es entender la máquina. Recurre a un Uno cuando lo que importa es el robot.
Explora el grafo
Se usa en estos montajes
Proyectos, rutas de aprendizaje y simuladores que incluyen 8051 Microcontroller.
Comparar
Alternativas
Preguntas
Preguntas frecuentes sobre 8051 Microcontroller
¿Qué es el microcontrolador 8051?
El 8051 es una arquitectura de microcontrolador de 8 bits que Intel presentó en 1980 y que después licenció ampliamente, así que hoy lo compras como un chip compatible, por ejemplo el AT89S52 de Atmel, y no como una pieza de Intel. Reúne una CPU, memoria flash, RAM, temporizadores, un puerto serie y 32 pines de E/S en un solo chip de 40 pines, y sigue siendo el microcontrolador de referencia para la enseñanza en la mayoría de los planes de estudios de ingeniería.
¿Por qué se sigue enseñando el 8051 si es de 1980?
Porque no se te oculta nada. No hay biblioteca base, ni abstracción de placa, ni PWM por hardware: para hacer parpadear un LED pones a uno un bit en un registro de puerto, y para atenuarlo escribes tú mismo una interrupción de temporizador que cuenta ticks. Eso lo convierte en una mala elección para sacar un producto y en una excelente para entender lo que cualquier otro microcontrolador hace por ti.
¿Qué diferencia hay entre el 8051 y un Arduino?
Un Arduino Uno es una placa construida en torno a un ATmega328P; el 8051 es un chip desnudo que tienes que rodear de un cristal, un circuito de reset y un programador. El Arduino te da PWM por hardware, entradas analógicas, un bootloader USB y un enorme ecosistema de bibliotecas. El 8051 no te da nada de eso —no tiene ni ADC ni PWM—, y precisamente por eso los cursos lo usan para enseñar los fundamentos.
¿Por qué el 8051 usa un cristal de 11.0592 MHz?
Porque hace exactas las velocidades en baudios del puerto serie. La UART divide el reloj del ciclo de máquina, y 11.0592 MHz se divide hasta dar exactamente 9600 baudios, mientras que un cristal redondo de 12 MHz se desvía alrededor de un 8.5% y corrompe los datos serie. Ese número de aspecto raro se elige por aritmética, no por velocidad.
¿Cuántos puertos tiene el 8051?
Cuatro puertos de 8 bits —P0, P1, P2 y P3—, con 32 pines de E/S en total. No son intercambiables: P0 no tiene resistencias pull-up internas y necesita resistencias externas, P3 lleva los pines de serie, de interrupción y de temporizador como funciones alternativas, y P0 y P2 hacen de bus de direcciones y datos si conectas memoria externa.
¿Por qué mi programa del 8051 no hace nada después de grabarlo?
Comprueba primero el pin EA (pin 31). Si está unido a masa o al aire, el chip busca su programa en una memoria externa que no existe, así que no ejecuta nada y no da ningún error. EA debe conectarse a +5 V para ejecutar el código desde la flash interna. Los dos siguientes sospechosos son la falta de un circuito de reset y los dos condensadores de carga del cristal.
¿Se puede programar el 8051 en C?
Sí, y hoy la mayoría de los cursos lo hacen. Keil C51 es el compilador estándar de la industria y SDCC es una alternativa libre y de código abierto. Aquí C es mucho más productivo que el ensamblador, pero el 8051 premia saber qué genera el compilador: una multiplicación de aspecto inocente o un array local grande cuestan mucho más en un chip con 256 bytes de RAM que en cualquier otro sitio.
¿Se sigue usando el 8051 en productos reales?
Sí, aunque rara vez como chip independiente a la vista. Hay núcleos compatibles con el 8051 integrados en innumerables dispositivos —controladores USB, sensores táctiles, mandos a distancia y módulos de radio— porque el núcleo es diminuto, bien conocido y no da problemas de licencias. Te lo encontrarás mucho más a menudo como un bloque dentro de otro chip que como el DIP de 40 pines de tu mesa de laboratorio.
Lecturas adicionales