Programa fácilmente la serie Atmel AT89 con Arduino Uno – Guía paso a paso
Componentes y suministros
- Arduino UNO × 1
- LED (genérico) × 1
Herramientas necesarias
- Soldador (genérico)
Aplicaciones y servicios en línea
- Arduino IDE
- Programador SPI 8051
Sobre el proyecto
En este tutorial te mostraré cómo grabar tu archivo Hex en un AT89C52 usando un Arduino Uno en unos sencillos pasos. Para ello, debemos interconectar el AT89C52 con el Arduino Uno y añadir indicaciones LED mediante la interfaz de un LED al AT89C52.
Paso 1: Lista de materiales
- Arduino UNO
- Microcontrolador AT89C52
- Condensador de 10 µF
- Cables de conexión (jumper wires)
- Resistencia de 8,2 kΩ
- Resistencia de 510 Ω (el original menciona «510 ohm Capacitor», pero se trata de una resistencia)
- LED
- Cristal de 12 MHz
- 2 condensadores de 33 pF
Paso 2: Conexión del microcontrolador

Conecta el microcontrolador según la siguiente tabla:
| Pin AT89C52 | Pin Arduino Uno |
|---|---|
| Pin 6 | Pin 5 |
| Pin 7 | Pin 4 |
| Pin 8 | Pin 3 |
| Pin 9 | Pin 2 |
Paso 3: Cristal

Conecta un cristal entre los pines 18 y 19 del AT89C52 y, a continuación, conecta dos condensadores de 33 pF desde cada uno de esos pines a la masa (GND) del AT89C52. Consulta la sección de esquemáticos para ver el diagrama completo del circuito.
Paso 4: VCC y GND

Conecta el pin 5V del Arduino Uno al pin 40 (VCC) del AT89C52 y el pin GND del Arduino al pin 20 (GND) del AT89C52.
Paso 5: Interfaz del LED


Interfaza el LED siguiendo el diagrama de circuito proporcionado en la sección de esquemáticos.
Paso 6: Software

Necesitas el 8051 SPI Programmer para grabar el archivo Hex en el 89C52. El enlace está disponible en la sección de software. Carga el código proporcionado en el Arduino UNO y tu programador estará listo.
Código
#define dummyData 0xAA
#define RDY 75
#define NRDY 76
const int _MISO = 4;
const int _MOSI = 5;
const int _CLK = 3;
const int RST = 2;
/* Bloque de definición de variables */
byte data;
byte AL, AH; // Dirección de 16 bits
byte lockByte; // Bits de bloqueo
byte SigH, SigL; // Bytes de firma
void setup() {
pinMode(_MISO, INPUT);
pinMode(_MOSI, OUTPUT);
pinMode(_CLK, OUTPUT);
pinMode(RST, OUTPUT);
Serial.begin(115200); // depende de la configuración del PC host
}
void loop() {
while (!Serial.available()); // espera carácter
if (Serial.available() > 0) switch (Serial.read()) {
case 'p': Serial.write(progEnable()); break;
case 'r': readProgmem(); Serial.write(data); break;
case 'a': while(!Serial.available()); AL = Serial.read(); break;
case 'A': while(!Serial.available()); AH = Serial.read(); break;
case 'd': while(!Serial.available()); data = Serial.read(); break;
case 'S': AH = 0; AL = 0; SigH = readSign(); Serial.write(SigH); break;
case 's': AH = 2; AL = 0; SigL = readSign(); Serial.write(SigL); AH = 1; AL = 0; SigL = readSign(); Serial.write(SigL); break;
case 'o': digitalWrite(RST,1); break;
case 'c': digitalWrite(RST,0); break;
case 'e': eraseChip(); Serial.write(RDY); break;
case 'j': break;
case 'w': writeProgmem(); break;
}
}
unsigned char SendSPI(unsigned char data) {
uint8_t retval = 0;
uint8_t intData = data;
int t;
for (int ctr = 0; ctr < 7; ctr++) {
if (intData & 0x80) digitalWrite(_MOSI,1); else digitalWrite(_MOSI,0);
digitalWrite(_CLK,1); delayMicroseconds(1);
t = digitalRead(_MISO);
digitalWrite(_CLK,0);
if (t) retval |= 1; else retval &= 0xFE;
retval <<= 1; intData <<= 1; delayMicroseconds(1);
}
if (intData & 0x80) digitalWrite(_MOSI,1); else digitalWrite(_MOSI,0);
digitalWrite(_CLK,1); delayMicroseconds(1);
t = digitalRead(_MISO);
digitalWrite(_CLK,0);
if (t) retval |= 1; else retval &= 0xFE;
return retval;
}
byte progEnable() {
SendSPI(0xAC); SendSPI(0x53); SendSPI(dummyData); return SendSPI(dummyData);
}
void eraseChip() {
SendSPI(0xAC); SendSPI(0x9F); SendSPI(dummyData); SendSPI(dummyData); delay(520);
}
void readProgmem() {
SendSPI(0x20); SendSPI(AH); SendSPI(AL); data = SendSPI(dummyData);
}
void writeProgmem() {
SendSPI(0x40); SendSPI(AH); SendSPI(AL); SendSPI(data);
}
void writeLockBits() {
SendSPI(0xAC); SendSPI(lockByte); SendSPI(dummyData); SendSPI(dummyData);
}
void readLockBits() {
SendSPI(0x24); SendSPI(dummyData); SendSPI(dummyData); lockByte = SendSPI(dummyData);
}
byte readSign() {
SendSPI(0x28); SendSPI(AH); SendSPI(AL); return SendSPI(dummyData);
}
Esquemáticos


Proceso de manufactura
- Programa fácilmente la serie Atmel AT89 con Arduino Uno – Guía paso a paso
- Decodifica señales PPM de receptor RC con Arduino: Guía paso a paso
- Arduino UNO + Shield WiFi: Visualización de Temperatura en Tiempo Real en Web vía Serial
- ThimbleKrox: Control de ratón montado en el dedo con Arduino Micro y MPU-6050
- Sistema de iluminación activado por movimiento con Intel Curie (Arduino 101)
- Shield de Programación Inalámbrica para Arduino con HC-05 Bluetooth – Sin Cable USB
- Sensor de Puerta Arduino: Alertas en Tiempo Real vía IFTTT (Descontinuado)
- Plotter XY Controlado por Web con Arduino y Motores Paso a Paso
- Construye una Calculadora Arduino con Pantalla LCD 16x2 y Teclado
- Luces LED Tipo Vela con Arduino: Proyecto de Iluminación Inteligente DIY
- Control de Ventilador PWM de 4 Pines a 25 kHz con Arduino Uno – Montaje, Código y Pruebas