找回密码
 注册会员
搜索附件  

IMAGE003.PNG

 

真正附带了《Easy 51Pro v2.0宇宙版》所需的所有组件,装好即可编译:
这次把真正的把源程序公开了,而且还有详细的原理教程,希望大家帮忙把他做的更好,支持的器件更多。
这个下载线电路是我做过的中最稳定的,成功率很高。你也可以直接使用现有的下载线或者Atmel的原版下
载线。Easy 51Pro串行编程器也支持AT89C2051了。《Easy 51Pro的制作及使用说明》中有详细介绍。


Easy 51Pro 的原理与扩充

这篇文章将让你很快掌握如何扩充Easy 51Pro对器件的支持。当然首先你必须先了解Keil C(如果扩充Easy 51Pro串行编程器)或VC(如果扩充Easy Isp下载线)。本文只介绍基本原理,至于串口通讯的细节和程序界面的制作请看源代码,里面有详细的注释。如果你正在学习单片机与PC的串口通讯,那么这套资料将对你非常有用。


本人编程水平有限,如果你发现了任何问题,欢迎指正。可以Email通知我(nie_zq@163.net)。常见问题我会贴在留言版。如果你是真心的想扩充器件,那么我们可以用QQ讨论(QQ3813420)。如果你想用它作为商业用途,请先与本人联系。


首先介绍一下我常挂在嘴变的“FID”。FID=Function IDentification”,我E文不是很好,所以只能取出个这样的名字。它标识一种器件的编程方法(包括读,写,擦等编程操作)。AT89C51AT89C52,AT89C55的编程方法是一样的,所以可以用同一个FID,我把他们的FID定义为0,还有AT89CS51AT89S52FID=2AT89C2051FID=1。编程方法实际上就是控制编程过程的程序吧,C语言里面的程序不是叫Function?


Easy 51Pro串行编程器的扩充


编程器和上位机能协调的工作肯定是要有个通讯协议的。Easy 51Pro的通讯协议很简单。每次编程操作,上位机发给编程器18个字节,编程器完成编程操作后再回应上位机18个字节(读,写过程略有不同,请看源程序)。这18个字节是什么东西呢?

012-17
编程操作的标识FID该操作相关的数据

编程操作标识是如何定义的?可以从源程序找到答案。


switch( ComBuf[0] )
//
根据操作ID跳到不同的操作函数


{


case 0x00:


RstPro();
//
编程器复位


break;


case 0x01:


ReadSign();
//
读特征字


break;


case 0x02:


Erase();
//
擦除器件


break;


case 0x03:



Write();
//
写器件


break;


case 0x04:


Read();
//
读器件


break;


case 0x05:


Lock();
//
写锁定位


break;


default:


SendData();


break;


}

FID已经解释过的,但是如何通过FID调用到控制器件编程操作的子程序呢?还是用程序说话:

e51pro.h中定义了这样一个结构:

struct _prowork
//
定义编程器的一般操作

{


void (*fpInitPro)();
//
编程前的准备工作


void (*fpReadSign)();
//
读特征字


void (*fpErase)();
//
擦除器件


BOOL (*fpWrite)(BYTE);
//
写器件


BYTE (*fpRead)();
//
读器件


void (*fpLock)();
//
写锁定位


void (*fpProOver)();
//
编程结束后的工作

};

typedef struct _prowork ProWork;

ProWork
pw;
//
编程器一般操作

看见没有,里面都是一堆函数的指针。没办法,Keil C里面没有class,在struct里面弄一堆函数指针也别有一方风味。

在调用编程操作(就是最上面那一堆程序switch(ComBuf[0]){…})之前,还要先进行这一堆程序:


switch( ComBuf[1] )
//
根据FID设置 (ProWork)pw 中的函数指针


