📄 at89s51isp.cpp
字号:
// At89s51Isp.cpp: implementation of the CAt89s51Isp class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "EPro.h"
#include "At89s51Isp.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAt89s51Isp::CAt89s51Isp()
{
m_pParlPro=NULL;//该类所支持的FID
FID=0x02;
}
CAt89s51Isp::~CAt89s51Isp()
{
}
void CAt89s51Isp::InitIsPro(CParallelPro* pParlPro)
{
TRACE("CAt89s51Isp::InitIsPro\n");
CIsPro::InitIsPro(pParlPro);//得到并口编程器对象的指针
}
void CAt89s51Isp::PreparePro()//编程前的准备工作
{
m_pParlPro->SetRst(0);//RST置低电平
m_pParlPro->SetMosi(0);//MOSI置低电平
m_pParlPro->SetSck(0);//SCK置低电平
Sleep(10);
m_pParlPro->SetRst(1);
Sleep(10);
m_pParlPro->OutBuf[0]=0xac;
m_pParlPro->OutBuf[1]=0x53;
m_pParlPro->SckBytes(4);
}
void CAt89s51Isp::ProOver()//编程结束后的工作
{
m_pParlPro->SetRst(0);//RST置低电平,这样单片机就开始运行了
m_pParlPro->SetMosi(1);
m_pParlPro->SetSck(1);
}
void CAt89s51Isp::ReadSign(BYTE* pBuf)//读特征字
{
m_pParlPro->OutBuf[0]=0x28;//根据器件手册上规定的命令协议
m_pParlPro->OutBuf[1]=0x00;
m_pParlPro->OutBuf[2]=0x00;
m_pParlPro->OutBuf[3]=0x00;
m_pParlPro->SckBytes(4);//向器件发编程命令
pBuf[0]=m_pParlPro->InBuf[3];//第1个特征字
m_pParlPro->OutBuf[1]=0x01;
m_pParlPro->SckBytes(4);
pBuf[1]=m_pParlPro->InBuf[3];//第2个特征字
m_pParlPro->OutBuf[1]=0x02;
m_pParlPro->SckBytes(4);
pBuf[2]=m_pParlPro->InBuf[3];//第3个特征字
}
void CAt89s51Isp::Erase()//擦除器件
{
m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
m_pParlPro->OutBuf[1]=0x80;
m_pParlPro->SckBytes(4);//向器件发编程命令
Sleep(500); //擦除器件要500ms
}
BOOL CAt89s51Isp::Write(BYTE Data,int nAddr)//写一个单元
{
int nTimeOut=0;
m_pParlPro->OutBuf[0]=0x40;//根据器件手册上规定的命令协议
m_pParlPro->OutBuf[1]=((BYTE*)&nAddr)[1];//高地址
m_pParlPro->OutBuf[2]=((BYTE*)&nAddr)[0];//低地址
m_pParlPro->OutBuf[3]=Data;
m_pParlPro->SckBytes(4);//向器件发编程命令
while(Read(nAddr)!=Data)//效验:循环读,直到读出与写入相同的数
{
nTimeOut++;
if(nTimeOut>=1000)//如果超时了,写入失败
return FALSE;
}
return TRUE;
}
BYTE CAt89s51Isp::Read(int nAddr)//读一个单元
{
m_pParlPro->OutBuf[0]=0x20;//根据器件手册上规定的命令协议
m_pParlPro->OutBuf[1]=((BYTE*)&nAddr)[1];//高地址
m_pParlPro->OutBuf[2]=((BYTE*)&nAddr)[0];//低地址
m_pParlPro->SckBytes(4);//向器件发编程命令
return m_pParlPro->InBuf[3];
}
BOOL CAt89s51Isp::LockBit(int nBit)
{
if(nBit>=1)//ComBuf[2]为锁定位
{
m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
m_pParlPro->OutBuf[1]=0xe1;
m_pParlPro->SckBytes(4);
Sleep(1);
}
if(nBit>=2)
{
PreparePro();
m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
m_pParlPro->OutBuf[1]=0xe2;
m_pParlPro->SckBytes(4);
Sleep(1);
}
if(nBit==3)
{
PreparePro();
m_pParlPro->OutBuf[0]=0xac;//根据器件手册上规定的命令协议
m_pParlPro->OutBuf[1]=0xe3;
m_pParlPro->SckBytes(4);
Sleep(1);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -