软件:

  

电脑:   安信可串口调试助手(左,去安信可官网下载即可)

手机: TCP连接(右,随便找个商店搜一下TCP关键字都有一堆,我用的第一个TCP)

硬件:

 

  1. USB—TTL下载器
  2. Esp8266—01s模块(注意是01S,内置上拉电阻,比较方便)
  3. 杜邦线若干
  4. 51最小系统

手机通过esp8266和电脑相连接:

步骤:

  1. 下载器的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条指令),再进行这下面的

  1. 注意先要利用电脑端的调试助手发送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,给这个串口中断最高优先后,可以连上了)

上述两个疑惑,小白恳求大佬们指导一下

我踩的坑:

  1. 连接的时候一定要关闭手机的数据网络,否者连接不上,我也不知道为啥
  2. 关于电源和地,最小系统和esp8266一定要共地!!否者可能连接不上

PS:小白第一次发帖,上述可能会有些错误的地方,希望大家见谅

物联沃分享整理
物联沃-IOTWORD物联网 » 第一次使用ESP8266_01S

发表评论