{


case 0:
//at89c51
编程器


PreparePro00();//<<<<<<<<<<<<<<<<<<<<<<
关键要看这里面的东西


break;


case 1:
//at89c2051
编程器


PreparePro01();


break;


case 2:
//at89s51
编程器


PreparePro02();


break;


//case 3:
//
扩充器件时,请继续向下添加


//
break;


default:


ComBuf[0]=0xff;


ComBuf[1]=0xff;
//
表示无效的操作


break;


}

看看AT89C51PRO.C中的PreparePro00()函数里面搞了些什么?

void PreparePro00()
//
设置pw中的函数指针,让主程序可以调用上面的函数

{


pw.fpInitPro=InitPro00;


pw.fpReadSign=ReadSign00;


pw.fpErase=Erase00;


pw.fpWrite=Write00;


pw.fpRead=Read00;


pw.fpLock=Lock00;


pw.fpProOver=ProOver00;

}

其中InitPro00(),ReadSign00()…..ProiOver00()这些函数都写在了AT89C51PRO.C中,他们实现了控制编程器对AT89C51编程的具体细节。例如,再看看擦除AT89C51和插除AT89S51Flash Rom是如何实现的。

void Erase00()//擦除AT89C51

{


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();

}

就是根据这个来的:

      

再看看AT89S51PRO.C中的:

void Erase02()//擦除AT89S51

{


InitPro02();

//-----------------------------------------------------------------------------


//
根据器件的DataSheet,设置相应的编程控制信号


OutBuf[0]=0xac;//<<<<<<<<<<<<<<<
看下表中的红框


OutBuf[1]=0x80;//<<<<<<<<<<<<<<<
看下表中的红框


SendInstrc(4);


Delay_ms(500);

//-----------------------------------------------------------------------------


ProOver02();

}

根据这个来的:

Erase02()中看到调用了SendInstrc(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
低电平时输出一位


SCK=1;


B_7=MISO;
//SCK
高电平时接收一位


SCK=0;


MOSI=A_6;




MOSI=A_1;


SCK=1;


B_1=MISO;


SCK=0;


MOSI=A_0;


SCK=1;


B_0=MISO;


SCK=0;


InBuf[n]=B;


}

}

贴个图来解释:

最后来看一个扩充器件的全过程:

1.
看懂器件手册上Programming的原理和过程细节。

2.
评估一下Easy 51Pro的硬件是否可以实现,包括编程电压,编程控制信号。一般可以用Isp编程的都没问题。

3.
让软件能识别出器件,这就要用传说中的“ChipManager”编辑了。用这个程序打开程序目录下的ChipList.chip文件,然后“增加器件”。也可以在空白列表上直接“增加器件”,然后保存为*.chip文件,再把这个文件合并到ChipList.chip,这就是使用“从文件导入”。

如果你发现编程方法和列表中的某FID一样,那么就直接用这个FID吧,这是最幸福的。注意:如果特征字没有3个字节,可以用ff补充。

4.
最关键的部分,要你编程解决问题了。如果器件能ISP的尽量用ISP吧。建一个*.c文件,里面实现这些函数:

#include <e51pro.h>

void InitProXX()
//
编程前的准备工作

{

}

void ProOverXX()
//
编程结束后的工作,设置合适的引脚电平

{

}

void ReadSignXX()
//
读特征字

{

}

void EraseXX()
//
擦除器件

{

}

BOOL WriteXX(BYTE Data)
//
向器件写一个字节

{

}

BYTE ReadXX()
//
从器件读一个字节

{

}

void LockXX()
//
写锁定位

{

}

void PrepareProXX()
//
设置pw中的函数指针,让主程序可以调用上面的函数

{


pw.fpInitPro=InitProXX;


pw.fpReadSign=ReadSignXX;


pw.fpErase=EraseXX;


pw.fpWrite=WriteXX;


pw.fpRead=ReadXX;


pw.fpLock=LockXX;


pw.fpProOver=ProOverXX;

}

