最开始学习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 ,电平转换电路如下