最開始學習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 ,電平轉換電路如下