AT89C51简易在线编程
问题: AT89C51一般只能在专业编程器上烧录,每次改动程序,要从目标板上撬下芯片,烧录后再插上运行。我的烧录器TOP851软件只能在XP上运行,还要再开一个电脑,实在是很麻烦。 怎样实现在线编程呢?麻烦的是AT89C51没有SPI口,如果在编程器上做文章,需要很多口线。 我的要求是,PC机通过串口对AT89C51目标板编程。
思路: AT89C51的EA(31脚)可以选择执行片内程序(H),还是片外程序(L),我们就可以控制这个引脚,实现“在线编程”。 1、编程。先设置为EA=H,片内程序接收串口程序数据,并将此写到目标板片外数据存储器起始地址为0X8000的地方。 2、运行。不断电,设置EA=L, 按一下目标板复位键,片外数据存储器变成了片外程序存储器,从这个片外程序存储器的0X0000地址开始运行。 这就实现了“在线编程”。
要点: 看到这里,你可以发现两个问题,这也就是本方案的“精华”。 1、片外数据存储器变成了片外程序存储器?AT89C51片外数据存储器和片外程序存储器始终地址都是0X0000--0XFFFF,区分在PSEN(29脚)为片外程序存储器读信号,RD(17脚)为片外数据存储器读信号,这两个信号不会同时出现,本方案把这两个信号线连在一起,接到片外数据存储器(我使用的是62256)22脚(读控制),很多资料说要用一个与门,别信他的,我试验过,直接连上就可以。在今后的实验中,这个空间使用要小心,不要把程序覆盖了。如果把这个信号用开关切换,就没有限制了,我这是懒人懒法。 2、程序写在片外数据存储器起始地址为0X8000的地方(应该0X0000也行,我没有试过),执行的时候又从片外程序存储器的0X0000地址开始运行? 为了省掉地址译码器,62256片选(29脚)直接接地,存储器地址就是0X0000--0X7FFF,重复地址是0X8000--0XFFFF。 用下边的测试程序,片内片外运行成功。
硬件改造归纳如下: 1、找一个现成的应用板,AT89C51带片外数据存储器,带串口转换接口。 2、连接AT89C51的PSEN(29脚)和RD(17脚)。 3、编程运行转换开关,单刀双掷,中间是AT89C51的EA(31脚),一边接电源+极,一边接地。
下段要编写两个程序,一是PC机发送HEX文件,一边是AT89C51接收处理HEX文件数据,并写到片外数据存储器。
#include<AT89x51.H>
unsigned char code *pic; //读程序区 unsigned char xdata *pid; //写外存数据 void code_xdata() { char x; pic=0x0000; pid=0x8000;
for(x=0;x<0x60;x++) { *(pid+x)=*(pic+x); } } //////////////////////////////// void main() { char x,y; P1=0X05; code_xdata(); while(1) { for(x=240;x>0;x--) for(y=210;y>0;y--);
P1^=0x0f; }
}
全部程序51hei下载地址:
试验.zip
(4.16 KB, 下载次数: 18)
|