📄 x051.c
字号:
#include <reg51.h>
#include <stdio.h>
unsigned i;
unsigned Sectors,Codes;
unsigned Allcodes;
unsigned Signature[2]={0,0};
char Command;
#define DATA P1
sbit Prog = P3^3; //Address Advanced Pulse (positive) Always Low
sbit Addr = P3^2; //Program Pulse (minus) Always High
sbit Busy = P3^4; //Ready or Busy (Low) Always High
sbit OE = P3^7; //Control Signal Output Enable (Low) Always High
sbit EData = P3^5; //Control Signal Lock (Low) Always Low
sbit ARST = P1^4;
unsigned Getchar();
void Connect();
void ReadSignature();
void SetType();
void SetMcuType();
void Erase();
void Write();
void Read();
void Lock();
void main()
{
Addr=0;
Prog=Busy=OE=EData=1;
SCON = 0x52; // 8-bit UART mode
PCON = 0x80;
TMOD = 0x20; // timer 1 mode 2 auto reload
TH1 = 0xff; // 57600 8 n 1 For 11.0592MHz Crystal
TR1 = 1; // run timer1
while(1)
{
Command=(char)(Getchar());
Connect();
ReadSignature();
SetMcuType();
Erase();
Write();
Read();
Lock();
}
}
void Putchar(char c)
{
while(!TI);
TI=0;
SBUF=c;
}
unsigned Getchar()
{
while(!RI);
RI=0;
return SBUF;
}
void Delay1us(int n)
{
int i;
for(i=0;i<n;i++);
}
void Delay1ms(int n)
{
int i;
for(i=0;i<n;i++)
Delay1us(1000);
}
void Connect()
{
if (Command=='C') Putchar('C');
}
void SetType()
{
switch(Signature[1])
{
case 0x11: //AT89C1051
case 0x12: Allcodes=1024;break; //AT89C1051U
case 0x21: //AT89C2051
case 0x22: Allcodes=2048;break; //AT89C2051x2
case 0x41: Allcodes=4096;break; //AT89C4051
default: Allcodes=0;
}
}
void SetMcuType()
{
if (Command=='T')
{
Putchar('T');
Signature[1]=Getchar();
SetType();
Putchar('T');
}
}
void Write()
{
if (Command=='W')
{
Putchar('W');
Sectors=Getchar();
Putchar('W');
Codes=Getchar();
Putchar('W'); //Get The Total Number Of Codes Being To Write
Allcodes = Sectors * 256 + Codes;
DATA=0x1a; //Avoid Status Reading
OE=0; //Enable Control Signal Output
ARST = 0;
ARST = 1; //Address Reset
OE=1;
DATA=0x17; //Ctr1=0,Ctr2=Ctr3=EVpp=1
EData=0; //Lock the control signal
OE=0; //Enable the control signal
for(i=0;i<Allcodes;i++)
{
DATA=Getchar();
Prog = 0;
Prog = 1;
Putchar('W');
while(!Busy);
Addr = 0;
Addr = 1;
}
OE=1;
EData=1; //Enable Control Signal Transport
}
}
void Read()
{
if (Command=='R')
{
DATA=0x1a; //Avoid Status Reading
OE=0; //Enable Control Signal Output
ARST = 0;
ARST = 1; //Address Reset
OE=1;
DATA=0x12; //Ctr1=Ctr2=0,Ctr3=1,EVpp=0
EData=0; //Lock the control signal
DATA=0xff;
OE=0; //Enable the control signal
for(i=0;i<Allcodes;i++)
{
Putchar(DATA);
Command=(char)(Getchar());
if(!(Command=='R')) i=Allcodes;
Addr = 0;
Addr = 1;
}
OE=1;
EData=1; //Enable Control Signal Transport
}
}
void ReadSignature()
{
if(Command=='S')
{
DATA=0x1a; //Avoid Status Reading
OE=0; //Enable Control Signal Output
ARST=0;
ARST=1; //Address Reset
OE=1;
DATA=0x10; //Ctr1=Ctr2=Ctr3=EVpp=0
EData=0; //Lock the control signal
DATA=0xff;
OE=0; //Enable the control signal
Signature[0]=DATA;
Putchar(Signature[0]);
Command=Getchar();
Addr=1;
Addr=0;
Signature[1]=DATA;
Putchar(Signature[1]);
Addr=1;
OE=1;
EData=1; //Enable Control Signal Transport
SetType();
}
}
void Erase()
{
if (Command=='E')
{
DATA=0x19; //Ctr1=1,Ctr2=Ctr3=0,EVpp=1
OE=0; //Enable the control signal
Prog=0;
Delay1ms(10);
Prog=1;
OE=1; //Eraze complete
/*Test blank to judge if Eraze is Successfully Oprated*/
DATA=0x1a; //Avoid Status Reading
OE=0; //Enable Control Signal Output
ARST = 0;
ARST = 1; //Address Reset
OE=1;
DATA=0x12; //Ctr1=Ctr2=0,Ctr3=1,EVpp=0
EData=0; //Lock the control signal
DATA=0xff;
OE=0; //Enable the control signal
for(i=0;i<Allcodes;i++)
{
if (DATA==0xff)
{
Addr = 0;
Addr = 1;
if (i==Allcodes-1) Putchar('E');
}
else
{
Putchar('F');
i=Allcodes;
}
}
OE=1;
EData=1; //Enable Control Signal Transport
}
}
void Lock()
{
if (Command=='L')
{
DATA=0x1f; //Ctr1=Ctr2=Ctr3=EVpp=1
OE=0;
Prog = 0;
Prog = 1; //Program LockBit 1
while(!Busy);
DATA=0x1d; //Ctr1=Ctr2=1,Ctr3=0,EVpp=1
Prog = 0;
Prog = 1; //Program LockBit 2
while(!Busy);
Putchar('L');
OE=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -