赞
踩
51单片机和ESP8266实现通讯的编程思想和代码
硬件就不细说咯,注意:51单片机上的TXD(P31)需要连上esp8266的RXD,单片机上的RXD(P3^0)需要连上esp8266的TXD,esp8266的RXD的EN端连接上5V电压(高电平的时候使能)
在使用esp8266的时候需要在电脑上运用串口助手进行调试(调节波特率,设置工作方式等),当转移到51单片机上使用时,同样需要对ESP8266进行初始化,同时还需要对单片机进行初始化配置(开定时器,开串口中断等)。然后在发送数据的时候,单片机首先将数据发送到SBUF缓存区,然后再发送出去,接收数据时,数据同样先被保存到SBUF缓存区,然后在保存进自己定义的数组中。
综上,实现WiFi点亮led灯的步骤是:
1,首先对单片机和esp8266进行初始化,对ESP8266进行初始化的时候就需要先将ESP8266的指令保存到数组中,然后再发送到ESP8266内部。
单片机初始化代码:
void UartInit(void) //2400bps@12.000MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1; //开启串口中断
EA=1;
对ESP8266进行初始化代码(两部分,第一部分编辑发送字节函数,第二部分将ESP的初始化指令保存在数组中然后在发送出去):
1
void Send_Uart(uchar value) { ES=0; //关闭串口中断 TI=0; //清发送完毕中断请求标志位 SBUF=value; //发送 while(TI==0); //等待发送完毕 TI=0; //清发送完毕中断请求标志位 ES=1; //允许串口中断 } void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组 { while(*puf!='\0') //遇到空格跳出循环 { Send_Uart(*puf); //向WIFI模块发送控制指令。 us_delay(5); puf++; } us_delay(5); Send_Uart('\r');//回车 us_delay(5); Send_Uart('\n'); //换行 ms_delay(1000); } oid ESP8266_Sent(uchar *puf) // 数组指针*puf指向字符串数组 { ESP8266_Set("AT+CIPSEND=0,4"); while(*puf!='\0') //遇到空格跳出循环 { Send_Uart(*puf); //向WIFI模块发送控制指令。 us_delay(5); puf++; } us_delay(5); Send_Uart('\n'); //换行 ms_delay(10); }
2
ms_delay(2000);
ESP8266_Set("AT+CWMODE=3"); //设置路由器模式 1 station模式 2 AP
ms_delay(2000);
//点 路由器模式 3 station+AP混合模式
// ESP8266_Set("AT+RST"); //重新启动wifi模块
// ESP8266_Set("AT+CWSAP=\"WIFI\",\"1234567890\",11,4");
//设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
ESP8266_Set("AT+CIPMUX=1");//开启多连接模式,允许多个各客户端接入
ms_delay(2000);
ESP8266_Set("AT+CIPSERVER=1,5000"); //启动TCP/IP 端口为8080 实现基于网络//控制
ms_delay(2000);
2 通过ESP8266接收数据,实现途径:当有数据进入的时候,此时RI,TI置1,触发串口中断,进入中断函数,在中断函数中将缓存器SUBF接收到的数据保存到数组中。
void Uart_Interrupt() interrupt 4 { static uchar i=0; if(RI==1) { ES = 0; RI=0; Recive_table[i]=SBUF; //MCU接收wifi模块反馈回来的数据 i++; if(Recive_table[i-2]==':') { // Recive_table[i]='\0'; i=0; //遇到换行 重新装值 Recive_state = 1; // LED0 = 0;ms_delay(20);LED0 = 1; } else if(i>15) { i=0;Recive_state=0; } ES = 1; } else TI=0; }
3在主程序中可以一直while(1)循环判断接收到的数组中的数据是否是1,是1则打开灯,如果是0,则关闭灯
while(1) { ms_delay(20); if(Recive_state == 1) { p = strstr(&Recive_table[2],"+IPD"); if(p != NULL) { // LED0 = ~LED0; Recive_state = 0; if(*(p+9) == '1') { LED0=0; } else if(*(p+9) == '0') { LED0=1; } } } } }
完整代码:
#include <reg52.h> //包含头文件 #include "string.h" #define uint unsigned int #define uchar unsigned char //#define RELOAD_COUNT 0xFA //宏定义波特率发生器的载入值 //#define RELOAD_COUNT (256-(((11520000/16)/12)/115200)) //也可以或波特率9600 //256-晶振频率/波特率x16=BRT /*****************LED灯对应P0口的1个端口*************/ sbit LED0=P2^0; sbit LED1=P3^3; /************波特率发生器相关功能寄存器的定义****************/ sfr AUXR=0x8E; sfr BRT=0x9C; sfr AUXR1=0xA2; /*****************相关变量**************/ uchar Receive,i; uint n; uchar Recive_table[15]; //用于接收wifi模块反馈到MCU上的数据 uchar a; char Recive_state = 0; /******************************************************************* 名称:延时函数 作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待....... ********************************************************************/ void ms_delay(uint t) { uint i,j; for(i=t;i>0;i--) for(j=110;j>0;j--); } void us_delay(uchar t) { while(t--); } /******************************************************************** 名称:波特率发生器函数 作用:波特率发生器可以是T1定时器实现,也可以是MCU内部独立的波特率发生器, 各自不同的载入值计算式,具体根据寄存器相关设置来参考计算,以实现 异步串行通讯。(经测试,两种设置方式均可用,可任选一种。) ********************************************************************/ void UartInit(void) //2400bps@12.000MHz { PCON &= 0x7F; //波特率不倍速 SCON = 0x50; //8位数据,可变波特率 AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xF3; //设定定时初值 TH1 = 0xF3; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 ES=1; //开启串口中断 EA=1; } /******************************************************************** 名称:串口发送函数 功能:MCU向其他与其连接的设备发送数据(此处是无线WIFI模块ESP8266) ********************************************************************/ void Send_Uart(uchar value) { ES=0; //关闭串口中断 TI=0; //清发送完毕中断请求标志位 SBUF=value; //发送 while(TI==0); //等待发送完毕 TI=0; //清发送完毕中断请求标志位 ES=1; //允许串口中断 } /******************************************************************** 名称:WIFI模块设置函数 作用: 启动模块,以便可以实现无线接入和控制 ********************************************************************/ void ESP8266_Set(uchar *puf) // 数组指针*puf指向字符串数组 { while(*puf!='\0') //遇到空格跳出循环 { Send_Uart(*puf); //向WIFI模块发送控制指令。 us_delay(5); puf++; } us_delay(5); Send_Uart('\r');//回车 us_delay(5); Send_Uart('\n'); //换行 ms_delay(1000); } /**************************************************** 名称:ESP8266发送数据函数 功能:用于与wifi模块相连的终端发送数据 *****************************************************/ void ESP8266_Sent(uchar *puf) // 数组指针*puf指向字符串数组 { ESP8266_Set("AT+CIPSEND=0,4"); while(*puf!='\0') //遇到空格跳出循环 { Send_Uart(*puf); //向WIFI模块发送控制指令。 us_delay(5); puf++; } us_delay(5); Send_Uart('\n'); //换行 ms_delay(10); } /******************************************************************** 名称:主函数 作用:程序的执行入口 ********************************************************************/ void main() { //LcdInit(); unsigned char i,*p; LED0 = 0; ms_delay(2000); LED0=0;//关闭LED灯 UartInit();//使用独立的波特率发生器 ms_delay(2000); ESP8266_Set("AT+CWMODE=3"); //设置路由器模式 1 station模式 2 AP ms_delay(2000); //点 路由器模式 3 station+AP混合模式 // ESP8266_Set("AT+RST"); //重新启动wifi模块 // ESP8266_Set("AT+CWSAP=\"WIFI\",\"1234567890\",11,4"); //设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK) ESP8266_Set("AT+CIPMUX=1");//开启多连接模式,允许多个各客户端接入 ms_delay(2000); ESP8266_Set("AT+CIPSERVER=1,5000"); //启动TCP/IP 端口为8080 实现基于网络//控制 ms_delay(2000); //允许串口中断 while(1) { ms_delay(20); if(Recive_state == 1) { p = strstr(&Recive_table[2],"+IPD"); if(p != NULL) { // LED0 = ~LED0; Recive_state = 0; if(*(p+9) == '1') { LED0=0; } else if(*(p+9) == '0') { LED0=1; } } } } } /********************************************************************* 名称:串行通讯中断 作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数 据正常的收发。 ********************************************************************/ void Uart_Interrupt() interrupt 4 { static uchar i=0; if(RI==1) { ES = 0; RI=0; Recive_table[i]=SBUF; //MCU接收wifi模块反馈回来的数据 i++; if(Recive_table[i-2]==':') { // Recive_table[i]='\0'; i=0; //遇到换行 重新装值 Recive_state = 1; // LED0 = 0;ms_delay(20);LED0 = 1; } else if(i>15) { i=0;Recive_state=0; } ES = 1; } else TI=0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。