/****************************************Copyright (c)****************************************************
**
**
**
**--------------File Info---------------------------------------------------------------------------------
** File name:
** Last modified Date:
** Last Version:
** Descriptions:
**--------------------------------------------------------------------------------------------------------
** Created by: FiYu
** Created date: 2015-7-28
** Version: 1.0
** Descriptions: ESP8266串口WiFi模块 AP+STATION实验
**--------------------------------------------------------------------------------------------------------
** Modified by: FiYu
** Modified date:
** Version:
** Descriptions:
** Rechecked by:
**********************************************************************************************************/
/****-----参考:宏晶科技的有关资料及程序-------***********/
#include "stc15f2k60s2.h" // 单片机STC15F2K60S2头文件,可以不再加入reg51.h
#include <intrins.h> // 加入此头文件后,可使用_nop_库函数
#include "delay.h" // 延时函数头文件
#include "uart.h" // 串行通信函数头文件
#include <string.h> // 加入此头文件后,可使用strstr库函数
#define Buf_Max 50
unsigned char xdata Rec_Buf[Buf_Max];
unsigned char i = 0;
void CLR_Buf(void);
bit Hand(unsigned char *a);
/**********************
引脚别名定义
***********************/
sbit LED_R=P0^6; //三色指示灯之红色LED用IO口P06,定义为LED1
sbit LED_G=P0^7; //三色指示灯之绿色LED用IO口P07,定义为LED2
sbit LED_B=P0^5; //三色指示灯之蓝色LED用IO口P05,定义为LED3
char code str1[]="AT\r\n"; // 联机指令,返回"OK"
char code str2[]="AT+CWMODE=3\r\n"; // 设置ESP8266的工作模式,返回"OK"或者"no change"
char code str3[]="AT+CWJAP=\"FiYu\",\"55815581\"\r\n"; // 连接到WiFi热点,FiYu为热点名称,88518851为密码;连接成功返回“OK”
char code str4[]="AT+CIFSR\r\n"; // 本机IP地址查询指令
char code str5[]="AT+CIPSTART=\"TCP\",\"192.168.191.1\",5000\r\n"; // 连接到TCP服务器,返回“OK”
char code str6[]="AT+CIPSEND=6\r\n"; // 发送数据指令
char code str7[]="hello!\r\n";
char code str8[]="AT+CIPSERVER=1,5000\r\n"; // 建立TCP服务器,开放端口5000
char code str9[]="AT+CIPMUX=1\r\n"; // 打开多连接
char code str10[]="AT+RST\r\n"; // 软件复位
char code str11[]="AT+CIPSEND=0,15\r\n"; // 发送数据指令,基于多路连接模式
char code str12[]="Command Executed!\r\n"; // 数据内容
void main() // 主函数
{
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
P0M1 = 0; P0M0 = 0; //设置P0.0~P0.7为准双向口
P1M1 = 0; P1M0 = 0; //设置P1.0~P1.7为准双向口
P2M0 = 0; P2M1 = 0; //设置P2.0~P2.7为准双向口
P3M1 = 0; P3M0 = 0; //设置P3.0~P3.7为准双向口
P4M1 = 0; P4M0 = 0; //设置P4.0~P4.7为准双向口
P5M1 = 0; P5M0 = 0; //设置P5.0~P5.7为准双向口
UartInit(); // 初始化串口
ES = 1; // 串口1中断打开
IE2 = 0x01; // 串口2中断打开
EA = 1; // 总中断打开
DelayMS(1000); // 延时一段时间,让ESP8266启动
DelayUS(100);
U1SendString(Rec_Buf); // 将ESP8266启动信息通过串口1打印出
U1SendString("\r\n");
U1SendString("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,Succeed Establish connection with ESP8266\r\n");
while(!(Hand("OK")|Hand("no change"))) //判断是否设置成功,如不成功,延时后再次发送
{
U2SendString(str2); //发送设置ESP8266工作模式指令
DelayMS(500);
}
if(Hand("OK"))
{
CLR_Buf();
U2SendString(str10);
DelayMS(500);
}
CLR_Buf();
U1SendString("OK,ESP8266 has been set as AP+Station Mode\r\n");
while(!Hand("OK"))
{
U2SendString(str9); //设置为多路连接
DelayMS(500);
}
CLR_Buf();
while(!Hand("OK")) // 建立TCP 服务器,并开放端口8888
{
U2SendString(str8);
DelayMS(500);
}
CLR_Buf();
while(!Hand("OK")) // 查询模块当前IP地址
{
U2SendString(str4);
DelayMS(500);
}
U1SendString(Rec_Buf);
U1SendString("Congratulations, Everything is set up! TCP sever:192.168.4.1, Port: 5000\r\n");
CLR_Buf();
while (1) // 主循环
{
if(Hand("ESPKLED1")) // 收到打开LED1的指令
{
ES = 0;
IE2 = 0x00;
LED_R = 0; // 打开三色指示灯之红灯
CLR_Buf();
U1SendString("Command: Turn on LED1, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
else if(Hand("ESPGLED1")) // 收到关闭LED1的指令
{
ES = 0;
IE2 = 0x00;
LED_R = 1; // 关闭三色指示灯之红灯
CLR_Buf();
U1SendString("Command: Turn off LED1, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
else if(Hand("ESPKLED2")) // 收到打开LED2的指令
{
ES = 0;
IE2 = 0x00;
LED_G = 0; // 打开三色指示灯之绿灯
CLR_Buf();
U1SendString("Command: Turn on LED2, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
else if(Hand("ESPGLED2")) // 收到关闭LED2的指令
{
ES = 0;
IE2 = 0x00;
LED_G = 1; // 关闭三色指示灯之绿灯
CLR_Buf();
U1SendString("Command: Turn off LED2, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
else if(Hand("ESPKLED3")) // 收到打开LED3的指令
{
ES = 0;
IE2 = 0x00;
LED_B = 0; // 打开三色指示灯之蓝灯
CLR_Buf();
U1SendString("Command: Turn on LED3, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
else if(Hand("ESPGLED3")) // 收到关闭LED3的指令
{
ES = 0;
IE2 = 0x00;
LED_B = 1; // 关闭三色指示灯之蓝灯
CLR_Buf();
U1SendString("Command: Turn off LED3, Executed!\r\n");
ES = 1;
IE2 = 0x01;
}
}
}
/**************************************
功能描述:握手成功与否函数
入口参数:unsigned char *a
返回值:位
***************************************/
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++)
{