ESP8266與51單片機無線通信控制LED燈實現思路其實很簡單.串口通信中我們很容易就可以實現發送字符控制LED的反轉,其實要實現無線通信,無非就是要用無線的ESP8266WiFi模塊去代替有線的串口通信收發數據,以下案例中發的相關數據進入串口中斷服務程序中,串口中斷收到數據,進行條件判斷,從而去執行中斷服務程序中的指示,進而控制LED燈的反轉.
實戰經驗分享
硬件: 51單片機 ESP8266-01模塊 USB轉TTL DCDC降壓器 乾電池 麪包板 杜邦線若干
編程軟件:keil
1.ESP8266的三種工作模式
(1)AP模式(模塊作爲熱點,可以發散出wifi信號,實現手機或電腦直接與模塊通訊,實現局域網無線控制)
(2)STA模式(模塊通過路由器連接互聯網,手機或電腦通過互聯網實現對設備的遠程控制)
(3)STA+AP模式(兩種模式的共存即可通過互聯網控制可實現無縫對接切換)
注:AT指令網上有,這裏不做過多介紹,下面調試用到的都做了詳細介紹.
2.ESP8266可以實現的主要功能
(1)串口透傳(數據傳輸可靠性好,Max爲46088bps)
(2)PWM調控(燈光調節,三色LED調節,電機調速)
(3)GPIO控制(控制開關,繼電器等)
3.ESP8266與USB轉TTL的連接
圖一爲ESP8266的接線方法用於圖二中的2,圖二中的1可以直接與電腦的USB接口相連,上電後ESP8266紅燈常亮,藍燈閃爍2~3下,模塊正常可刷入AT指令.
4.ESP8266工作模式的選擇及AT指令的刷入
ESP8266配置成服務器(PC或單片機發指令):
(1) 測試AT指令:AT
(2) 更改模塊波特率: AT+CIOBAUD=9600 (波特率設置成功後要更改後再進行設置其它波特率)
(3) 復位重啓模塊:AT+RST
(4) 設置爲AP模式:AT+CWMODE=2
(5) 設置name password,加密方式:AT+CWSAP="esp8266","0123456789",11,4
(6) 查看主機端的ip地址:AT+CIFSR(此處的IP地址是模塊本身的IP,不是ST模式中加入路由器後分配的IP)
(7) 設置模塊傳輸模式爲TCP模式:AT+CIPMODE=0
(8) 設置爲多連接模式,啓動模塊:AT+CIPMUX=1
(9) 服務器的設置端口:AT+CIPSERVER=1,8090 (TCP client連接server時端口號要保持一致)
注:把以上AT指令刷入ESP8266模塊,刷入成功都會返回ok,藍色部分的指令掉電後不會被抹去,紅色部分的指令掉電後會被自動抹去,每次重啓模塊都要進行配置一遍,故在ESP初始化函數中都要加上紅色部分的指令.
5.ESP8266與51單片機的連接(附加外接電源的連接)
ESP8266的 RXD TXD VCC CHPD GND
51單片機的 TXD RXD GND
外接電源的 VCC GND
注:ESP8266的CHPD要與VCC短接拉高,ESP8266模塊供電爲3.3V,外接電源要通過DCDC降壓器把電壓穩定在3.3V,模塊上電成功後紅燈常亮,藍燈閃爍2~3次證明模塊啓動成功,此時打開手機WiFi可以搜索到模塊發散出來的熱點,然後在接入單片機的RXD和TXD,單片機上電啓動(代碼已燒入的情況下)此時打開STC串口調試助手,AT指令會回顯在接收緩衝區,沒有回顯則證明ESP8266與51單片機沒有連接成功,假如模塊在上電時就已經接入了RXD和TXD此時ESP8266模塊會紅燈和藍燈長亮則模塊直接沒有啓動成功,打開手機WiFi直接找不到ESP8266發散出來的熱點(這些小問題不注意的話都會導致連接失敗,蛋疼的是本人在連接測試時都被這些小問題拌倒過,望後來者引起注意)
6.實現ESP8266對51單片機的LED燈的無線控制
ESP8266在AP模式下發散出來一個熱點,模塊作爲服務器TCP server.
手機APP或網絡調試助手作爲客服端TCP client 去訪問服務器,從而實現無線控制.
這裏介紹一下手機APP對LED無線控制的具體操作過程:
(1)手機上下載一個TCP連接或NetAssist的APP
(2)打開手機WiFi可以搜索到ESP8266點擊連接,連接成功後會有提示說"此熱點無上網功能,是否切換"點擊否.
(3)打開手機APP,點擊TCP client 連接,輸入AT指令中獲取的IP地址,選擇端口號,點擊連接.
(4)連接成功後,輸入字符小寫的o就會打開LED燈,輸入小寫字符f關閉LED燈.
7.STC89 C51實現代碼
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED = P1^3;u8 dat;
void Init(void);//串口初始化函數
void Delay_ms(u16 n);//延時子函數
void Sent_ZF(u8 dat);//發送一個字節
void AT_Send_String(u8 *string);//發送字符串
void ESP8266_Init();//ESP8266初始化
void Init(void) //串口初始化函數
{
TMOD = 0x20; //定時器工作方式2,8位自動重載(0010 0000)
TL1 = 0xfd; //裝入初值
TH1 = 0xfd;
TR1 = 1; //啓動定時器1
REN=1; //允許串行口接收數據
SM0=0; //工作方式1,10位異步收發
SM1=1;
EA = 1; //打開全局中斷控制
ES=1; //打開串行口中斷
}
void main()
{
Init();
ESP8266_Init();
while(1);
}
void Sent_ZF(u8 dat) //發送一個字節
{
ES = 0;
TI=0;
SBUF = dat;
while(!TI);
TI = 0;
ES = 1;
}
void Delay_ms(u16 n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void AT_Send_String(u8 *string) //發送字符串
{
while(*string)
{
Sent_ZF(*string++);
Delay_ms(5);
}
}
void ESP8266_Init() //esp8266³õʼ»¯
{
AT_Send_String("AT\r\n"); //測試AT指令
Delay_ms(1000);
Delay_ms(1000);
AT_Send_String("AT+RST\r\n"); //重啓模塊
Delay_ms(1000);
Delay_ms(1000);
AT_Send_String("AT+CWMODE=2\r\n"); //設置爲AP模式
Delay_ms(1000);
Delay_ms(1000);
AT_Send_String("AT+CWSAP=esp8266,0123456789,11,4\r\n"); // 設置name password,加密方式
Delay_ms(1000);
Delay_ms(1000);
AT_Send_String("AT+CIFSR\r\n"); // 查看模塊的ip地址
Delay_ms(1000);
Delay_ms(1000);
AT_Send_String("AT+CIPMODE=1\r\n"); // 設置模塊傳輸模式爲TCP模式
Delay_ms(1000);
Delay_ms(1000);
AT_Send_String("AT+CIPMUX=1\r\n"); //設置爲多連接模式,啓動模塊
Delay_ms(1000);
Delay_ms(1000);
AT_Send_String("AT+CIPSERVER=1,8090\r\n"); //服務器的設置端口
}
void InterruptUART() interrupt 4
{
RI = 0; //清零
dat = SBUF; //收到的數據佔存到SBUF中
{
if(dat=='o')
{
LED =0;
}
if(dat=='f')
{
LED =1;
}
}
}
說明:因本人能力有限,錯誤的地方還請大家指出,一起成長一起進步.以上的所有資料都是經過整合拼接並加入了自己的一些想法完成的,希望對大家有所幫助!
歡迎學習交流 QQ:2997323077