?? at89c51pro.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 + -