通过 Arduino 对 Atmel AT89 系列进行编程
组件和用品
![]() |
| × | 1 | |||
![]() |
| × | 1 |
必要的工具和机器
![]() |
|
应用和在线服务
![]() |
| |||
|
关于这个项目
在本教程中,我将向您展示如何通过几个简单的步骤使用 Arduino Uno 将您的 Hex 文件刻录到 AT89c52。为此,我们必须将 AT89c52 连接到 Arduino Uno,并通过将 LED 连接到 At89c52 为其提供 LED 指示。
第 1 步:物料清单
- Arduino UNO
- AT89C52 微控制器
- 10uF 电容器
- 跳线
- 8.2kohm 电阻
- 510 欧姆电容器
- LED
- 12 MHz 晶体
- 2 个 33pF 电容器
步骤 2:连接微控制器

如下连接微控制器:
- At89c52 Arduino Uno
- 引脚 6 引脚 5
- 引脚 7 引脚 4
- 引脚 8 引脚 3
- 引脚 9 引脚 2
第三步:水晶

在 Atmel 的引脚 18 和 19 上连接一个晶体,然后将两个 33pf 电容器从引脚 18 和 19 连接到 Atmel 的地。完整电路图见原理图部分。
第 4 步:VCC 和 GND

将 Arduino Uno 的 5v 引脚连接到 Atmel 的第 40 个引脚,将 GND 引脚连接到 Atmel 的第 20 个引脚。
第 5 步:连接 LED


借助原理图部分提供的电路图连接 LED。
第 6 步:软件

我们需要 8051 SPI Programmer 将 Hex 文件刻录到 89c52。链接在软件部分提供。上传提供给 Arduino UNO 的代码,您的程序员已准备就绪。
代码
- 无标题文件
无标题文件C/C++
#define dummyData 0xAA#define RDY 75#define NRDY 76const int _MISO =4;const int _MOSI =5;const int _CLK =3;const int RST =2;/* 变量定义块 */byte data;byte AL ,啊; // 16 位地址字节 lockByte; // 在此嵌入锁定位字节 SigH,SigL; //签名Bytesvoid setup(){pinMode(_MISO, INPUT);pinMode(_MOSI, OUTPUT);pinMode(_CLK, OUTPUT);pinMode(RST, OUTPUT);Serial.begin(115200); // 取决于主机 PC 的设置}void loop(){ while (!Serial.available()); // 等待字符 if (Serial.available()> 0) switch (Serial.read()) { case 'p':Serial.write(progEnable());休息; case 'r':readProgmem();串行写入(数据);休息; case 'a':while(!Serial.available()); AL =Serial.read();休息; case 'A':while(!Serial.available()); AH =Serial.read();休息; case 'd':while(!Serial.available());数据 =Serial.read();休息;案例'S':AH =0; AL =0; SigH =readSign(); Serial.write(SigH);休息;案例's':AH =2; AL =0; SigL =readSign(); Serial.write(SigL); AH =1; AL =0; SigL =readSign(); Serial.write(SigL);休息; // 读取 SigL case 'o':digitalWrite(RST,1);break; case 'c':digitalWrite(RST,0);break;案例“e”:擦除芯片();串行写入(RDY);休息;案例'j':中断; case 'w':writeProgmem();休息; }}无符号字符SendSPI(无符号字符数据){ uint8_t retval =0; uint8_t intData =数据;国际t; for (int ctr =0; ctr <7; ctr++) { if (intData &0x80) digitalWrite(_MOSI,1);否则 digitalWrite(_MOSI,0);数字写入(_CLK,1);延迟微秒(1); t =数字读取(_味噌);数字写入(_CLK,0);如果 (t) retval |=1;否则返回值 &=0xFE;返回值<<=1;数据<<=1;延迟微秒(1); } if (intData &0x80) digitalWrite(_MOSI,1);否则 digitalWrite(_MOSI,0);数字写入(_CLK,1);延迟微秒(1); t =数字读取(_味噌);数字写入(_CLK,0);如果 (t) retval |=1;否则返回值 &=0xFE;返回 retval; }byte progEnable(){ SendSPI(0xAC);发送SPI(0x53); SendSPI(dummyData); return SendSPI(dummyData);}void eraseChip(){ SendSPI(0xAC);发送SPI(0x9F); SendSPI(dummyData); SendSPI(dummyData); delay(520);}void readProgmem(){ SendSPI(0x20);发送SPI(AH);发送SPI(AL);数据 =SendSPI(dummyData);}void writeProgmem(){ SendSPI(0x40);发送SPI(AH);发送SPI(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);发送SPI(AH);发送SPI(AL); return SendSPI(dummyData);}
示意图


制造工艺