XX”就是FID。其实你不必写太多程序,如果发现它的编程方法与AT89C51相似,那就直接复制AT89C51PRO.C中的源程序,修改一下即可。如果与AT89S51相似呢,那就更好办了:

void Erase02()//擦除器件

{


InitPro02();

//-----------------------------------------------------------------------------


//
根据器件的DataSheet,设置相应的编程控制信号


OutBuf[0]=0xac;//<<<<<<<<<<<<<<<<<<
修改这个


OutBuf[1]=0x80;//<<<<<<<<<<<<<<<<<<
修改这个


SendInstrc(4);//<<<<<<<<<<<<<<<<<<<<
注意要用几个字节


Delay_ms(500);

//-----------------------------------------------------------------------------


ProOver02();

}

最后把PrepareProXX()添交到e51Pro.C中:

///////////////////////////////////////////////////////////////////////////////////////////////////

//所支持的FID,请在这里继续添加

///////////////////////////////////////////////////////////////////////////////////////////////////

extern void PreparePro00();//FID=00:AT89C51编程器

extern void PreparePro01();//FID=01:AT89C2051编程器

extern void PreparePro02();//FID=02:AT89S51编程器

extern void PrepareProXX();//<<<<<<<<<<<<<<<<<<<<<<<<<<<添加到末尾

还有:


switch(ComBuf[1])
//
根据FID设置(ProWork)pw中的函数指针


{


case 0:
//at89c51
编程器


PreparePro00();


break;


case 1:
//at89c2051
编程器


PreparePro01();


break;


case 2:
//at89s51
编程器



PreparePro02();


break;


//case 3:
//
扩充器件时,请继续向下添加


//
PrepareProXX();<<<<<<<<<<<<<<<<<<<<<<<<
添加到末尾


//
break;


default:


ComBuf[0]=0xff;


ComBuf[1]=0xff;//
表示无效的操作


break;


}


5.测试你的程序,成功后把它贴出来与大家分享,可以先发个Email给我。

Easy 51Pro编程器的原理与扩充之Easy ISP

如果你看完了《Easy 51Pro编程器的原理与扩充》,那么你看这篇文章将更加容易。你会发现ProWorkclass CIsPro的原理完全一样,其实ProWork就是模仿了CIsPro。我管CIsPro叫“ISP编程方法类”。

看本文,你可能需要一点C++的基础知识。本文主要是帮助用户掌握对EasyISP进行扩充的原理和方法,所以讨论重点将放在CParlProCIsPro,需要了解其他细节可以去看源程序。另外附VC源代码,在VC6.0上就可以编译出一个EPro.exe的可执行文件。不过本程序使用了Code JockXtreme Toolkit界面解决方案,需要先下载安装(至少要装15分钟)。如果编译时提示找不到dll,请把winio.dllwinio.syshook.dllXT2000Lib.dll拷贝到程序所在的目录


Easy 51Pro的应用程序框架:

CEProDlg对话框界面接收用户操作,把用户操作转换成对CPro对象中的函数调用

CPro:根据用户的选择,建立CParlPro对象(如果使用并口下载线)CSerialPro对象(如果使用串行编程器);管理CParlPro对象和CSerialPro对象,为它们提供与用户界面的通讯;建立两快64k的缓冲1和缓冲2,提供一些管理缓冲的函数;管理器件列表,可以通过特征字查询到与之匹配的器件

CParlPro派生自CParallelPort

CParallelPort:负责安装驱动程序,提供丰富的函数方便对并口进行操作。

CParlPro:封装了ISP编程的一般流程,通过CIsPro的派生类对象控制并口对器件进行编程。

CSerialPro派生自CSerialPort

CSerialPort:提供丰富的函数方便串口通讯

CSerialPort:把CPro传递过来的用户操作信息转换成编程命令按照协议发送给编程器



由于CParallelPort中设计了这样一些函数:



BOOL SetPinLogic(int nPin,BOOL bLogic);
//设置指定引脚,bLogic=1高电平,bLogic=0低电平


