软件:
电脑: 安信可串口调试助手(左,去安信可官网下载即可)
手机: TCP连接(右,随便找个商店搜一下TCP关键字都有一堆,我用的第一个TCP)
硬件:
- USB—TTL下载器
- Esp8266—01s模块(注意是01S,内置上拉电阻,比较方便)
- 杜邦线若干
- 51最小系统
手机通过esp8266和电脑相连接:
步骤:
- 下载器的3.3V gnd分别和esp8266_01s的端口相连
连接txd和rxd端口(下载器的TXD连到WIFI模块的RXD,另一对同理);
2.连接好后插入电脑,去查看端口号,这个COM号等下要用
(如果插上电脑后没反应,多半是驱动没有安装好,按照道理讲,平时都有用TTL下载器来下载,驱动应该是早就装好了)
.打开安信可串口调试助手
一.串口号就是刚刚查看的那个COM口,这个别选错了,每个人的电脑可能会不同
二.Esp8266_01s的波特率默认是115200
其他的参数校验位…啥的都不用调节
3.依次发送以下指令7条
(具体指令的作用去查一下百度就好,这里直接给出)
AT
AT+CWMODE=2
AT+RST
AT+CWSAP="esp8266","12345678",6,4
//这里设置的esp8266是WIFI名 12345678是WIFI密码,自己可更改
AT+CIPMUX=1
AT+CIPSERVER=1,8080
AT+CIFSR
发送7条命令的结果如下
PS:
8080 是端口号
192.168.4.1 是地址
这两个后面利用手机进行TCP调试的时候要用到记着
4.根据自己设置的wife名字和密码用手机连接上
打开手机端的串口调试调试助手,利用刚才记录下来的端口号和地址
进行连接
PS:连接的时候一定要关闭手机的数据网络,否者连接不上,我也不知道为啥
连接成功会有提示:
5.接下来电脑和后手机端就可以通过esp8266互相发送数据了
手机通过esp8266和单片机相连接接:
和电脑相连设置完一些初始化信息后(如设置WIFI名称密码之类的,就是像刚刚那样子用电脑端调试助手发送那7条指令),再进行这下面的
- 注意先要利用电脑端的调试助手发送AT+CIOBAUD=9600,8,1,0,0 这条指令,将ESP8266的波特率修改为9600,才可以和单片机匹配,否者esp8266和单片机无法正常通信()。(就发完上面7条指令后,紧接着发这一条就可以了)
(注意电脑端的调试助手如果还要发送信息的话,波特率就要调成9600了)
2..接线
这个接线时一样的,8266的TXD连接到最小系统的RXD;RXD连接到TXD
关于电源和地,最小系统和esp8266一定要共地!!否者可能连接不上
3.附上51的代码9(参考了很多资料,但是依旧有些BUG,自己试试)
#include<reg51.h>
#include <intrins.h>
sbit LED=P1^1;
unsigned char Recive_table[15];//用于接收ESP8266串口接收到的数据
void DelayX10us(unsigned char t)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
void Uart_Init(unsigned int baud)
{
SCON = 0x50; //配置串口为模式 1
TMOD &= 0x0F; //清零 T1 的控制位
TMOD |= 0x20; //配置 T1 为模式 2
TH1 = 256 - (11059200/12/32)/baud; //计算 T1 重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //禁止 T1 中断
ES = 1; //使能串口中断
PS=1; //设置串口中断优先级最高
TR1 = 1; //启动 T1
}
void WIFI_Init()
{
char *a="AT+CIPMUX=1\r\n";
char *b="AT+CIPSERVER=1,8080\r\n";
while(*a!='\0')
{
SBUF=*a; //写入要发送的字符
while(!TI); //等待发送完成
TI=0; //发送
a++;
}
DelayX10us(500);
while(*b!='\0')
{
SBUF=*b;
while(!TI); //等待发送完成
TI=0;
b++;
}
}
void main()
{
EA=1;
Uart_Init(9600);
DelayX10us(500);
WIFI_Init();
DelayX10us(500);
WIFI_Init(); //防止两条数据写入不成功,再写入一次
while(1);
}
void Uart() interrupt 4 //中断程序
{
static unsigned int i=0;
if(RI==1) //接受一字节完成后由硬件置1
{
RI = 0; //软件清零,防止下次未接收完成就执行程序
Recive_table[i] = SBUF; //将接受数据存入数组
if(Recive_table[0]=='+') //说明一下,发送的数据都是这样的字符串 +IPD,0,1:1
i++;
else
i = 0;
if(i>=10)
{
if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P')&&(Recive_table[3]=='D'))
{
if(Recive_table[9]=='a')//输入a开灯
LED=1;
if(Recive_table[9]=='b')//输入b关灯
LED=0;
}
i = 0; //完成一次操作的判断就要清0,如果不清零 就无法实现后续的判断
}
}
else
TI = 0; //不是接收中断就是发送中断,也需要手动软件置0
}
4..其他的步骤就和不多说了一样的
要是连不上重启一下最小系统多试试
个人的疑惑
疑问1:
我连接的时候,经常在所有的东西都配置好后,给ESP8266,和最小系统同时上电,发现挺大概率,手机的TCP调试软件会连接不上端口;经过很多次尝试,我是这样子解决的:ESP8266保持不断电,但给51最小系统部分重新上电(即重启),这样子后手机端的TCP就连的上了。
后来想了想发现,会不会是因为最小系统和ESP8266同时上电的时候,程序中的这两句命令没有正常写入esp8266,导致ESP8266初始化失败
而重启51最小系统,单片机重新运行,就相当于把这两条命令再一次写入给已经上电的ESP8266,所以手机端的TCP就可以连接上了。这是我的猜测,可能不太正确。作为一个刚刚小白,踩了好的的坑,连接这个ESP8266都折腾了好几天才成功。懂的兄弟们可以讲讲这个问题吗?
疑问2:当我的程序中有多个中断的时候,是否应该将这个串口中断设置最高的优先级
(实际上我也是这么做的,因为我发现,当我把这个模块移植到其他程序中时,如果不设置优先级,手机的经常性的连不上ESP8266,设置完PS=1,给这个串口中断最高优先后,可以连上了)
上述两个疑惑,小白恳求大佬们指导一下
我踩的坑:
- 连接的时候一定要关闭手机的数据网络,否者连接不上,我也不知道为啥
- 关于电源和地,最小系统和esp8266一定要共地!!否者可能连接不上
PS:小白第一次发帖,上述可能会有些错误的地方,希望大家见谅