欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7402|回復: 7
打印 上一主題 下一主題
收起左側

AT89C51單片機簡易在線編程實現

  [復制鏈接]
跳轉到指定樓層
樓主
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文件數據,并寫到片外數據存儲器。


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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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中,掉電不失的那種。
回復

使用道具 舉報

5#
ID:716413 發表于 2020-4-16 15:26 | 只看該作者
這個適合于編程實驗,很方便,我現在就用這個。
應用當然燒錄好。
回復

使用道具 舉報

6#
ID:716413 發表于 2020-4-17 21:22 | 只看該作者
今天發現傳送程序不穩定,字節忽多忽少。
多方查找不是波特率高了的問題,原因在于超級終端只管發,有時前后字節搞串了。
把超級終端設為2個停止位就好了。
回復

使用道具 舉報

7#
ID:716413 發表于 2020-4-18 22:28 | 只看該作者
一定要按住復位鍵,撥動編程運行切換開關。切換時,有不確定因素,可能改寫了數據,先按住復位鍵,就不會改動了,松開就運行。
回復

使用道具 舉報

8#
ID:137736 發表于 2020-5-17 21:49 來自觸屏版 | 只看該作者
可行,轉換開關最好用門電咯
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表