BOOL GetPinLogic(int nPin);
//得到指定引脚的电平


BOOL SetPinL(int nPin);

//设置指定引脚为低电平


BOOL SetPinH(int nPin);
//设置指定引脚为高电平

他们可以通过并口引脚号对并口的某个引脚进行操作,这就使Easy ISP天生具备支持任何下载线的能力。看看是怎么支持的:


int

m_nPinMosi;
//控制MOSI所用的并口引脚


int
m_nPinMiso;
//控制MISO所用的并口引脚


int
m_nPinRst;
//控制RST所用的并口引脚


int
m_nPinSck;
//控制SCK所用的并口引脚


int
m_nPinLe;
//控制器件锁存所用的并口引脚


int
m_nPinOe;
//控制器件OE所用的并口引脚


int
m_nPinR1;
//保留引脚1


int
m_nPinR2;
//保留引脚2


BOOL m_bLe;
//锁存有效时的电平


BOOL m_b2Le;
//锁存无效时的电平


BOOL m_bOe;
//OE有效时的电平



BOOL m_b2Oe;
//OE无效时的电平

上面这一些变量保存了下载线用到的所有并口引脚号。这么多引脚资源,应该够用了吧。要知道MOSIMISOSCK这些引脚的用途可以看《Easy 51Pro编程器的原理与扩充》。在初始化的时候会把这些变量赋予设定的值。


if(nProType==1)//Easy ISP下载线


{


CString strEasyIspIni;


strEasyIspIni=m_strAppPath+"EasyIsp.ini";//EasyIsp.ini文件获得引脚配置信息


//如果不存在"EasyIsp.ini"文件,则使用默认的下载线配置(老版本的)


m_nPinMosi=GetPrivateProfileInt("引脚控制","MOSI",14,strEasyIspIni);


m_nPinMiso=GetPrivateProfileInt("引脚控制","MISO",15,strEasyIspIni);


m_nPinSck=GetPrivateProfileInt("引脚控制","SCK",1,strEasyIspIni);


m_nPinRst=GetPrivateProfileInt("引脚控制","RST",16,strEasyIspIni);


m_nPinLe=GetPrivateProfileInt("引脚控制","LE",17,strEasyIspIni);


m_nPinOe=GetPrivateProfileInt("引脚控制","OE",2,strEasyIspIni);


m_nPinR1=GetPrivateProfileInt("引脚控制","R1",3,strEasyIspIni);


m_nPinR2=GetPrivateProfileInt("引脚控制","R2",4,strEasyIspIni);


m_bLe=GetPrivateProfileInt("锁存控制(LE)","Enable",1,strEasyIspIni);


m_b2Le=GetPrivateProfileInt("锁存控制(LE)","Disable",0,strEasyIspIni);


m_bOe=GetPrivateProfileInt("输出控制(OE)","Enable",0,strEasyIspIni);


m_b2Oe=GetPrivateProfileInt("输出控制(OE)","Disable",1,strEasyIspIni);


}

如果在设置“编程器”中,选择了EasyISP,那么程序将从EasyIsp.ini中载入引脚的配置信息。

如果程序目录不存在该文件呢?那就是支持默认的下载线,这个下载线是原来设计的,这样就解决了程序向上兼容的问题。如果设置“编程器”中选择了Atmel ByteBlaster下载线或Altera ByteBlaster下载线,那么就会进行下面这些配置。


else if(nProType==2)
//Atmel ByteBlaster下载线


{


m_nPinRst=PIN_SELIN;
//PIN_SELIN这些在ParllelPort.h中做了定义,这是并口引脚的功能号


m_nPinMosi=PIN_D0;


m_nPinMiso=PIN_ACK;


m_nPinSck=PIN_STROBE;


m_nPinLe=PIN_D2;
//不用LE,为了延时假定一个不起作用的引脚


m_bLe=0;


m_b2Le=0;


m_nPinOe=0;
//不用OE


m_nPinR1=m_nPinAf=PIN_AUTO;
//保留


m_nPinR2=m_nPinIni=PIN_INIT;
//保留

}


