金牌会员
- 积分
- 2321
- 威望
- 1771
- 贡献
- 454
- 兑换币
- 191
- 注册时间
- 2016-6-4
- 在线时间
- 48 小时
- 毕业学校
- 社会中成长
|
各位道友你们好!我是一名在校学生,目前在做esp8266与单片机的通信,可是遇到了一些困难,希望有道友帮我答疑,小子在这里感激不尽。
我的线路连接图如上图所示;
我可以直接使用串口工具,用pc直接给8266发送AT指令,可以设置相关参数;
使用c语言为51mcu编程,使51mcu向8266发送AT指令。可是我不能做到这点,希望各位前辈同行们可以帮我解答,再次感谢!!
我的程序大意是:使用8266station模式,建立终端server,生成WIFI信号,使用手机或者电脑连接8266发出的WIFI,然后打开网络调试助手,建立客服端,连接server(需要使用终端server的网址:19.168.4.1),然后发送相应数字,点亮相应的小灯(P1接小灯)。
下面写下我的代码:使用printf函数语句输出指令,或者使用SendString函数发送指令,使用"//"符号隔开:
#include"reg52.h"
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define led P1
int flag=0,a=0,d=0;
/*
uchar code esp_at[]="AT+RST\r\n";
uchar code esp_cwmode[]="AT+CWMODE=1\r\n";
uchar code esp_cipmux[]="AT+CIPMUX=1\r\n";
uchar code esp_cipserver[]="AT+CIPSERVER=1,8080\r\n";
uchar code esp_cipsend[]="AT+CIPSEND=0,19\r\n";
*/
//void delay(int x)
//{
// int i,j;
// for(i=0;i<x;i++)
// for(j=0;j<110;j++);
//}
//void SendByte(uchar b);
//void SendString(uchar *s);
void init_esp()
{
uint a;
uchar ldat;
int d =1;
SCON=0x50; //串口工作方式1,8位UART,波特率可变
TH2=0xFF;
TL2=0xFD; //波特率:115200 晶振=11.0592MHz
RCAP2H=0xFF;
RCAP2L=0xFD; //16位自动再装入值
TCLK=1;
RCLK=1;
C_T2=0;
EXEN2=0; //波特率发生器工作方式
TR2=1 ; //定时器2开始 //
TI = 1;
REN=1; //使能串口允许接收
SM0=0; //工作在串口的工作方式1
SM1=1;
ES=0; //串口中断关闭,待初始化后再打开
EA=1; //总中断打开
for (a=0; a<8000; a++);
printf ("AT+RST\n"); //SendString(esp_at);
do{
if(RI)
{
ldat=SBUF;
RI=0;
if (ldat=='K')
d=0;
}
}while (d);
d =1;
for (a=0; a<1000; a++);
printf ("AT+CWMODE=2\n"); //SendString(esp_cwmode);
do{
if(RI)
{
ldat=SBUF;
RI=0;
if (ldat=='K')
d=0;
}
}while (d);
d =1;
for (a=0; a<1000; a++);
printf ("AT+CIPMUX=1\n"); // SendString(esp_cipmux);
do{
if(RI)
{
ldat=SBUF;
RI=0;
if (ldat=='K')
d=0;
}
}while (d);
d =1;
for (a=0; a<1000; a++);
printf ("AT+CIPSERVER=1,8080\n"); //SendString(esp_cipserver);
do{
if(RI)
{
ldat=SBUF;
RI=0;
if (ldat=='K')
d=0;
}
}while (d);
d =1;
for (a=0; a<10000; a++);
ES=1; //串行口中断打开
}
void remote_control(unsigned char ldat)
{
unsigned int a;
switch(ldat)
{
case '1': //感叹号表示1楼,当然你也可以用其他表示方式,你也可以先接收到1,然后再进行其他的判断
printf ("AT+CIPSEND=0,19\n"); //发送语句的命令 //SendString(esp_cwmode);
for (a=0; a<10000; a++);
printf ("%c\nturn on the light"); //需要发送的语句
led=0X80;
break;
case '2':
printf ("AT+CIPSEND=0,20\n");
for (a=0; a<10000; a++);
printf("%c\nturn off the lights");
led=0X40;
break;
case '3':
printf ("AT+CIPSEND=0,18\n");
for (a=0; a<10000; a++);
printf("%c\nopen the window");
led=0X20;
break;
case '4':
printf("AT+CIPSEND=0,19\n");
for (a=0; a<10000; a++);
printf ("%c\nclose the window");
led=0X10;
break;
case '5':
printf ("AT+CIPSEND=0,19\n");
for (a=0; a<10000; a++);
printf ("%c\nopen the exhaust");
led=0X08;
break;
case '6':
printf ("AT+CIPSEND=0,20\n");
for (a=0; a<10000; a++);
printf ("%c\nclose the exhaust");
led=0X04;
break;
case '7':
printf ("AT+CIPSEND=0,20\n");
for (a=0; a<10000; a++);
printf ("%c\nclose the exhaust");
led=0X20;
break;
case '8':
printf ("AT+CIPSEND=0,20\n");
for (a=0; a<10000; a++);
printf("%c\nclose the exhaust");
led=0XFF;
break;
}
ES=0;
}
/*
void SendByte(uchar b)
{
SBUF=b;
while(!TI);
TI=0;
}
void SendString(uchar *s)
{
while(*s!='\0');
{
SendByte(*s);
s++;
}
}
*/
void main()
{
led=0X00;
init_esp(); //初始化ESP8266
while(1)
{
if(flag==1)
{
remote_control(a);
flag=0;
}
ES=1;
}
}
//**********串口中断程序***************
void ser() interrupt 4
{
RI=0;//
a=SBUF;
flag=1;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|