即便不那么懂單片機,按照操作步驟,也可以在地球任何可以上網的地方,控制家里想要控制的東東啦。ESP8266和單片機IAP15W4K58S4是通過串口通信的,除了電源就兩根線……
/************************************************************************************
Copyright, LCE STUDIO
程序名稱:ESP8266 云連接控制程序(18.432MHz)
功能說明: 該程序將ESP8266設置為STATION工作模式,并通過家用wifi熱點云服務器建立連接,
手機APP通過注冊后并關聯該ESP8266模塊,通過互聯網發送關燈與開燈的指令,
單片機解析后執行
串口1波特率為9600,用于后臺監控
串口2波特率為115200,用于與ESP8266模塊進行通信
程序版本:1.0 (2015/09)
************************************************************************************/
#include "stc15f2k60s2.h" // 單片機STC15F2K60S2頭文件,可以不再加入reg51.h
#include <intrins.h> // 加入此頭文件后,可使用_nop_庫函數
#include "delay.h" // 延時函數頭文件
#include "uart.h" // 串行通信函數頭文件
#include <string.h> // 加入此頭文件后,可使用strstr庫函數
sbit RST = P2^6;
sbit LED1 = P5^0;
sbit LED2 = P5^1;
sbit LED3 = P5^2;
#define Buf_Max 50
unsigned char xdata Rec_Buf[Buf_Max];
unsigned char i = 0;
void CLR_Buf(void);
bit Hand(unsigned char *a);
char code str1[]="AT\r\n"; // 聯機指令,返回"OK"
char code str2[]="AT+CWMODE=1\r\n"; // 設置ESP8266的工作模式,返回"OK"或者"no change"
char code str3[]="AT+CWJAP=\"WiFi362\",\"1234567890\"\r\n"; // 連接到WiFi熱點,lces為熱點名稱,88518851為密碼;連接成功返回“OK”
char code str4[]="AT+CIFSR\r\n"; // 本機IP地址查詢指令
char code str5[]="AT+CIPSTART=\"TCP\",\"192.168.191.1\",8234\r\n"; // 連接到TCP服務器,返回“Linked”
char code str6[]="AT+CIPSEND=6\r\n"; // 發送數據指令
char code str7[]="hello!\r\n"; // 數據內容
char code AT_CLDSTART[]="AT+CLDSTART\r\n";
char code AT_SMARTLINK[]="AT+CWSMARTSTART=1\r\n";
char code AT_LANSTART[]="AT+LANSTART\r\n";
void main() // 主函數
{
RST = 1; // ESP8266復位功能腳,拉低會將ESP8266復位
UartInit(); // 初始化串口
ES = 1; // 串口1中斷打開
IE2 = 0x01; // 串口2中斷打開
EA = 1; // 總中斷打開
DelayMS(1000); // 延時一段時間,讓ESP8266啟動
DelayUS(100);
U1SendString(Rec_Buf); // 將ESP8266啟動信息通過串口1打印出
U1SendString("\r\n");
U1SendString("Welcome to LSE STUDIO, Please wait while we are getting the device ready\r\n");
CLR_Buf(); //清除緩存內容
while(!Hand("OK")) //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
{
U2SendString(str1); //發送聯機指令
DelayMS(500);
}
CLR_Buf(); //清除緩存內容
U1SendString("OK,Succee Establish connection with ESP8266\r\n");
LED1 = 0;
while(!(Hand("OK")|Hand("no change"))) //判斷是否設置成功,如不成功,延時后再次發送
{
U2SendString(str2); //發送設置ESP8266工作模式指令
DelayMS(500);
}
CLR_Buf();
U1SendString("OK,ESP8266 has been set as Station Mode\r\n");
U1SendString("OK,Plese Press The Smartlink buttom\r\n");
DelayMS(1000);
U2SendString(AT_SMARTLINK);
DelayMS(1000);
do //此循環完成SMARTLINK 的配置
{
LED1=1;
DelayMS(500);
LED1=0;
DelayMS(500);
// U1SendString(Rec_Buf);
}while(strstr(Rec_Buf,"WIFI GOT")==NULL); //此循環完成SMARTLINK 的配置
U1SendString("OK,ESP8266 is configured as SMARTLINK!");
CLR_Buf();
U2SendString(AT_CLDSTART); //加入安信可云
DelayMS(1000);
do //此循環完成安信可云的配置
{
LED1=1;
DelayMS(500);
LED1=0;
DelayMS(500);
// U1SendString(Rec_Buf);
}while(strstr(Rec_Buf,"OK")==NULL); //此循環完成SMARTLINK 的配置
U1SendString("OK,ESP8266 is Linked with Cloud Sever!\r\n");
CLR_Buf();
U2SendString(AT_LANSTART);//開啟內網模式(此模式下,模組會用內網回應手機APP 要查詢的ID 和KEY)
DelayMS(1000);
do //此循環完成安信可云的配置
{
LED1=1;
DelayMS(500);
LED1=0;
DelayMS(500);
// U1SendString(Rec_Buf);
}while(strstr(Rec_Buf,"OK")==NULL); //此循環完成SMARTLINK 的配置
U1SendString("OK,ESP8266 Internal LAN mode is Started!\r\n");
while (1) // 主循環
{
if(Hand("LIGHT:0")) // 收到“openled1”的指令
{
ES = 0;
IE2 = 0x00;
LED1 = 0;
LED2 = 0;
LED3 = 0;
CLR_Buf();
U1SendString("Command: LEDs turn on, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
else if(Hand("LIGHT:1")) // 收到“openled2”的指令
{
ES = 0;
IE2 = 0x00;
LED1 = 1;
LED2 = 1;
LED3 = 1;
CLR_Buf();
U1SendString("Command: LEDs turn off, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
}
}
bit Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++)
{
Rec_Buf[k] = 0;
}
i = 0;
}
void Uart1() interrupt 4 using 1
{
ES = 0;
if (RI)
{
RI = 0; //清除RI位
Rec_Buf = SBUF;
i++;
if(i>Buf_Max)
{
i = 0;
}
}
if (TI)
{
TI = 0; //清除TI位
}
ES = 1;
}
void Uart2() interrupt 8 using 1
{
IE2 = 0x00;
if (S2CON & S2RI)
{
S2CON &= ~S2RI;
Rec_Buf = S2BUF;
i++;
if(i>Buf_Max)
{
i = 0;
}
}
if (S2CON & S2TI)
{
S2CON &= ~S2TI;
}
IE2 = 0x01;
}
|