else if(nProType==3)
//Altera ByteBlaster下载线


{


m_nPinRst=3;


m_nPinMosi=8;


m_nPinMiso=11;


m_nPinSck=2;


m_nPinLe=14;
//控制74244LE


m_bLe=0;


m_b2Le=0;
//LE常置低电平


SetPinL(14);
//先预置74244'LE为低电平


m_nPinOe=0;
//没有OE


m_nPinR1=0;


m_nPinR2=0;
//无保留引脚


}

有些东西要提示一下。m_nPinOe是控制器件锁存的并口引脚号,但74244没有OE怎么办呢,那就把m_nPinOe赋为0吧,并口是没有PIN 0的。还有就是对器件LE的控制。m_bLe表示锁存有效时的电平,例如74373LE高电平有效,所以m_bLe=1

m_b2Le表示锁存无效时的电平,所以74373m_b2Le=0;如果需要74373LE常开启怎么办呢?m_bLe=1m_b2Le=1不就解决问题了吗!同样还有m_bOe,m_b2Oe。看看m_nPinLe主要用在了哪里吧。

void CParallelPro::SetSck(BOOL bLogic)
//设置SCK引脚的电平

{


if(bLogic)


SetPinH(m_nPinSck);


else


SetPinL(m_nPinSck);


if(m_nIspSpd==2)
//如果性能设置为“最快”


{


return;


}


else if(m_nIspSpd==1)
//如果性能设置为“较快”


{


SetPinLogic(m_nPinLe,m_bLe);
//开启锁存


return;


}


else
//如果性能设置为“一般”


{


SetPinLogic(m_nPinLe,m_bLe);
//开启锁存


for(int n=0;n<=1000;n++)
//延时,在LE产生脉冲宽度


{


}


SetPinLogic(m_nPinLe,m_b2Le);
//关闭锁存


}

}

这段程序的意思是如果性能设置为“一般”,SCK上的信号改变一次,就锁存一次。如果性能设置为“较快”则把LE开启,但不关闭。你肯定要问为什么每次都要开启呢,即使LE重来没有关闭过?因为这样可以多一次对并口的访问,访问一次并口的会消耗一定的时间,这样就可以当作极短的延时。所以即使器件没有LE,或者74244LE接到了GND,也可以假定一个吗!如果设置为“最快”呢,就不用锁存了。性能设置为“一般”时,有一个锁存过程,锁存后可以增强抗干扰。

下面这段程序可以参照一下《Easy 51Pro的原理与扩充》中对void SendInstrc(BYTE nByte)的解释,原理都是一样,不过这里的程序要获得“位”就没有单片机里那么容易了。

void CParallelPro::SckBytes(int nBytes)
//通过下载线与器件通信

