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

📄 主控程序.c

📁 这是本人自做的编程器
💻 C
字号:

//FID=00:AT89C51系列编程器
//实现编程的读,写,擦等细节
#include <e51pro.h>

void InitPro00()//编程前的准备工作
{
	SetVpp5V();
	P3_5=1;//p3.5接RST
	P3_2=1;//p3.2接PROG
	P0=0xff;
	P1=0xff;
	P2=0xff;
	P2_6=0;//先置成读模式
	P2_7=0;
	P3_6=1;
	P3_7=1;
	nAddress=0x0000;
}

void ProOver00()//编程结束后的工作,设置合适的引脚电平
{
	SetVpp5V();
	P0=0xff;
	P1=0xff;
	P2=0xff;
	P3_6=1;
	P3_7=1;
	P3_5=0;//RST=0;
	P3_2=0;//PROG=0
}

void ReadSign00()//读特征字
{
	InitPro00();//先设置成编程状态
	Delay_ms(1);
//-----------------------------------------------------------------------------
	//根据器件的DataSheet,设置相应的编程控制信号
	P2_6=0;
	P2_7=0;
	P3_6=0;
	P3_7=0;
	nAddress=0x0030;
	P1=((BYTE*)(&nAddress))[1];//低地址
	P2=((BYTE*)(&nAddress))[0];//高地址
	ComBuf[2]=P0;//读第1个特征字
	nAddress=0x0031;
	P1=((BYTE*)(&nAddress))[1];
	P2=((BYTE*)(&nAddress))[0];
	ComBuf[3]=P0;//读第2个特征字
	nAddress=0x0032;
	P1=((BYTE*)(&nAddress))[1];
	P2=((BYTE*)(&nAddress))[0];
	ComBuf[4]=P0;//读第3个特征字
//-----------------------------------------------------------------------------
	ProOver00();//操作结束设置为运行状态
}

void Erase00()//擦除器件
{
	InitPro00();
//-----------------------------------------------------------------------------
	//根据器件的DataSheet,设置相应的编程控制信号
	P2_6=1;
	P2_7=0;
	P3_6=0;
	P3_7=0;
	Delay_ms(1);
	SetVpp12V();
	Delay_ms(1);
	P3_2=0;
	Delay_ms(10);
	P3_2=1;
	Delay_ms(1);
//-----------------------------------------------------------------------------
	ProOver00();
}

BOOL Write00(BYTE Data)//向器件写一个字节
{
	
//-----------------------------------------------------------------------------
	//根据器件的DataSheet,设置相应的编程控制信号
	//写一个单元
	P2=((BYTE*)(&nAddress))[0];//高地址
	P1=((BYTE*)(&nAddress))[1];//低地址
	P2_6=0;
	P2_7=1;
	P3_6=1;
	P3_7=1;
	P3_2=1;
	P0=Data;
	SetVpp12V();
	Delay_us(20);
	P3_2=0;
	Delay_us(20);
	P3_2=1;
	Delay_us(20);
	SetVpp5V();
	Delay_us(20);
	P2_7=0;
	Delay_ms(2);
	nTimeOut=0;
	P0=0xff;
	nTimeOut=0;
	while(P0!=Data)//效验:循环读,直到读出与写入的数相同
	{
		nTimeOut++;
		if(nTimeOut>1000)//超时了,写失败
		{
			return 0;
		}
				
	}
	return 1;
//-----------------------------------------------------------------------------
}

BYTE Read00()//从器件读一个字节
{
	P1=((BYTE*)(&nAddress))[1];//低地址
	P2=((BYTE*)(&nAddress))[0];//高地址
	P2_6=0;
	P2_7=0;
	P3_6=1;
	P3_7=1;
	return P0;
}

void Lock00()//写锁定位
{
	InitPro00();
//-----------------------------------------------------------------------------
	//根据器件的DataSheet,设置相应的编程控制信号
	if(ComBuf[2]>=1)//ComBuf[2]为锁定位
	{
		P2_6=1;
		P2_7=1;
		P3_6=1;
		P3_7=1;
		Delay_us(20);
		SetVpp12V();
		Delay_us(20);
		P3_2=0;
		Delay_us(20);
		P3_2=1;
		Delay_us(20);
		SetVpp5V();
	}
	if(ComBuf[2]>=2)
	{
		P2_6=1;
		P2_7=1;
		P3_6=0;
		P3_7=0;
		Delay_us(20);
		SetVpp12V();
		Delay_us(20);
		P3_2=0;
		Delay_us(20);
		P3_2=1;
		Delay_us(20);
		SetVpp5V();
	}
	if(ComBuf[2]==3)
	{
		P2_6=1;
		P2_7=0;
		P3_6=1;
		P3_7=0;
		Delay_us(20);
		SetVpp12V();
		Delay_us(20);
		P3_2=0;
		Delay_us(20);
		P3_2=1;
		Delay_us(20);
		SetVpp5V();
	}
//-----------------------------------------------------------------------------
	ProOver00();
}

void PreparePro00()//设置pw中的函数指针,让主程序可以调用上面的函数
{
	pw.fpInitPro=InitPro00;
	pw.fpReadSign=ReadSign00;
	pw.fpErase=Erase00;
	pw.fpWrite=Write00;
	pw.fpRead=Read00;
	pw.fpLock=Lock00;
	pw.fpProOver=ProOver00;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -