入门级教程,大神请飘过

最近做了个esp8266与手机app的点灯和温度回传小实验。在51单片机上完成温度读取和小灯的控制。

esp8266入手,先是阅读数据手册,看WiFi模块esp8266工作的波特率,了解AT指令。



我使用的esp8266模块波特率是115200,型号是ATK-esp8266.


esp8266工作在AP模式,即esp8266模块作为热点,手机连接esp8266,根据scoket通信的要求,需要知道esp8266的IP和端口号手机才能给esp8266发送命令字符。

接下来是esp8266模块的AT指令。

* 查看ESP8266中文数据手册在串口助手里输入以下指令初始化esp8266
AT          //AT测试AT启动语句

返回以OK结尾的字符串
AT+CWMODE=2    //设置WIFI模式,=1时Sta模式,=2时AP模式,=3时为Sta/AP模式

返回以OK结尾的字符串
AT+RST           //重启WIFI模块

返回以ready结尾的字符串

AT+CIFSR               //查看路由器分配给模组的IP地址

返回IP地址,像192.168.4.1

AT+CWSAP="my_wifi","12345678",1,0,4,0  //设置wifi名称为my_wifi,12345678是WiFi密码
返回以OK结尾的字符串
AT+CIPMUX=1    //设置多连接方式
返回以OK结尾的字符串
AT+CIPSERVER=1,8086     //设置wifi模块端口号

返回以OK结尾的字符串
 

* 打开与WIFI模块匹配的APP
*
* 输入IP地址192.168.4.1和端口号8086
* .
连接esp8266的wifi,点击连接app里的小灯,在串口看到app发送到esp8266的字符。



测试完成,贴代码。

#include <reg52.h>

#include<stdio.h>

#include<string.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

 

sbit led1=P1^0; //第一个灯

sbit led2=P1^1;//第二个灯

sbit led3=P1^2;//第三个灯

sbit led4=P1^3;//第四个灯

sbit ds=P2^2; //ds18b20的io口

uint temp; //int型的温度值

float f_temp;//float型的温度值

                 

 

uchar xdata Receive_table[255]="";     //接收缓冲数组

uchar Receive,i;            

uchar UART0_Len=0;                        //接收数组下标                            
                               

uchar Len=0;         //接收到字符‘+’的下标

 

 

void Delay_Us(uchar us)

{

                  while(us--);

}

 

 

void delay(uint z)                     

{

         int x,y;

         for(x=z;x>0;x--)

                  for(y=110;y>0;y--);

}

//*****DS18B20******

void dsreset(void)                    写bit

{

         uint i;

         ds=0;

         i=103;

         while(i>0)

                  i--;

         ds=1;

         i=4;

         while(i>0)

                  i--;

}

bit tempreadbit(void)                       读bit

{

         uint i;

         bit dat;

         ds=0;

         i++;

         ds=1;

         i++;

         i++;

         dat=ds;

         i=8;

         while(i>0)

                  i--;

                  return(dat);

}

 

uchar tempread(void)                           读一个字节             

{

         uchar i,j,dat;

         dat=0;

         for(i=1;i<=8;i++)

         {

                  j=tempreadbit();

                  dat=(j<<7)|(dat>>1);              

         }

         return(dat);

}

 

void tempwritebyte(uchar dat)      写一个字节

{

         uint i;

         uchar j;

         bit testb;

         for(j=1;j<=8;j++)

         {

                  testb=dat&0x01;

                  dat=dat>>1;

                  if(testb)                             

                  {

                          ds=0;

                          i++;

                          ds=1;

                          i=8;

                          while(i>0)

                                   i--;

                  }

                  else                                    

                  {

                          ds=0;

                          i=8;

                          while(i>0)

                                   i--;

                          ds=1;

                          i++;

                          i++;

                         

                  }

         }

}

void tempchange(void)     转换温度

{

         dsreset();

         delay(1);

         tempwritebyte(0xcc);

         tempwritebyte(0x44);

}

 

