找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7179|回复: 19
收起左侧

ESP8266与51单片机系统与上位机通信实例 附源程序

[复制链接]
ID:506248 发表于 2021-4-30 19:42 | 显示全部楼层 |阅读模式
很久很久以前楼主跟着QQ群友一起撸了好几块ESP8266的模块
最近一段时间比较闲,拿出尘封的往事,哦不对是ESP8266模块,决定研究研究!
在网上查找各种资料,例程,过程挺难的
虽然现在还是很迷茫,但应该算是入门了
至少能用手机和电脑控制模块了。AT指令俺还没学全呢,用到了再说吧!
手机app俺是不会编写的,楼主唯一会的上位机软件就是DELPHI 7.0
下面看楼主是如何实现用电脑通过ESP8266模块控制STC15W408AS单片机的。
(楼主很菜,大神自行绕道,本文是写给和楼主一样的小白的

感谢: a1bc2de3f 的帖子,我是跟他那学会的,感谢51黑论坛提供的平台

本文将贴出所有使用到的源代码,包括上位机的。




评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:506248 发表于 2021-4-30 19:55 | 显示全部楼层
本帖最后由 欣欣 于 2021-4-30 20:19 编辑

本例实现的功能:用上位机软件通过ESP8266模块控制STC15W408AS单片机以点了LED指示灯
主要元件:ESP-01S(ESP8266)模块 一个
STC15W408AS单片机  一个 因为这个单片机支持3.3V电压
发光二极管   N个
电阻    5.1K  N个
所使用的软件有:
protel(画电路图)
delphi7.0(编写上位机软件)
keil5 V5.11.0.0(编写单片机软件)STC-ISP V6.88(下载单片机程序)
楼主电脑系统是WIN7 旗舰版

回复

使用道具 举报

ID:506248 发表于 2021-4-30 20:42 | 显示全部楼层
1:先传一张电气原理图,画图也需要好长时间呢
1.png
尽量不弄的太复杂,避免新手因太难而半途而废,大家可以看到楼主没有用
晶振及复位电路,因为STC15W408AS这款单片机已经内置了这些,所以没加,连电源都用的USB-TLL程序烧写器代替了,实际上应该给他
加一个1117 3.3的,但本例旨在让大家看懂原理,而非追求系统稳定性。
所以楼主偷一下懒,请大家原谅。

注意:本贴在编写过程中难免会有疏忽的问题,所以可能也会回头更改编辑之前楼层的帖子哦!
所以请大家耐心一点,跟随楼主的步伐,一点一点的来,别着急,罗马不是一天建成的。

回复

使用道具 举报

ID:506248 发表于 2021-4-30 20:52 | 显示全部楼层
上传几张图,简单说明一下各个模块的引脚,免的大家还要自己去找ESP-01S和STC15W408AS引脚图

1.png

2.png


回复

使用道具 举报

ID:506248 发表于 2021-4-30 21:25 | 显示全部楼层
硬件连接:先来连接单片机与指示灯部分的,先把指示功能部分的程序调通了再去连接ESP-01S模块
图中实验板是楼主以前为了实验方便做的,虽然灯比较多,实际我只用了3个,连接完全按照电气原理图连的哦!
1.png
回复

使用道具 举报

ID:506248 发表于 2021-4-30 22:26 | 显示全部楼层
//STC15W408AS单片机程序源代码如下:
//QQ:9173002 STC15W408AS @11.0592MHZ
#include <reg52.h>
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
sfr P5          =   0xc8;
sfr AUXR        =   0x8E;   
sfr T2H         =   0xD6;   
sfr T2L         =   0xD7;   

sbit LED1=P1^2;
sbit LED2=P1^5;
sbit LED3=P5^5;

u8 receive[2];
u8 sign=0;

void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 8;
        j = 1;
        k = 243;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void Init()//115200bps@11.0592MHz
{
        SCON = 0x50;               
        AUXR |= 0x01;               
        AUXR |= 0x04;               
        T2L = 0xE8;               
        T2H = 0xFF;               
        AUXR |= 0x10;               
        TR1 = 1;
}

void send(u8 value)
{
        ES=0;
        TI=0;
        SBUF=value;
        while(!TI);
        TI=0;
        ES=1;
}

void wifi_init()
{
          u8 j=0;
          u8 a[]="AT+CWMODE=2\r\n";        //1=station 2=ap 3=station+ap          
          u8 b[]="AT+CIOBAUD=115200\r\n";//BAND
          u8 c[]="AT+CWSAP_DEF=\"My_8266\",\"1234567890\",1,0,3,0\r\n";        //set wifi         
          u8 d[]="AT+CIPMUX=1\r\n";                  
          u8 e[]="AT+CIPSERVER=1,1111\r\n";
          j=0;        
         while(a[j]!='\0')
        {
               send(a[j]);
            j++;
        }
          j=0;                                
         Delay1000ms();
          while(b[j]!='\0')
        {
            send(b[j]);
            j++;
         }
         Delay1000ms();
         j=0;                                
         while(c[j]!='\0')
         {
             send(c[j]);
             j++;
         }
         Delay1000ms();
         j=0;                                
         while(d[j]!='\0')
        {
            send(d[j]);
            j++;
        }
        Delay1000ms();
        j=0;                                
        while(e[j]!='\0')
       {
           send(e[j]);
           j++;
       }
       Delay1000ms();
}

void wifi_data()
{
        if(receive[0]=='A')                  
        {
                LED1=0;
        }
        if(receive[0]=='B')                 
        {
                LED1=1;
        }
        if(receive[0]=='C')                  
        {
                LED2=0;
        }
        if(receive[0]=='D')                 
        {
                LED2=1;
        }
        if(receive[0]=='E')                  
        {
                LED1=0;
                LED2=0;
        }
        if(receive[0]=='F')                 
        {
                LED1=1;
                LED2=1;
        }       
}   

void main()
{
        Init();
        EA = 1;
        ES = 0;
        wifi_init();
        while(1)
        {
                wifi_data();
        }
}

void ZD() interrupt 4
{
        LED3=~LED3;
        if(RI)
        {
                RI=0;
                if(sign==1)
                {
                        receive[0]=SBUF;
                        sign=0;                       
                }
                if(SBUF==':')            
                {
                        sign=1;
                }
        }
}
//程序的主要算法来自 网友 a1bc2de3f

回复

使用道具 举报

ID:506248 发表于 2021-4-30 22:29 | 显示全部楼层
1.png
如图所示,先设置好框2内串口波特率等参数后,并打开串口,
别忘记点选程序下载完成后打开串口选项。
将程序下载到单片机 我们将从框3看到单片机发送给ESP-01S模块
的初始化指令,实际上这些指令是传给ESP-01S模块的,只是因为
现在单片机的串口连在电脑上,我们可以监控得到而已,借此我们可以
看看我们期望单片机发送的AT指令是否正确!
框4里是我们需要用到的指令,将来我们将通过网络ESP-01s模块控制单片机的
暂时用电脑模拟ESP-01S模块给单片机传送指令,看是否是我们期望的。
据我观察完全正确,我们离成功越来越近了,请跟随我的步伐揭露真相吧!
回复

使用道具 举报

ID:506248 发表于 2021-4-30 22:56 | 显示全部楼层
下面我们用DELPHI7.0编写上位机软件 将用到关键控件为 indy clients 标签页内的 IdTCPClient 控件添加6个按钮控件 和 一个IdTCPClient 控件 如图所示


51hei.png


程序代码如下:(注意6个按钮都用这一个代码,变量i是用来区分它们的,也就是说它们的tag属性分别是1~6)
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
   i:=(Sender As TButton).tag;
   IdTCPClient1.Host:='192.168.4.1';
   IdTCPClient1.Port:=1111;
   IdTCPClient1.Connect();
   case i of
      1:IdTCPClient1.WriteLn('A');
      2:IdTCPClient1.WriteLn('B');
      3:IdTCPClient1.WriteLn('C');
      4:IdTCPClient1.WriteLn('D');
      5:IdTCPClient1.WriteLn('E');
      6:IdTCPClient1.WriteLn('F');
   end;
   IdTCPClient1.Disconnect;
end;


回复

使用道具 举报

ID:506248 发表于 2021-4-30 23:07 | 显示全部楼层
下面我们将ESP-01S模块联入系统,如下图所示
1.png
重新上电两次,以便单片机初始化ESP-01S模块,为啥要
重新上电两次,自己考虑吧,吃别人嚼过的馍不香。

回复

使用道具 举报

ID:506248 发表于 2021-4-30 23:10 | 显示全部楼层
然后我的电脑就能收到wifi信号了,如图所示,我们跟他连接上。
51hei.png
回复

使用道具 举报

ID:506248 发表于 2021-4-30 23:35 | 显示全部楼层
断开烧录器与单片机的串口线,只保留电源线,我们就快乐的玩耍了。
下面我把源码奉上

上位机软件功能就是通过WIFI网络传送 A  B  C  D  E  F这几个字母给单片机而已,原理也很简单。
毕竟楼主现在还只会点皮毛。
接下来我将去学如何在安卓手机上编写上位机程序了,希望会这个的师兄赐教!




8266_51系统与上位机实验全部源码.rar

208.59 KB, 下载次数: 35, 下载积分: 黑币 -5

回复

使用道具 举报

ID:506248 发表于 2021-5-1 02:19 | 显示全部楼层
'经过2个小时的奋战,终于用E4A编出了手机控制程序,程序代码如下,能实现和电脑完全一样的功能(我可是现学的哦)
事件 按钮1.被单击()
        客户1.连接服务器("192.168.4.1",1111,5000)
        保存对象("客户1",客户1)
结束 事件

事件 客户1.连接完毕(连接结果 为 逻辑型)
        如果 连接结果 = 真 则
                 按钮1.可视=假
             按钮2.可视=真
             按钮3.可视=真
             按钮4.可视=真
             按钮5.可视=真
             按钮6.可视=真
             按钮7.可视=真
             按钮8.可视=真
        结束 如果
结束 事件

事件 按钮8.被单击()
        客户1.断开连接()
        按钮1.可视=真
        按钮2.可视=假
        按钮3.可视=假
        按钮4.可视=假
        按钮5.可视=假
        按钮6.可视=假
        按钮7.可视=假
        按钮8.可视=假
结束 事件

事件 按钮2.被单击()
        变量 字节集 为 字节型(1)
        字节集(0)=65
        客户1.发送数据(字节集)
结束 事件

事件 按钮3.被单击()
        变量 字节集 为 字节型(1)
        字节集(0)=66
        客户1.发送数据(字节集)
结束 事件

事件 按钮4.被单击()
        变量 字节集 为 字节型(1)
        字节集(0)=67
        客户1.发送数据(字节集)       
结束 事件

事件 按钮5.被单击()
        变量 字节集 为 字节型(1)
        字节集(0)=68
        客户1.发送数据(字节集)       
结束 事件

事件 按钮6.被单击()
        变量 字节集 为 字节型(1)
        字节集(0)=69
        客户1.发送数据(字节集)       
结束 事件

事件 按钮7.被单击()
        变量 字节集 为 字节型(1)
        字节集(0)=70
        客户1.发送数据(字节集)       
结束 事件

'至此整个帖子就完成了,已经达到立贴时的目标,不知道你们学会了吗?有问题可以提问哦,共同进步啊!
回复

使用道具 举报

ID:333678 发表于 2021-5-5 10:35 | 显示全部楼层
欣欣 发表于 2021-5-1 02:19
'经过2个小时的奋战,终于用E4A编出了手机控制程序,程序代码如下,能实现和电脑完全一样的功能(我可是现学 ...

非常感谢楼主无私奉献!学习了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表