Easy51Pro是由聂忠强设计的一款优秀的单片机编程器,而且作者早就无私地公开该程序的源代码,在下不才,抱着学习的心态读一读,若有不妥之处,还请指正。 在分析之前,我们首先要知道究竟编程器是如何工作的?也就是说,例如,对一片AT89C52来说,我们怎样才能把我们的程序烧进芯片里呢?这个问题可是做编程器的重中之重,其实只要我们打开Atmel的网站找一下,就可以找到89C52的DATASHEET,好可惜是英文的,英语不好的朋友可以找一下中文版的,只是不是每一个芯片都有中文资料的,所以学好英语还是有好处的啦。 从DATASHEET中我们可以知道,AT89C52的编程方法: 1,在地址线上加上要编程单元在地址信号(图9,) 2,在数据线上加上要写入的数据字节(图9) 3,激活相应的控制信号(看表格示) 4,在高电压编程方式时,将EA/VPP端加上+12V编程电压(看表格示) 5,每对Flash存储阵列写一个字节或每写入一个程序加密位,加上一个ALE/PROG编程脉冲。每个字节写入周期是自身定时的,通常约为1.5ms。重复1-5步,改变编程单元的地址和写入的数据,直到全部文件编程结束
对于并行编程器来说,它们的作用就是完成上面的5步而已。现在我们来看文件AT89C51PRO.C其中一个擦除函数(命令)
void Erase00()//擦除器件 { InitPro00(); //根据器件的DataSheet,设置相应的编程控制信号 P2_6=1; P2_7=0; P3_6=0; P3_7=0; Delay_ms(1); SetVpp12V();//将EA/VPP端加上+12V编程电压 Delay_ms(1); P3_2=0; Delay_ms(10); P3_2=1; Delay_ms(1); ProOver00(); } 看完再对比一下编程真值表的第3行,Chip Eraser,呵呵,对应着呢,而且,整个的AT89C51PRO.C文件就是对89C51/52的所有读,擦,写等操作,同样的,另外两个AT89C2051PRO.C和AT89S51PRO.C也是同样对其所对应的芯片的一系列操作,但你应该注意到,对89S51/52等具有ISP功能的单片机,该编程器是用ISP的方式来编程,当然你也可以自行修改为用并行方式编程。 到现在你是否会奇怪,程序是如何调用不同的子程序对不同型号的芯片进行操作呢?答案可以看主程序包含的文件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; 再看看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;
} 类似地,我们也能在AT89C2051PRO.C和AT89S51PRO.C中找到相似的函数。 到这里,你接下来要做的事,就是好好读一下主程序E51P.C了 最后若各位有什么见解或问题的话,欢迎一起探讨 |