uint get_temp()      计算温度

{

         uchar a,b;

         dsreset();

         delay(1);

         tempwritebyte(0xcc);

         tempwritebyte(0xbe);

         a=tempread();                                  

         b=tempread();                                  

         temp=b;

         temp<<=8;                                                 

         temp=temp|a;

         f_temp=temp*0.0625;  

         temp=f_temp*10+0.5;  

         f_temp=f_temp+0.05;

         return temp;

}

 

 

 

void init_com(void)   串口初始化

{

         TMOD=0x20;

         SCON = 0X50;  //定时器2,16位自动重装

         TH2=0XFF;       //给定时器赋初值

         TL2=0XFD;   //给定时器赋初值

         RCAP2H=0XFF;//定时器自动重装初值

         RCAP2L=0XFD;//16位自动重装初值

         TCLK=1;

         RCLK=1;

         C_T2=0;

         EXEN2=0;

         TR2=1;

         ES = 1;

         EA = 1;

 

        

}

 

void comm(char *parr)//发送数组

{

do{

                  SBUF=*parr++;

                  while(!TI);

                  TI=0;

         }while(*parr);         

}

 

void Uart_Send_Char(uchar dat)//·发送字符

{

         ES = 0;

         TI = 0;

         SBUF = dat;

         while(!TI);

         TI = 0;

         ES = 1;

}

 

void Uart_Send_String(uchar *string)//发送字符串

{

         while(*string)

         {

                  Uart_Send_Char(*string++);

                  Delay_Us(5);

         }

         delay(20);

}

 

void ESP8266_Init()    //esp8266的AT指令初始化

{

         //Uart_Send_String("AT\r\n");      

         Uart_Send_String("AT+RST\r\n");

         Uart_Send_String("AT+CWMODE=2\r\n");

         Uart_Send_String("AT+CIPMUX=1\r\n");

         Uart_Send_String("AT+CIPSERVER=1,8086\r\n");

}

 

 

void Init()//串口+esp8266初始化

{

         init_com();

         delay(100);

         ESP8266_Init();

}

 

void main()

{

         uchar buff[4],a=0;

         Init();

         while(1)

         {     

                  if(Receive_table[Len+1]==0x49)  
//判断接收到的是否是‘I’,esp8266发送协议字符之前加‘+IPD,0,1:’

                  {      

                 
if((Receive_table[Len+2]==0x50)&&(Receive_table[Len+3]==0x44))

                          switch(Receive_table[Len+9]) 
//字符为’1‘亮第一个灯,为’4‘灭第一个灯,为’2‘亮第二个灯,为’5‘灭第二个灯,

//依次类推

                          {

                                   case 0x31: led1=0;break;           

                                   case 0x32:  led2=0;break;       

                                   case 0x33:  led3=0;break;         

                                   case 0x34:  led4=0;break;       

                                   case 0x35:  led1=1;break;           

                                   case 0x36: 
led2=1;break;                    

                                   case 0x37:  led3=1;break; 

                                   case 0x38:  led4=1;break;           

                          }

                 

                  }

                  tempchange();

                  a++;

                  for(i=1;i>0;i--)

                  {

                          get_temp();                                       

                  }

                  if(a==100){

                  sprintf(buff,"%f",f_temp);                  //
将flaot类型的温度转换为只有两位小数的字符型   

                  ES=0;

                  Uart_Send_String("AT+CIPSEND=0,11\r\n");//发送数据的AT指令

                  comm(buff);

                  Uart_Send_String("\r\n");

                  ES=1;

                  }

         }

        

}

void UART1_int(void) interrupt 4

{       

         ES=0;

        
RI=0;                                                                                      

         Receive_table[UART0_Len] = SBUF;                         

        
if(SBUF==0x2B)                                                                   

         {

                 
Len=UART0_Len;                                                       

         }

         ES=1;

         UART0_Len++;       

        

}

 

初次之作,发现叙述有错误,请留言滴滴我,望指正!