找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6369|回复: 7
收起左侧

AT89C51单片机简易在线编程实现

  [复制链接]
ID:716413 发表于 2020-4-14 21:12 | 显示全部楼层 |阅读模式
AT89C51简易在线编程

问题:
AT89C51一般只能在专业编程器上烧录,每次改动程序,要从目标板上撬下芯片,烧录后再插上运行。我的烧录器TOP851软件只能在XP上运行,还要再开一个电脑,实在是很麻烦。
怎样实现在线编程呢?麻烦的是AT89C51没有SPI口,如果在编程器上做文章,需要很多口线。
我的要求是,PC机通过串口对AT89C51目标板编程。

思路:
AT89C51EA(31)可以选择执行片内程序(H,还是片外程序(L,我们就可以控制这个引脚,实现“在线编程”。
1、编程。先设置为EA=H,片内程序接收串口程序数据,并将此写到目标板片外数据存储器起始地址为0X8000的地方。
2、运行。不断电,设置EA=L, 按一下目标板复位键,片外数据存储器变成了片外程序存储器,从这个片外程序存储器的0X0000地址开始运行。
这就实现了“在线编程”。

要点:
看到这里,你可以发现两个问题,这也就是本方案的“精华”。
1、片外数据存储器变成了片外程序存储器?AT89C51片外数据存储器和片外程序存储器始终地址都是0X0000--0XFFFF,区分在PSEN29脚)为片外程序存储器读信号,RD(17)为片外数据存储器读信号,这两个信号不会同时出现,本方案把这两个信号线连在一起,接到片外数据存储器(我使用的是6225622脚(读控制),很多资料说要用一个与门,别信他的,我试验过,直接连上就可以。在今后的实验中,这个空间使用要小心,不要把程序覆盖了。如果把这个信号用开关切换,就没有限制了,我这是懒人懒法。
2、程序写在片外数据存储器起始地址为0X8000的地方(应该0X0000也行,我没有试过),执行的时候又从片外程序存储器的0X0000地址开始运行?
为了省掉地址译码器,62256片选(29脚)直接接地,存储器地址就是0X0000--0X7FFF,重复地址是0X8000--0XFFFF
用下边的测试程序,片内片外运行成功。

硬件改造归纳如下:
1、找一个现成的应用板,AT89C51带片外数据存储器,带串口转换接口。
2、连接AT89C51PSEN29脚)和RD(17)
3、编程运行转换开关,单刀双掷,中间是AT89C51EA(31),一边接电源+极,一边接地。

下段要编写两个程序,一是PC机发送HEX文件,一边是AT89C51接收处理HEX文件数据,并写到片外数据存储器。
51hei图片20200414215203.png

#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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:716413 发表于 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){;}
}



回复

使用道具 举报

ID:716103 发表于 2020-4-16 10:32 | 显示全部楼层
这种一断电,SRAM中的程序就没有了。当然可以采用外部电池来保持SRAM中的内容。
回复

使用道具 举报

ID:716103 发表于 2020-4-16 10:34 | 显示全部楼层
其实原来ATMEL,现在MicroChip的AT89S52是支持PC串口或并口编程的。是真正的烧录到AT89S52中,掉电不失的那种。
回复

使用道具 举报

ID:716413 发表于 2020-4-16 15:26 | 显示全部楼层
这个适合于编程实验,很方便,我现在就用这个。
应用当然烧录好。
回复

使用道具 举报

ID:716413 发表于 2020-4-17 21:22 | 显示全部楼层
今天发现传送程序不稳定,字节忽多忽少。
多方查找不是波特率高了的问题,原因在于超级终端只管发,有时前后字节搞串了。
把超级终端设为2个停止位就好了。
回复

使用道具 举报

ID:716413 发表于 2020-4-18 22:28 | 显示全部楼层
一定要按住复位键,拨动编程运行切换开关。切换时,有不确定因素,可能改写了数据,先按住复位键,就不会改动了,松开就运行。
回复

使用道具 举报

ID:137736 发表于 2020-5-17 21:49 来自手机 | 显示全部楼层
可行,转换开关最好用门电咯
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表