51單片機+ESP8266無線通訊點亮LED燈

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章