gpt4 book ai didi

ESP-01S无线下载器

转载 作者:我是一只小鸟 更新时间:2023-01-17 22:31:16 29 4
gpt4 key购买 nike

  • 文章结构:
  •  项目概述
  • 成品预览
  • 项目框架
  • 硬件资料,代码
  • 项目槽点

  。

-项目概述- 。

最开始学习51的时候,总是“冷启动”,手动按动开关重启,下载一次程序重启一次,觉得很麻烦 。

而且另一方面,我的最小系统板是有自带电源的,那么这根数据线也显得有些多余了,于是打算做一个“无线自动烧录器”.

目的:

  •  程序发送特定重启指令实现“热启动”。
  • ESP-01S作为无线串口使用。
  • 烧录器端口指定。

材料清单:51系统板一块(STC8G1K08),ESP-01S模块两个(收发),CH340G下载模块 。

注意:我用的是51单片机是STC8G系列,对于老版本的STC89C52能否使用特定指令重启,需要自己去查看数据手册,具体位置下面会提到.

  。

-成品预览- 。

  。

-项目框架- 。

这个项目硬件逻辑很简单,主要在于特定指令重启这一块,查阅文档很麻烦,整体流程如下:

  。

-硬件资料,代码- 。

  • ISP软复位方法:

    根据STC8G芯片文档(下文文末):

                 。

    一共有四种方法,这里我选择串口特定指令检测复位,其余方法可以自己查阅文档调试.

    关键代码:

  • I AP_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 ,电平转换电路如下

  。

最后此篇关于ESP-01S无线下载器的文章就讲到这里了,如果你想了解更多关于ESP-01S无线下载器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com