?? at89s51pro.c
字號:
///////////////////////////////////////////////////////////////////////////////////////////////////
//FID=02:AT89S51系列編程器
//實現編程的讀,寫,擦等細節
//特殊處:采用ISP編程方式,只需對P1.5,P1.6,P1.7,RST引腳控制;用MOSI串行發送命令的同時用MISO接收相關數據
//SCK輸出同步時鐘脈沖
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <e51pro.h>
#define MOSI P1_5
#define MISO P1_6
#define SCK P1_7
BYTE OutBuf[4];//發送命令緩沖
BYTE InBuf[4];//接收緩沖
void SendInstrc(BYTE nByte)//用MOSI串行發送命令的同時用MISO接收相關數據
{
BYTE n;
for(n=0;n<nByte;n++)//發送nByte個字節
{
ACC=OutBuf[n];
SCK=0;
MOSI=A_7;//低電平時輸出一位
SCK=1;
B_7=MISO;//高電平時接收一位
SCK=0;
MOSI=A_6;
SCK=1;
B_6=MISO;
SCK=0;
MOSI=A_5;
SCK=1;
B_5=MISO;
SCK=0;
MOSI=A_4;
SCK=1;
B_4=MISO;
SCK=0;
MOSI=A_3;
SCK=1;
B_3=MISO;
SCK=0;
MOSI=A_2;
SCK=1;
B_2=MISO;
SCK=0;
MOSI=A_1;
SCK=1;
B_1=MISO;
SCK=0;
MOSI=A_0;
SCK=1;
B_0=MISO;
SCK=0;
InBuf[n]=B;
}
}
void InitPro02()//編程前的準備工作
{
SetVpp5V();
P3_5=0;//p3.5接RST
P3_2=1;//p3.2接PROG
P0=0xff;
P1=0xff;
P2=0xff;
Delay_ms(10);
MOSI=0;
MISO=1;
SCK=1;
P3_5=1;
Delay_ms(10);
nAddress=0x0000;
OutBuf[0]=0xac;//正好在這里可以安排DataSheet上所規定的
OutBuf[1]=0x53;//Eanable Programming命令
OutBuf[2]=0;
OutBuf[3]=0;
SendInstrc(4);
}
void ProOver02()//編程結束后的工作,設置合適的引腳電平
{
SetVpp5V();
P0=0xff;
P1=0xff;
P2=0xff;
P3_6=1;
P3_7=1;
P3_5=0;//RST=0;
P3_2=2;//PROG=0
}
BYTE Read02()
{
OutBuf[0]=0x20;
OutBuf[1]=((BYTE*)&nAddress)[0];
OutBuf[2]=((BYTE*)&nAddress)[1];
SendInstrc(4);
return InBuf[3];
}
void ReadSign02()//讀特征字
{
InitPro02();//先設置成編程狀態
//-----------------------------------------------------------------------------
//根據器件的DataSheet,設置相應的編程控制信號
OutBuf[0]=0x28;
OutBuf[1]=0x00;
OutBuf[2]=0x00;
OutBuf[3]=0x00;
SendInstrc(4);
ComBuf[2]=InBuf[3];
OutBuf[1]=0x01;
SendInstrc(4);
ComBuf[3]=InBuf[3];
OutBuf[1]=0x02;
SendInstrc(4);
ComBuf[4]=InBuf[3];
//-----------------------------------------------------------------------------
ProOver02();
}
void Erase02()//擦除器件
{
InitPro02();
//-----------------------------------------------------------------------------
//根據器件的DataSheet,設置相應的編程控制信號
OutBuf[0]=0xac;
OutBuf[1]=0x80;
SendInstrc(4);
Delay_ms(500);
//-----------------------------------------------------------------------------
ProOver02();
}
BOOL Write02(BYTE Data)//寫器件
{
//-----------------------------------------------------------------------------
//根據器件的DataSheet,設置相應的編程控制信號
//寫一個單元
OutBuf[0]=0x40;
OutBuf[1]=((BYTE*)&nAddress)[0];
OutBuf[2]=((BYTE*)&nAddress)[1];
OutBuf[3]=Data;
SendInstrc(4);
nTimeOut=0;
while(Read02()!=Data)//效驗:循環讀,直到讀出與寫入的數相同
{
nTimeOut++;
if(nTimeOut>1000)//超時了
{
return 0;
}
}
//-----------------------------------------------------------------------------
return 1;
}
void Lock02()//寫鎖定位
{
//-----------------------------------------------------------------------------
//根據器件的DataSheet,設置相應的編程控制信號
if(ComBuf[2]>=1)//ComBuf[2]為鎖定位
{
InitPro02();
OutBuf[0]=0xac;
OutBuf[1]=0xe1;
SendInstrc(4);
Delay_ms(1);
}
if(ComBuf[2]>=2)
{
InitPro02();
OutBuf[0]=0xac;
OutBuf[1]=0xe2;
SendInstrc(4);
Delay_ms(1);
}
if(ComBuf[2]==3)
{
InitPro02();
OutBuf[0]=0xac;
OutBuf[1]=0xe3;
SendInstrc(4);
Delay_ms(1);
}
//-----------------------------------------------------------------------------
ProOver02();
}
void PreparePro02()//設置pw中的函數指針,讓主程序可以調用上面的函數
{
pw.fpInitPro=InitPro02;
pw.fpReadSign=ReadSign02;
pw.fpErase=Erase02;
pw.fpWrite=Write02;
pw.fpRead=Read02;
pw.fpLock=Lock02;
pw.fpProOver=ProOver02;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -