使用 Arduino Uno 轻松编程 Atmel AT89 系列单片机——分步指南
组件与材料
- Arduino UNO × 1
- AT89C52 单片机 × 1
- 10μF 电容 × 1
- 8.2kΩ 电阻 × 1
- 510Ω 电阻 × 1
- LED × 1
- 12MHz 晶振 × 1
- 33pF 电容 × 2
- 跳线若干
所需工具
- 电烙铁
软件与在线服务
- Arduino IDE
- 8051 SPI 编程器软件
项目简介
本教程将演示如何使用 Arduino Uno 将十六进制文件烧录到 AT89C52 单片机中。通过将 AT89C52 与 Arduino Uno 连接,并接入 LED 指示灯,仅需几个简单步骤即可完成编程。
步骤 1:准备材料
请准备上述组件清单中的所有元件。
步骤 2:连接单片机
按以下引脚对应关系将 AT89C52 与 Arduino Uno 连接:
| AT89C52 引脚 | Arduino Uno 引脚 |
|---|---|
| Pin 6 | Pin 5 |
| Pin 7 | Pin 4 |
| Pin 8 | Pin 3 |
| Pin 9 | Pin 2 |

步骤 3:连接晶振
将 12MHz 晶振连接在 AT89C52 的 Pin 18 和 Pin 19 之间,并分别从这两个引脚接 33pF 电容到地。完整电路图请参考原理图部分。

步骤 4:连接电源与地
将 Arduino Uno 的 5V 引脚连接到 AT89C52 的第 40 脚(VCC),GND 引脚连接到第 20 脚(GND)。

步骤 5:接入 LED 指示灯
根据原理图部分提供的电路图连接 LED,用于指示编程状态。

步骤 6:软件准备与烧录
使用“8051 SPI Programmer”软件将十六进制文件烧录到 AT89C52。软件下载链接见上文“软件与在线服务”部分。将提供的 Arduino 代码上传至 Arduino Uno,即可将其转变为编程器。

Arduino 编程器代码
#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; // 16位地址
byte lockByte; // 锁定位
byte SigH, SigL; // 签名字节
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);
}
原理图


制造工艺
- 使用 Arduino Uno 轻松编程 Atmel AT89 系列单片机——分步指南
- Arduino 解码遥控接收机 PPM 信号——分步指南
- Arduino UNO + WiFi 盾板:串口实时推送温度到网页绘图
- ThimbleKrox:基于 Arduino Micro 与 MPU-6050 的指戴式鼠标控制器
- Intel Curie 加速度计驱动的体感触发灯光系统
- 无线Arduino编程盾:HC-05蓝牙模块实现免USB线烧录
- Arduino 门磁传感器:PHPoC WiFi Shield 经 IFTTT 推送 Messenger 实时告警
- 基于 Arduino 的智能温室监测与自动灌溉系统
- Arduino DIY 计算器:1602 LCD + 4×4 矩阵键盘完整教程
- Arduino驱动WS2812智能LED蜡烛灯:自然摇曳光效的全屋部署实战
- Arduino 网页控制灯泡:PHPoC Shield 实现 WebSocket 实时控制
- Arduino Uno 控制 25kHz 4 针 PWM 风扇 - 硬件、代码与测试