單片機+esp8266 wifi模塊的AP模式
模塊作爲服務器與遠程客戶機進行通信
燒寫代碼前需要先獲取到wifi模塊的IP地址以及設置模塊的wifi名字和密碼,以便客戶端進行連接
#include<reg52.h>
#include<stdio.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
char rcvbuf[20];
char rcvflag = 0;
void delayms(uint x) //51單片機常用延時程序
{
uint i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
void uart_init() //串口初始化
{
TMOD=0x20;
TH1=0XFd;
TL1=0XFd;
SCON=0x50;
PCON=0X00;
TR1=1;
EA=1;
ES=1;
}
void wifi_init() //wifi初始化,就是往串口發送AT指令
{
ES=0;
TI=1;
printf("AT+RST\r\n");
delayms(1200);
printf("AT+CWMODE=2\r\n");
delayms(1200);
printf("AT+CIPMUX=1\r\n");
delayms(1200);
printf("AT+CIPSERVER=1,8080\r\n");
delayms(1200);
while(!TI);
TI=0;
ES=1;
}
void send(char *p)
{
TI=0;
do
{
SBUF=*p;
p++;
while(!TI);
TI=0;
}while(*p);
SBUF=' ';
while(!TI);
TI=0;
}
void main()
{
char buf[10];
char i;
uart_init();
wifi_init();
while(1)
{
if(rcvflag == 1) //判斷是否接收到數據
{
ES = 0;
rcvflag = 0;
for(i=0;i<4;i++)
buf[i] = rcvbuf[i];
i = 0;
if(strcmp(buf,"+IPD") == 0) //判斷接收到的數據是否符合要求,該模塊接收到數據是以“+IPD”開頭的
{
if(rcvbuf[9] == '1')
{
send("燈亮");
P1 = 0;
}
else if(rcvbuf[9] == '0')
{
send("燈滅");
P1 = 0xff;
}
}
ES = 1;
}
}
}
void uart_rcv() interrupt 4 //中斷接收程序
{
static char i = 0;
if(RI == 1)
{
ES = 0;
RI = 0;
rcvbuf[i++] = SBUF;
if(rcvbuf[i-1] == '\n') //判斷字符串結束位置
{
rcvbuf[i] = '\0';
i = 0;
rcvflag = 1; //字符串結束,把接收標誌位置1
}
ES = 1;
}
}