ESP-01S無線下載器

2023-01-18 06:01:21

 

-專案概述-

最開始學習51的時候,總是「冷啟動」,手動按動開關重啟,下載一次程式重啟一次,覺得很麻煩

而且另一方面,我的最小系統板是有自帶電源的,那麼這根傳輸線也顯得有些多餘了,於是打算做一個「無線自動燒錄器」。

目的:

  •  程式傳送特定重啟指令實現「熱啟動」。
  • ESP-01S作為無線串列埠使用。
  • 燒錄器埠指定。

材料清單:51系統板一塊(STC8G1K08),ESP-01S模組兩個(收發),CH340G下載模組

注意:我用的是51微控制器是STC8G系列,對於老版本的STC89C52能否使用特定指令重啟,需要自己去檢視資料手冊,具體位置下面會提到。

 

-成品預覽-

 

-專案框架-

這個專案硬體邏輯很簡單,主要在於特定指令重啟這一塊,查閱檔案很麻煩,整體流程如下:

 

-硬體資料,程式碼-

  • ISP軟復位方法:

    根據STC8G晶片檔案(下文文末):

                

    一共有四種方法,這裡我選擇串列埠特定指令檢測復位,其餘方法可以自己查閱檔案偵錯。

    關鍵程式碼:

  • IAP_CONTR = 0x60; //復位到系統區
  • #include "reg51.h"
    #include "intrins.h"
    #define FOSC 11059200UL
    #define BR115200 (65536 - FOSC / 4 / 115200)
    sfr IAP_CONTR = 0xc7;
    sfr AUXR = 0x8e;
    sfr P3M0 = 0xb2;
    sfr P3M1 = 0xb1;
    char stage;
    
    /*
    每一次讀取一個字元,噹噹前字元滿足要求,(每一個case的if語句作用)
    就判斷下一位是否滿足要求,如果全部滿足,(每一行stage作用)
    就執行跳轉指令。如果當中有一位不滿足,
    就從新跳轉到第一位,重新進行判斷。(go to 語句作用)
    */
    void UartIsr() interrupt 4 //串列埠中斷服務程式
    {
        char dat;
        if (TI)
        {
            TI = 0;
        }
        if (RI)
        {
            RI = 0;
            dat = SBUF;
            switch (stage)
            {
                case 0:
                default:
                L_Check1st:
                if (dat == 'S') stage = 1;
                else stage = 0;
                break;
                
                case 1:
                if (dat == 'T') stage = 2;
                else goto L_Check1st;
                break;
                
                case 2:
                if (dat == 'C') stage = 3;
                else goto L_Check1st;
                break;
                
                case 3:
                if (dat == 'I') stage = 4;
                else goto L_Check1st;
                break;
                
                case 4:
                if (dat == 'S') stage = 5;
                else goto L_Check1st;
                break;
                
                case 5:
                if (dat == 'P') stage = 6;
                else goto L_Check1st;
                break;
                
                case 6:
                if (dat == '$') //當檢測到正確的使用者下載命令時
                IAP_CONTR = 0x60; //復位到系統區
                else goto L_Check1st;
                break;
            }
        }
    }
    void main()
    {
        P3M0 = 0x00;
        P3M1 = 0x00;
        SCON = 0x50;
        TMOD = 0x00;
        AUXR = 0x40;
        TH1 = BR115200 >> 8; //設定串列埠波特率為 115200
        TL1 = BR115200;
        TR1 = 1;
        ES = 1;
        EA = 1;
        stage = 0;
        while (1)
        {
        }
    }

   

專案全部檔案:

個人部落格下方私信領取

http://potatoworld.top:5800/

最後,下載成功,非常nice ~

 

 

-專案槽點-

  • 對於STC新系列的微控制器,串列埠暫存器相關的設定還是交給軟體去做吧,想要自己設定練練手的拿STC89系列就夠了

      切記。新系列需要設定AUXR暫存器,具體設定方式檢視資料手冊,也可以STC燒錄器自帶的

    

  • 注意電平轉換,5V轉3.3V ,電平轉換電路如下