找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8858|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

ESP8266與51單片機系統(tǒng)與上位機通信實例 附源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:506248 發(fā)表于 2021-4-30 19:42 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
很久很久以前樓主跟著QQ群友一起擼了好幾塊ESP8266的模塊,
最近一段時間比較閑,拿出塵封的往事,哦不對是ESP8266模塊,決定研究研究!
在網(wǎng)上查找各種資料,例程,過程挺難的。
雖然現(xiàn)在還是很迷茫,但應(yīng)該算是入門了,
至少能用手機和電腦控制模塊了。AT指令俺還沒學(xué)全呢,用到了再說吧!
手機app俺是不會編寫的,樓主唯一會的上位機軟件就是DELPHI 7.0
下面看樓主是如何實現(xiàn)用電腦通過ESP8266模塊控制STC15W408AS單片機的。
(樓主很菜,大神自行繞道,本文是寫給和樓主一樣的小白的

感謝: a1bc2de3f 的帖子,我是跟他那學(xué)會的,感謝51黑論壇提供的平臺

本文將貼出所有使用到的源代碼,包括上位機的。




評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:506248 發(fā)表于 2021-4-30 19:55 | 只看該作者
本帖最后由 欣欣 于 2021-4-30 20:19 編輯

本例實現(xiàn)的功能:用上位機軟件通過ESP8266模塊控制STC15W408AS單片機以點了LED指示燈
主要元件:ESP-01S(ESP8266)模塊 一個
STC15W408AS單片機  一個 因為這個單片機支持3.3V電壓
發(fā)光二極管   N個
電阻    5.1K  N個
所使用的軟件有:
protel(畫電路圖)
delphi7.0(編寫上位機軟件)
keil5 V5.11.0.0(編寫單片機軟件)STC-ISP V6.88(下載單片機程序)
樓主電腦系統(tǒng)是WIN7 旗艦版

回復(fù)

使用道具 舉報

板凳
ID:506248 發(fā)表于 2021-4-30 20:42 | 只看該作者
1:先傳一張電氣原理圖,畫圖也需要好長時間呢

盡量不弄的太復(fù)雜,避免新手因太難而半途而廢,大家可以看到樓主沒有用
晶振及復(fù)位電路,因為STC15W408AS這款單片機已經(jīng)內(nèi)置了這些,所以沒加,連電源都用的USB-TLL程序燒寫器代替了,實際上應(yīng)該給他
加一個1117 3.3的,但本例旨在讓大家看懂原理,而非追求系統(tǒng)穩(wěn)定性。
所以樓主偷一下懶,請大家原諒。

注意:本貼在編寫過程中難免會有疏忽的問題,所以可能也會回頭更改編輯之前樓層的帖子哦!
所以請大家耐心一點,跟隨樓主的步伐,一點一點的來,別著急,羅馬不是一天建成的。

回復(fù)

使用道具 舉報

地板
ID:506248 發(fā)表于 2021-4-30 20:52 | 只看該作者
上傳幾張圖,簡單說明一下各個模塊的引腳,免的大家還要自己去找ESP-01S和STC15W408AS引腳圖






回復(fù)

使用道具 舉報

5#
ID:506248 發(fā)表于 2021-4-30 21:25 | 只看該作者
硬件連接:先來連接單片機與指示燈部分的,先把指示功能部分的程序調(diào)通了再去連接ESP-01S模塊
圖中實驗板是樓主以前為了實驗方便做的,雖然燈比較多,實際我只用了3個,連接完全按照電氣原理圖連的哦!

回復(fù)

使用道具 舉報

6#
ID:506248 發(fā)表于 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;
                }
        }
}
//程序的主要算法來自 網(wǎng)友 a1bc2de3f

回復(fù)

使用道具 舉報

7#
ID:506248 發(fā)表于 2021-4-30 22:29 | 只看該作者

如圖所示,先設(shè)置好框2內(nèi)串口波特率等參數(shù)后,并打開串口,
別忘記點選程序下載完成后打開串口選項。
將程序下載到單片機 我們將從框3看到單片機發(fā)送給ESP-01S模塊
的初始化指令,實際上這些指令是傳給ESP-01S模塊的,只是因為
現(xiàn)在單片機的串口連在電腦上,我們可以監(jiān)控得到而已,借此我們可以
看看我們期望單片機發(fā)送的AT指令是否正確!
框4里是我們需要用到的指令,將來我們將通過網(wǎng)絡(luò)ESP-01s模塊控制單片機的
暫時用電腦模擬ESP-01S模塊給單片機傳送指令,看是否是我們期望的。
據(jù)我觀察完全正確,我們離成功越來越近了,請跟隨我的步伐揭露真相吧!
回復(fù)

使用道具 舉報

8#
ID:506248 發(fā)表于 2021-4-30 22:56 | 只看該作者
下面我們用DELPHI7.0編寫上位機軟件 將用到關(guān)鍵控件為 indy clients 標簽頁內(nèi)的 IdTCPClient 控件添加6個按鈕控件 和 一個IdTCPClient 控件 如圖所示





