Programe Facilmente a Série Atmel AT89 com Arduino Uno – Guia Passo a Passo
Componentes e Materiais
- 1x Arduino UNO
- 1x Microcontrolador AT89C52
- 1x Capacitor 10µF
- Fios jumper
- 1x Resistor 8,2kΩ
- 1x Resistor 510Ω (observação: o original menciona "510 ohm Capacitor", mas deve ser resistor)
- 1x LED
- 1x Cristal 12 MHz
- 2x Capacitores 33pF
Ferramentas Necessárias
- Ferro de solda
Software e Serviços Online
- Arduino IDE
- Programador SPI 8051 (software para gravar o arquivo .hex)
Sobre o Projeto
Neste tutorial, mostro como gravar seu arquivo .hex no AT89C52 usando um Arduino Uno em poucos passos simples. Para isso, faremos a interface do AT89C52 com o Arduino Uno e adicionaremos indicação via LED conectado ao AT89C52.
Passo 1: Lista de Materiais (BOM)
Todos os componentes estão listados na seção "Componentes e Materiais" acima.
Passo 2: Conexão do Microcontrolador
Conecte o microcontrolador conforme a tabela abaixo:
| Pino AT89C52 | Pino Arduino Uno |
|---|---|
| Pino 6 | Pino 5 |
| Pino 7 | Pino 4 |
| Pino 8 | Pino 3 |
| Pino 9 | Pino 2 |
Consulte a seção Esquemáticos para o diagrama completo do circuito.
Passo 3: Cristal Oscilador
Conecte um cristal de 12 MHz entre os pinos 18 e 19 do AT89C52. Em seguida, conecte dois capacitores de 33pF: um do pino 18 ao GND e outro do pino 19 ao GND do AT89C52.
Passo 4: Alimentação (VCC e GND)
Conecte o pino 5V do Arduino Uno ao pino 40 (VCC) do AT89C52 e o pino GND do Arduino ao pino 20 (GND) do AT89C52.
Passo 5: Interface do LED
Conecte um LED (com resistor limitador de corrente apropriado, ex: 220-330Ω) a uma porta de I/O do AT89C52 (ex: P1.0) para indicação visual. Consulte o diagrama esquemático para detalhes.
Passo 6: Software
Utilizamos o software 8051 SPI Programmer para gravar o arquivo .hex no AT89C52. O link está disponível na seção de software. Carregue o código fornecido no Arduino UNO e seu programador estará pronto.
Código para o Arduino (Programador SPI)
#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;
byte data;
byte AL, AH; // Endereço de 16 bits
byte lockByte; // Bits de proteção
byte SigH, SigL; // Bytes de assinatura
void setup() {
pinMode(_MISO, INPUT);
pinMode(_MOSI, OUTPUT);
pinMode(_CLK, OUTPUT);
pinMode(RST, OUTPUT);
Serial.begin(115200);
}
void loop() {
while (!Serial.available());
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
Consulte as imagens originais do projeto para os diagramas de conexão completos (circuito do programador e conexão do LED).
Processo de manufatura
- Programe Facilmente a Série Atmel AT89 com Arduino Uno – Guia Passo a Passo
- Decodifique Sinais PPM de Receptor RC com Arduino: Guia Passo a Passo
- Arduino UNO com Shield WiFi: Exibição de Temperatura em Tempo Real na Web via Serial
- ThimbleKrox: Controle de Mouse Dedo-Montado com Arduino Micro e MPU-6050
- Sistema de Iluminação Ativado por Movimento com Intel Curie (Arduino 101)
- Shield de Programação Wireless Arduino com HC-05 Bluetooth – Sem Cabo USB
- Sensor de Porta Arduino: Alertas em Tempo Real no Facebook Messenger via IFTTT
- Plotter XY Controlado via Web com Arduino e Motores de Passo
- Construa uma Calculadora Arduino com Display LCD 16x2 e Teclado
- Controle de Ventoinha PWM 4 Pinos 25 kHz com Arduino Uno – Montagem, Código e Teste