51单片机AT指令控制ESP8266
时间:10-02
整理:3721RD
点击:
ESP8266无法识别单片机发送的AT指令,把AT指令直接当数据发送出去了是怎么回事呢?ESP8266的RXD接51的TXD,TXD接51的RXD。代码如下,我直接用串口调试测试AT指令完全可行,但是使用单片机却没有调试出来,发送消息时ESP8266蓝灯也在闪烁,判断为ESP8266并未识别AT指令,没有wifi连接等信息,只是直接就传输出去了,ESP8266做的是客户端.忘大神解答一下ESP8266.c文件
#include"esp8266.h"
int a;
uchar dat,flag = 1;
/*******************************************************************************
* 函 数 名 : ms_delay
* 函数功能 : 延时若干毫秒
* 输 入 : uint t
* 输 出 : 无
*******************************************************************************/
void ms_delay(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************************
* 函 数 名 : us_delay
* 函数功能 : 延时若干微妙
* 输 入 : uchar t
* 输 出 : 无
*******************************************************************************/
void us_delay(uchar t)
{
while(t--);
}
/*******************************************************************************
* 函 数 名 : Send_Uart
* 函数功能 : 串口发送数据
* 输 入 : uchar Value
* 输 出 : 无
*******************************************************************************/
void Send_Uart(uchar value)
{
ES=0; //关闭串口中断
SBUF=value; //发送
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
ES=1; //允许串口中断
}
/*******************************************************************************
* 函 数 名 : send_com
* 函数功能 : 向ESP8266发送命令
* 输 入 : uchar *puf
* 输 出 : 无
*******************************************************************************/
void send_com(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(50);
}
/*******************************************************************************
* 函 数 名 : send_data
* 函数功能 : ESP8266发送数据
* 输 入 : uchar *puf
* 输 出 : 无
*******************************************************************************/
void send_data(uchar *puf) // 数组指针*puf指向字符串数组
{
send_com("AT+CIPSEND=4");
/*
do{ //连接服务端
if(RI)
{
dat=SBUF;
RI=0;
if(dat=='K')
flag = 0;
}
}while(flag);
*/
ms_delay(50); //等待先发送完成
flag = 1; //复位标志
while(*puf!='\0') //遇到空格跳出循环
{
Send_Uart(*puf); //向WIFI模块发送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\n'); //换行
ms_delay(1);
}
/*******************************************************************************
* 函 数 名 : init_esp
* 函数功能 : ESP8266初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void init_esp()
{
uint num;
ms_delay(2000); //延时,保证模块已正常开机
send_com("AT");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=="K")
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
// flag = 1;
//AT+CWMODE=1
send_com("AT+CWMODE=3");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag = 1;
send_com("AT+RST");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag = 1;
send_com("AT+CWJAP=\"WIFI\",\"12345678\"");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag=1;
send_com("AT+CIPSTART=\"TCP\",\"113.142.153.38\",\"8084\"");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag = 1;
}
main.c文件
#include<reg52.h>
#include"esp8266.h"
#include"ds18b20.h"
/*******************************************************************************
* 函 数 名 : UartInit
* 函数功能 : 串口初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UartInit(void) //9600bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器0为16位定时器,定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时器1初值
TH1 = 0xFA; //设定定时器1重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
uint count;
UartInit();
// lcd_reset();
init_esp();
while(1)
{
count ++;
//LcdDisplay(Ds18b20ReadTemp());
// key_scan();
if(count >= 60000)
{
count = 0;
send_data("1234");
// send_com("hell");
// send_temp();
}
}
}
static uchar datas[10];
void Uart() interrupt 4
{
//ESP8266默认数据帧格式:接收多个连接数据 "\r\n+IPD,%d,%d:data\r\n",ID号,数据data长度
// 接收一个连接数据可能有两种 1."\r\n+IPD,0,%d:data",data长度 2."\r\ndata\r\n"
//接收数据长度自己设定
int len = 10;
int i = 0;
RI = 0;
ES = 0;
while(len--)
{
datas = SBUF;
i++;
}
ES = 1;
}
#include"esp8266.h"
int a;
uchar dat,flag = 1;
/*******************************************************************************
* 函 数 名 : ms_delay
* 函数功能 : 延时若干毫秒
* 输 入 : uint t
* 输 出 : 无
*******************************************************************************/
void ms_delay(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************************
* 函 数 名 : us_delay
* 函数功能 : 延时若干微妙
* 输 入 : uchar t
* 输 出 : 无
*******************************************************************************/
void us_delay(uchar t)
{
while(t--);
}
/*******************************************************************************
* 函 数 名 : Send_Uart
* 函数功能 : 串口发送数据
* 输 入 : uchar Value
* 输 出 : 无
*******************************************************************************/
void Send_Uart(uchar value)
{
ES=0; //关闭串口中断
SBUF=value; //发送
while(TI==0); //等待发送完毕
TI=0; //清发送完毕中断请求标志位
ES=1; //允许串口中断
}
/*******************************************************************************
* 函 数 名 : send_com
* 函数功能 : 向ESP8266发送命令
* 输 入 : uchar *puf
* 输 出 : 无
*******************************************************************************/
void send_com(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(50);
}
/*******************************************************************************
* 函 数 名 : send_data
* 函数功能 : ESP8266发送数据
* 输 入 : uchar *puf
* 输 出 : 无
*******************************************************************************/
void send_data(uchar *puf) // 数组指针*puf指向字符串数组
{
send_com("AT+CIPSEND=4");
/*
do{ //连接服务端
if(RI)
{
dat=SBUF;
RI=0;
if(dat=='K')
flag = 0;
}
}while(flag);
*/
ms_delay(50); //等待先发送完成
flag = 1; //复位标志
while(*puf!='\0') //遇到空格跳出循环
{
Send_Uart(*puf); //向WIFI模块发送控制指令。
us_delay(5);
puf++;
}
us_delay(5);
Send_Uart('\n'); //换行
ms_delay(1);
}
/*******************************************************************************
* 函 数 名 : init_esp
* 函数功能 : ESP8266初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void init_esp()
{
uint num;
ms_delay(2000); //延时,保证模块已正常开机
send_com("AT");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=="K")
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
// flag = 1;
//AT+CWMODE=1
send_com("AT+CWMODE=3");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag = 1;
send_com("AT+RST");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag = 1;
send_com("AT+CWJAP=\"WIFI\",\"12345678\"");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag=1;
send_com("AT+CIPSTART=\"TCP\",\"113.142.153.38\",\"8084\"");
// do{ //检测模块能否正常收到AT指令
// if(RI)
// {
// dat = SBUF;
// RI = 0;
// if(dat=='K')
// flag = 0;
// }
// }while(flag);
ms_delay(100); //延时,保证模块收发完成
flag = 1;
}
main.c文件
#include<reg52.h>
#include"esp8266.h"
#include"ds18b20.h"
/*******************************************************************************
* 函 数 名 : UartInit
* 函数功能 : 串口初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UartInit(void) //9600bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器0为16位定时器,定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时器1初值
TH1 = 0xFA; //设定定时器1重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
uint count;
UartInit();
// lcd_reset();
init_esp();
while(1)
{
count ++;
//LcdDisplay(Ds18b20ReadTemp());
// key_scan();
if(count >= 60000)
{
count = 0;
send_data("1234");
// send_com("hell");
// send_temp();
}
}
}
static uchar datas[10];
void Uart() interrupt 4
{
//ESP8266默认数据帧格式:接收多个连接数据 "\r\n+IPD,%d,%d:data\r\n",ID号,数据data长度
// 接收一个连接数据可能有两种 1."\r\n+IPD,0,%d:data",data长度 2."\r\ndata\r\n"
//接收数据长度自己设定
int len = 10;
int i = 0;
RI = 0;
ES = 0;
while(len--)
{
datas = SBUF;
i++;
}
ES = 1;
}
已退回5积分