{


for(int n=0;n<nBytes;n++)
//要输出的字节数


{


SetSck(0);


SetMosi((OutBuf[n] & 0x80));
//SCK为低电平时,发送一位


SetSck(1);


if(GetMiso())
//SCK为高电平时,接收一位


{



InBuf[n]=InBuf[n] | 0x80;


}


else


{


InBuf[n]=InBuf[n] & 0x7f;


}


SetSck(0);


SetMosi((OutBuf[n] & 0x40));


SetSck(1);




}

上面那些程序主要是关于对并口控制的,主要是方便你应用。下面介绍一下CParlPro控制编程的主思路。先介绍一下CIsPro是什么?刚说过CIsPro是“ISP编程方法类”。它是一个纯虚类,只有函数定义,没有函数实现,就像还没填数额的支票,当然兑不到钱。

class CIsPro

{

public:


BYTE FID;

//该类所支持的FID


CParallelPro* m_pParlPro;
//方便调用到CParallelPro中的资源


virtual void InitIsPro(CParallelPro* pParlPro);


virtual void PreparePro()=0;
//编程前的工作


virtual void ReadSign(BYTE* pBuf)=0;
//读特征字


virtual void Erase()=0;
//擦除器件


virtual BOOL Write(BYTE Data,int nAddr)=0;
//写一个单元


virtual BYTE Read(int nAddr)=0;
//读一个单元


virtual BOOL LockBit(int nBit)=0;
//写锁定位


virtual void ProOver()=0;
//编程结束后的工作


CIsPro();


virtual ~CIsPro();

};

这个类定义了对器件编程的一般操作,是不是和串行编程器中的ProWork很相似?从这个类派生出对器件编程的具体方法。再看看这个CIsPro类是怎么被应用的。以AT89S51为例(因为我手头上只有这种芯片)。现在就是给支票填数额了。

//At89s51Isp.h

class CAt89s51Isp : public CIsPro

{

public:


CAt89s51Isp();


virtual ~CAt89s51Isp();


virtual void InitIsPro(CParallelPro* pParlPro);


virtual void PreparePro();
//编程前的工作


virtual void ReadSign(BYTE* pBuf);
//读特征字


virtual void Erase();
//擦除器件


virtual BOOL Write(BYTE Data,int nAddr);
//写一个单元


virtual BYTE Read(int nAddr);
//读一个单元


virtual BOOL LockBit(int nBit);
//写锁定位


virtual void ProOver();
//编程结束后的工作

};

还是挑几个出来看看究竟吧,最好对照一下DataSheet上的那个表。

//At89s51Isp.cpp

void CAt89s51Isp::Erase()//擦除器件

{


m_pParlPro->OutBuf[0]=0xac;
//根据器件手册上规定的命令协议


m_pParlPro->OutBuf[1]=0x80;


m_pParlPro->SckBytes(4);
//向器件发编程命令,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];
//该单元的数据

}

void CAt89s51Isp::PreparePro()
//编程前的准备工作

{


m_pParlPro->SetRst(0);
//RST置低电平


m_pParlPro->SetMosi(0);
//MOSI置低电平


m_pParlPro->SetSck(0);
//SCK置低电平


Sleep(10);


m_pParlPro->SetRst(1);
//编程前RST要置高点平


Sleep(10);


m_pParlPro->OutBuf[0]=0xac;
//注意这里,按照ATMEL DataSheet的规定,任何编程操作前


m_pParlPro->OutBuf[1]=0x53;
//必须先发送Programming Enable的命令,安排在这里最合适


m_pParlPro->SckBytes(4);

}

还是贴那个出表来看一下吧!

              

还有一个函数千万别忘了:

CAt89s51Isp::CAt89s51Isp()

{


m_pParlPro=NULL;



FID=0x02;

//该类所支持的FID

}

最后再看看CParlPro是如何使用CIsPro的:

CParlPro有个这样的东西:

CArray<CIsPro*,CIsPro*> m_arIsp;

//Isp编程方法队列

CParlPro的构造函数中:

CParallelPro::CParallelPro()

{



m_arIsp.Add(new CAt89s51Isp);
//把所有的Isp编程方法对象加入到队列

}

当用户对选择的某器件编程时须要先得到该器件的编程方法

CIsPro* CParallelPro::GetIsPro(BYTE FID)
//查找支持该FID"Isp编程方法对象"

{


for(int n=0;n<m_arIsp.GetSize();n++)


if(m_arIsp.GetAt(n)->FID==FID)
//从队列中找出支持该器件FID的编程方法


return m_pIsPro=m_arIsp.GetAt(n);
//设置当前"Isp编程方法对象"指针



return NULL;

}

例如用户发出擦除AT89S51的命令后:

void CParallelPro::Erase(BYTE FID)

{


if(m_bThread)
//如果上一次操作线程还没结束


{


m_pPro->Notify(PRO_INVALID);


return;


}


if(GetIsPro(FID)==NULL)
//查询是否支持该FID,并获得编程方法


{


m_pPro->Notify(PRO_WORK_INVALID);


return;


}


m_nCurWork=2;
//当前操作标识


AfxBeginThread(ProWorkThread,this);

}

获得编程方法后当然是要使用该编程方法了,使用编程方法是在ProWorkThread线程中进行的,创建另外一个线程就是为了避免在读,写这些编程过程中,窗口界面停止响应。ProWorkThread是如何使用这些编程方法的,你一看源代码就知道了。

最后再总结一下扩充Easy ISP的步骤:

步骤123,和《Easy 51Pro的原理与扩充》中介绍的一样。

4.从CIsPro中派生出一个类,实现这个类中的所有函数。最好以CAt89s51Isp为模板,修改一下就可以了。还有记得这里:

CParallelPro::CParallelPro()

{



m_arIsp.Add(new CAt89s51Isp);
//把所有的Isp编程方法对象加入到队列


m_arIsp.Add(new 你的Isp方法类);
//<<<<<<<<<<<<<<<<<<<<<<<

}

5.测试你的程序,成功后把它贴出来与大家分享,可以先发个Email给我。

Easy 51Pro v2.0 制作及使用说明


Easy 51Pro
的第一个版本由于制作简单,操作方便一发布就受到了大家的热烈欢迎。很多网友自制成功后已经感受到了ISP编程技术是如何的爽,看到他们这么爽我也感到无比的高兴和兴奋,这也成了我开发第2个版本的动力。



努力奋斗一个月终于设计出了第2版。这个版本的设计目标:更好用,容易自制,容易扩充,更稳定,更灵活。

V2.0的新特性

支持hex文件了

用户自己可以扩充器件

重载的文件对话框,让你不必到处找文件

热键支持,让你调试程序时效率更高

灵活的程序设计,甚至可以让整套软件在其他编程器硬件上运行

可以支持任何下载线,让你有更多选择

设计了串行通讯超时程序,减少了掉线现象

下载线,编程器都有相关的调试程序,让你制作时更轻松,提高了成功率

开放源代码和详细的原理说明,用户可以根据自己的要求进行修改



别看界面和上一个版本差不多,里面的东西可全部换了,使用还是一样。点击“自动完成”后,就会一项一项的往下进行。最优的设置就像上面这个图。缓冲1会自动刷新上一次你打开的文件,所以你不必每烧一次芯片就去打开一次文件。你也可以不点击“自动完成”,在该界面下“回车”就是的。不在该界面下时可以用“热键”,所以每当编译完程序后,直接按热键就可以了(默认热键Ctrl+Shift+P)。在调试中频繁烧片时这个功能显得很重要。要把按钮设置成“自动”很简单,用“鼠标右键”点一下就可以了。操作成功或失败会有不同的声音提示。成功的声音提示可能会让你编程时更兴奋,效率更高。如果你觉得声音听起来不爽,就在设置里“False”它吧。



这个下面有提示,一看就知道怎么做了吧。有4个编程器选择。Easy 51Pro串行编程器也是新设计的,原来的那个

电路中12v/5v切换电路改成了12v/5v/0v切换电路,这样就可以烧AT89C2051了。不过还要使用一对跳线或开关切换(详细内容在《自制Easy 51Pro串行编程器》)


Easy ISP下载线可以是任何一种并口下载线,因为我有个这样的设计:


打开程序目录下的EasyIsp.ini文件可以编辑控制ISP时所用到的并口引脚。文件下面有详细的说明。编辑这个文件就可以支持你手中现有的下载线了,同时也解决了软件向上兼容的问题,如果你是老版本的用户请把这个文件删除。但我还是推荐一款我新设计的下载线,就是用的上面这个配置(其实每根线接个电阻比接根导线更容易焊,那就和Atmel的图一样了):


其实这个电路就是从Altera
下载线和Atmel
下载线中抄来了一点。我觉得使用74373OE很有必要,编程完毕后可以设置为高阻,这样就不会影响单片机的那几个引脚。使用LE可以保持当前的信号状态,增加了抗干扰。R1,R2是为以后扩充其他器件而保留的。这个电路在我的电脑上运行得很稳定了,如果你对电路的稳定性还存在怀疑,那么你可以去抄一份适合你的电路,不过要记得特别关照一下SCK这个引脚,不然下载线就会不稳定了。


Altera ByteBlaster下载线用来下载AT89S51的原理图:

  

下载线输出插头恰好与Atmel规定的一致。


注意:本软件设置中新增了一个“下载线性能”,里面有3个选择“一般”,“较快”,“最快”。选择“一般”改变一次信号就会有一次控制LE的操作(一个脉冲,开启,关闭);“较快”则每改变一次信号就开启一次LE,但不会关闭,这是因为对并口访问一次可以延时,即使器件没有LELE接了高电平;“最快”则不使用LE。请根据你自制下载线的稳定性设置。


下载线做完后,还要对其进行调试。我为大家开发了一个线路调试软件“IspTest”,功能比上一个版本更强,使用更方便。

同样它也共享了EasyIsp.ini中的配置。点击按钮后用万用表量那个引脚的电平是否可以控制到位。


虽让这个东西整个是免费的,但我的服务算做到无微不至了吧。做Easy 51Pro串行编程器也有个调试程序,那是我以前写的,主要是方便当时学CPLD,测试逻辑是否可以实现。不过后来又添加了调试单片机子程序的功能,做编程器时可以用它来测试线路是否都接好,12v/5v/0v是否可以控制。


这次软件设计的非常Flexible,从上面对下载线的支持就可以看得出,但最主要的还是对器件的支持。一个人做这个东西不可能做到支持很多器件,没时间,也没钱搞。所以我就设计了这样一个东西:


这上面显示的器件和Easy 51Pro中下拉列表中的一样。Easy 51Pro每次启动都会从一个“ChipList.chip”中载入器件信息,用这个软件打开“ChipList.chip”就会像上图这样。如果列表中没有你期望的器件也不必着急,自己DIY一个就是。这个DIY的过程已经被我简化的不能再容易了。


你可以直接向这个列表添加新器件,填入一些器件的信息就可以了,也可以“从文件导入”,就是把另外一个“*.chip”文件中的列表合并到一起。器件列表是给Easy 51Pro软件识别器件的,光有这个还不行,还必须让它知道该器件编程的方法。

这个就要你编程序了。Easy 51Pro串行编程器的控制器单片机程序是用Keil C写的,详细的注释,可读性很高,而且我建立了一种框架让程序可以分层设计,模块化设计。要支持其他器件可以以我写好的AT89C51,AT89C0251,AT89S51编程器程序为模板修改即可。如果要扩充Easy Isp下载线的功能,也不难,只要你懂得一点C++就可以了。扩充器件的具体细节请看《Easy 51Pro的原理与扩充》。


最后当然是祝你成功了。没成功也不要着急,可以在我的留言板提出问题,还有你的好建议。特别欢迎那些帮忙扩充器件的同行网友,还要特别感谢帮忙测试和提供建议的网友们。


可以发邮件给我:nie_zq@163.net
或者用QQ3813420

thanks!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
thanks!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
本文来自: MCU资讯论坛(http://www.mcuzx.net/) 详细文章参考:http://www.mcuzx.net/thread-418-1-1.html
thanks!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
thanks!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
真正附带了《Easy 51Pro v2.0宇宙版》所需的所有组件,装好即可编译
大骗子,不能编译
这个帖子不回对不起自己!
我想我是一天也不能离开MCU资讯论坛。
hahahahah好的 很好的东子{:e135:}
IMAGE003.PNG

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-27 01:36 , Processed in 0.041525 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部