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.

El circuito mínimo que necesita un 8051 para funcionar. Un bloque de chip AT89S52 muestra seis pines: el pin VCC 40 cableado al raíl de cinco voltios y el pin GND 20 a masa; el pin EA 31 cableado al raíl de cinco voltios en rojo, anotando que hay que unir EA a alto o el chip no ejecuta nada; los pines XTAL2 18 y XTAL1 19 en paralelo con un cristal de 11.0592 MHz, con un condensador de 33 picofaradios de cada pata del cristal a masa; y el pin RST 9 cableado a un condensador de 10 microfaradios que sube al raíl de cinco voltios y una resistencia de 10 kiloohmios que baja a masa, anotando que el reset es activo a nivel ALTO.
Todo lo que un 8051 necesita antes de ejecutar una sola instrucción. EA a +5 V es lo que detiene en silencio una primera placa antes de que arranque. Descargar SVG
Patillaje del 8051 en su encapsulado DIP de 40 pines, dibujado en vertical con la muesca del pin 1 arriba. La columna izquierda recorre los pines 1 a 20: los pines del puerto 1 P1.0 a P1.7 con sus funciones alternativas T2, T2EX, MOSI, MISO y SCK, luego RST, luego los pines del puerto 3 P3.0 a P3.7 etiquetados RXD, TXD, INT0, INT1, T0, T1, WR y RD, y luego XTAL2, XTAL1 y GND. La columna derecha recorre los pines 40 a 21: VCC, los pines del puerto 0 P0.0 a P0.7 que hacen doble función como AD0 a AD7, luego EA, ALE y PSEN, y los pines del puerto 2 P2.7 a P2.0 que hacen doble función como líneas de dirección A15 a A8. Un código de color separa los puertos de E/S, las funciones alternativas del puerto 3, los pines de reloj y control, y la alimentación.
El DIP de 40 pines. Fíjate en que el puerto 0 va al revés: el pin 32 es P0.7 y el pin 39 es P0.0, y en que las segundas etiquetas del puerto 3 son los pines de serie, de interrupción y de temporizador. Descargar SVG

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 0 los 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

Referencias