程序代碼如下:(注意6個按鈕都用這一個代碼,變量i是用來區(qū)分它們的,也就是說它們的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;


回復(fù)

使用道具 舉報

9#
ID:506248 發(fā)表于 2021-4-30 23:07 | 只看該作者
下面我們將ESP-01S模塊聯(lián)入系統(tǒng),如下圖所示

重新上電兩次,以便單片機初始化ESP-01S模塊,為啥要
重新上電兩次,自己考慮吧,吃別人嚼過的饃不香。

回復(fù)

使用道具 舉報

10#
ID:506248 發(fā)表于 2021-4-30 23:10 | 只看該作者
然后我的電腦就能收到wifi信號了,如圖所示,我們跟他連接上。

回復(fù)

使用道具 舉報

11#
ID:506248 發(fā)表于 2021-4-30 23:35 | 只看該作者
斷開燒錄器與單片機的串口線,只保留電源線,我們就快樂的玩耍了。
下面我把源碼奉上

上位機軟件功能就是通過WIFI網(wǎng)絡(luò)傳送 A  B  C  D  E  F這幾個字母給單片機而已,原理也很簡單。
畢竟樓主現(xiàn)在還只會點皮毛。
接下來我將去學(xué)如何在安卓手機上編寫上位機程序了,希望會這個的師兄賜教!




8266_51系統(tǒng)與上位機實驗全部源碼.rar

208.59 KB, 下載次數(shù): 37, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

12#
ID:506248 發(fā)表于 2021-5-1 02:19 | 只看該作者
'經(jīng)過2個小時的奮戰(zhàn),終于用E4A編出了手機控制程序,程序代碼如下,能實現(xiàn)和電腦完全一樣的功能(我可是現(xiàn)學(xué)的哦)
事件 按鈕1.被單擊()
        客戶1.連接服務(wù)器("192.168.4.1",1111,5000)
        保存對象("客戶1",客戶1)
結(jié)束 事件

事件 客戶1.連接完畢(連接結(jié)果 為 邏輯型)
        如果 連接結(jié)果 = 真 則
                 按鈕1.可視=假
             按鈕2.可視=真
             按鈕3.可視=真
             按鈕4.可視=真
             按鈕5.可視=真
             按鈕6.可視=真
             按鈕7.可視=真
             按鈕8.可視=真
        結(jié)束 如果
結(jié)束 事件

事件 按鈕8.被單擊()
        客戶1.斷開連接()
        按鈕1.可視=真
        按鈕2.可視=假
        按鈕3.可視=假
        按鈕4.可視=假
        按鈕5.可視=假
        按鈕6.可視=假
        按鈕7.可視=假
        按鈕8.可視=假
結(jié)束 事件

事件 按鈕2.被單擊()
        變量 字節(jié)集 為 字節(jié)型(1)
        字節(jié)集(0)=65
        客戶1.發(fā)送數(shù)據(jù)(字節(jié)集)
結(jié)束 事件

事件 按鈕3.被單擊()
        變量 字節(jié)集 為 字節(jié)型(1)
        字節(jié)集(0)=66
        客戶1.發(fā)送數(shù)據(jù)(字節(jié)集)
結(jié)束 事件

事件 按鈕4.被單擊()
        變量 字節(jié)集 為 字節(jié)型(1)
        字節(jié)集(0)=67
        客戶1.發(fā)送數(shù)據(jù)(字節(jié)集)       
結(jié)束 事件

事件 按鈕5.被單擊()
        變量 字節(jié)集 為 字節(jié)型(1)
        字節(jié)集(0)=68
        客戶1.發(fā)送數(shù)據(jù)(字節(jié)集)       
結(jié)束 事件

事件 按鈕6.被單擊()
        變量 字節(jié)集 為 字節(jié)型(1)
        字節(jié)集(0)=69
        客戶1.發(fā)送數(shù)據(jù)(字節(jié)集)       
結(jié)束 事件

事件 按鈕7.被單擊()
        變量 字節(jié)集 為 字節(jié)型(1)
        字節(jié)集(0)=70
        客戶1.發(fā)送數(shù)據(jù)(字節(jié)集)       
結(jié)束 事件

'至此整個帖子就完成了,已經(jīng)達到立貼時的目標,不知道你們學(xué)會了嗎?有問題可以提問哦,共同進步!
回復(fù)

使用道具 舉報

13#
ID:333678 發(fā)表于 2021-5-5 10:35 | 只看該作者
欣欣 發(fā)表于 2021-5-1 02:19
'經(jīng)過2個小時的奮戰(zhàn),終于用E4A編出了手機控制程序,程序代碼如下,能實現(xiàn)和電腦完全一樣的功能(我可是現(xiàn)學(xué) ...

非常感謝樓主無私奉獻!學(xué)習了。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表