⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x051.c

📁 VB写的上位机
💻 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 + -