📄 主控程序.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 + -