标题: AT89C51单片机简易在线编程实现 [打印本页]
作者: 新洲罗远 时间: 2020-4-14 21:12
标题: AT89C51单片机简易在线编程实现
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, 下载次数: 19)
作者: 新洲罗远 时间: 2020-4-16 06:58
写入片外数据存储器起始地址为0X0000是一样的。
HEX文件处理太麻烦,用HEX2BIN.EXE转换为BIN文件(程序内存映像文件,什么附加也没有),用超级终端发送,每写一个字节,又读出发送回来。
试验完成!
#include<AT892051.H>
//UART init
void initUart(void)
{
TMOD|=0x20;
SCON=0x50;
PCON|=0x80;
TH1=0xfa;
TL1=0xfa;
TR1=1;
ES=1; //串口中断许可
}
//////////////////////////////////////uart interrupt////////////
unsigned char xdata *xpi; //写外存地址
//uart interrupt
void uart(void) interrupt 4
{
if(RI)
{
RI=0;
//add your code here.
*xpi = SBUF; //接收到数据
SBUF=*xpi; // 数据发送回PC
xpi++;
}
else
TI=0;
}
////////////////////////the main fun/////////
void main(void)
{
initUart();
xpi=0x0000; //写外存地址
EA=1; //总中断许可
while(1){;}
}
作者: yangalex 时间: 2020-4-16 10:32
这种一断电,SRAM中的程序就没有了。当然可以采用外部电池来保持SRAM中的内容。
作者: yangalex 时间: 2020-4-16 10:34
其实原来ATMEL,现在MicroChip的AT89S52是支持PC串口或并口编程的。是真正的烧录到AT89S52中,掉电不失的那种。
作者: 新洲罗远 时间: 2020-4-16 15:26
这个适合于编程实验,很方便,我现在就用这个。
应用当然烧录好。
作者: 新洲罗远 时间: 2020-4-17 21:22
今天发现传送程序不稳定,字节忽多忽少。
多方查找不是波特率高了的问题,原因在于超级终端只管发,有时前后字节搞串了。
把超级终端设为2个停止位就好了。
作者: 新洲罗远 时间: 2020-4-18 22:28
一定要按住复位键,拨动编程运行切换开关。切换时,有不确定因素,可能改写了数据,先按住复位键,就不会改动了,松开就运行。
作者: zmc419 时间: 2020-5-17 21:49
可行,转换开关最好用门电咯
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |