赞
踩
首先准备号ESP模块和51单片机,把两个模块的RXT和TXD交叉连接,然后通电,但是ESP模块只能使用3.3V免得电流5V会烧毁。
然后把ESP模块的波特率设置为9600,一般默认是115200的,由于单片机的波特率最高只能是9600.因为需要通信,所以波特率必须一致,利用串口软件与ESP连接这个时候需要USB转TTL连接然后把串口软件的波特率也设置好于ESP模块的波特率一样,发送AT显示OK则是一样波特率,如果不一样可以更换波特率逐个尝试。这个时候波特率设置一样了,就可以发送AT+UART_DEF=9600,8,1,0,0这串指令更改波特率就行了。
顶部代码:
- #include <regx52.h>
- #include <string.h>
- #include <stdio.h>
- #include "uart.h"
- #include "ESP8266.h"
- #include "led.h"
-
-
- sbit LED0=P2^0;
- sbit LED1=P3^3;
-
- sbit Sand=P3^2;
- /*****************相关变量**************/
-
- unsigned char Recive_table[20]=""; //用于接收wifi模块反馈到MCU上的数据
-
- char Recive_state = 0; //当前状态是否可以接收
-
-
- void ESP_Flag();
- void ESP_Sand();
接好之后就编写代码:利用keil软件编写51单片机烧录的代码,这里是初始化串口的模式以及工作方式,,也可以用STC_ISP软件直接生成波特率,只有设置好工作方式就可以
- void UartInit(void) //9600bps@11.0592MHz
- {
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xFD; //设定定时初值 //4800bps
- TH1 = 0xFD; //设定定时器重装值
- REN=1; //打开中断允许
- SM0=0; // 设置串口工作方式
- SM1=1; //设置串口工作方式
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- ES=1; //开启串口中断
- EA=1;
- }
下面就可以编写与ESP模块通信的代码了:这里是利用c语言的stdio库函数里面的printf打印。
也可以用模块的SBUF利用指针输出字符串
- void ESP_Init()
- {
- ES=0;
- TI=1;
-
- printf("AT+RST\r\n"); //复位
- LED();
- delay(1000); 延迟1s
-
- printf("AT+CWMODE=3\r\n"); //设置模式
- LED();
- delay(1000);
-
- printf("AT+CWSAP=\"ESP8266\",\"88888888\",1,3\r\n"); //设置WIFI名称和密码
- LED();
- delay(1000);
-
- printf("AT+CIFSR\r\n"); //查看接入设置
- LED();
- delay(1000);
-
- printf("AT+CIPMUX=1\r\n"); //设置多链接模式
- LED();
- delay(1000);
-
- printf("AT+CIPSERVER=1,8080\r\n"); //设置一个服务器端口
- LED();
- delay(1000);
-
- while(!TI);//判断串口发送中断标志位是否为1,若为1则单片机发送数据缓存寄存器给PC端串口调试助手发送数据结束。为什么在此编写while(!TI)?由于需要把单片机发送数据缓存寄存器保存的数据发送给PC端串口调试助手。
- TI=0; //TI(即串口发送中断标志位)=0,表示单片机发送数据缓存寄存器可重新给PC端串口调试助手发送数据,不可申请串口中断
- ES=1; //打开串口中断允许位,允许进入串口中断服务程序。
-
- }
这里是定时器中断判断代码:需要放在mian.c里面即是mian函数的下方,这个是用来判断单片机接收到ESPwifi模块AT指令反馈回来的函数。
- void Uart_Interrupt() interrupt 4
- {
- static unsigned char i=0;
-
- if(RI==1)
- {
- ES=0;
- RI=0;
- Recive_table[i]=SBUF; //MCU接收wifi模块反馈回来的数据
- i++;
- if(Recive_table[i-1]=='\n')
- {
- Recive_table[i]='\0';
- i=0; //遇到换行 重新装值
- Recive_state = 1;
- }
- ES = 1;
- }else TI=0;
- }
接下来就是与手机通信的代码,这里是判断Recive_state的响应标志位。如果是1的时候我才可以执行手机发送过来的识别标志。
- void ESP_Flag() //手机发送数字让WiFi控制单片机亮灯
- {
-
- if(Recive_state == 1)
- {
- ES=0; //进入状态串口中断关闭等待操作完下一个中断的到来
- if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭
- {
- if((Recive_table[3]=='D')&&(Recive_table[6]==','))
- {
- if(Recive_table[9]=='0') //这里的标志是接到的标志是否与协议的标志一致
- {
- LED0=1;//0 灯灭
-
- }
- else if (Recive_table[9]=='1')
- {
- LED0=0; //1 灯亮
-
- }
- }
-
- }
- memset(Recive_table,'\0',20); //接收完情况等待下一个标志
- Recive_state=0; //状态重新设置
- ES=1; //打开串口中断允许位,允许进入串口中断服务程序。
- }
- }
当烧录代码进去之后打开手机的的网络调试软件,首先在TCP server激活ESPwifi设置的端口。这里是8080,然后点到TCP client添加ESPwifi模块的IP地址和端口号,IP地址在手机连接ESPWiFi之后点击热点连接那里就可以看到。添加成功之后就可以在发送1和0之间控制灯亮灭,
同时这个代码是比较重要的,用来判断手机发过来的指令来控制IO口,同时也可以在这个代码上修改需要执行的操作,利用灯,各个IO口。各种指令操作等等,
- void ESP_Flag() //手机发送数字让WiFi控制单片机亮灯
- {
-
- if(Recive_state == 1)
- {
- ES=0; //进入状态串口中断关闭等待操作完下一个中断的到来
- if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入判断控制0\1来使小灯亮与灭
- {
- if((Recive_table[3]=='D')&&(Recive_table[6]==','))
- {
- if(Recive_table[9]=='0') //这里的标志是接到的标志是否与协议的标志一致
- {
- LED0=1;//0 灯灭
-
- }
- else if (Recive_table[9]=='1')
- {
- LED0=0; //1 灯亮
-
- }
- }
-
- }
- memset(Recive_table,'\0',20); //接收完情况等待下一个标志
- Recive_state=0; //状态重新设置
- ES=1; //打开串口中断允许位,允许进入串口中断服务程序。
- }
- }
这里有个比较少见用的函数memset,是设置字符串的初始化修改值得,第一个参数得字符串的首地址,第二个是需要初始化得值或修改得值,第三个是修改多少位
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。