精华内容
下载资源
问答
  • APP同过ESP8266与51单片机通信

    千次阅读 2020-01-24 13:09:02
    APP通过ESP8266与单片机通信 简述 本项目中是用ESP8266作为热点,工作在MODE2模式,手机作为station接入ESP8266的网络进行数据传输,同时,ESP8266与52单片机之间通过串口进行数据传输。 本项目中只需要APP向WIFI...

    APP通过ESP8266与单片机通信

    简述

    本项目中是用ESP8266作为热点,工作在MODE2模式,手机作为station接入ESP8266的网络进行数据传输,同时,ESP8266与52单片机之间通过串口进行数据传输。
    本项目中只需要APP向WIFI发送数据,所以在APP的程序中没有接收WIFI数据的程序。在文章最后,则是笔者在写代码的过程中遇到的一个问题,51单片机不能接收WIFI数据,但能向WIFI发送AT指令的问题。

    手机端实现

    建立连接线程

    以下为APP与ESP8266建立连接的线程,建立连接时只要获取其对象即可。其中的IP和port为ESP8266的IP地址和端口号,IP一般默认为192.168.0.1,端口号默认为8080,端口号可以自己设置。

    private class ConnectThred extends  Thread{
            private  String ip;
            private  int port;
            public ConnectThred(String ip,int port){
                this.ip = ip;
                this.port = port;
            }
            public void run(){
                //接收数据可用子线程也可直接在此线程操作
                char[] buffer=new char[256];//定义数组接收输入流数据
                String bufferString="";//定义一个字符接收数组数据
                int conut =0;//初始化buffer数组长度为0
                int tag=0;//初时写入数组的位置
                try {
                    //建立连接
                    socket = new Socket(ip,port);
    
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.d("Controler","runOnUI");
                            bt_link.setText("断开连接");
                            bt_link.setBackgroundColor(Color.GREEN);
                            Toast.makeText(Controler.this,"连接成功",Toast.LENGTH_LONG).show();
                        }
                    });
                    //读取输入流
                    bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    //获取输出流
                    OutputStream=socket.getOutputStream();
                    //获取socket的输出流,接收数据
                    InputStream = socket.getInputStream();
                    while (true) {
                        //当输入流写入buffer数组的长度大于0时即接收到数据时
                        while ((conut=bufferedReader.read(buffer))>0) {
                            //将buffer数组的数据全部写入bufferString字符类型
                            while ( tag<buffer.length) {
                                bufferString=bufferString+buffer[tag];
                                tag++;
                            }
                            //将数据给messageHandler刷新UI界面
                            Message msgMessage =new Message();
                            msgMessage.obj=bufferString;
                            msgMessage.what=1;
                            messageHandler.sendMessage(msgMessage);
                            //初始化数据,以便处理下一条输入流信息
                            tag=0;
                            bufferString="";
                        }
                    }
    
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(Controler.this,"连接错误",Toast.LENGTH_LONG).show();
                        }
                    });
                }
            }
        }
    

    发送数据线程

    以下是APP向ESP8266发送数据的代码,同样在一个子线程中执行。需要发送数据时通过对象调用此方法即可。

     //向服务器发送数据子程序
        public class Send extends Thread{
            public void run(){
                if(socket != null){
                    try{
                        if (msg_send != null && msg_send.length()>0){
                            OutputStream.write(msg_send.getBytes("utf-8"));
                            OutputStream.flush();
                            msg_send="";
                        }
                        else{
                            Looper.prepare();
                            Toast.makeText(Controler.this,"发送的数据不能为空",Toast.LENGTH_LONG).show();
                            Looper.loop();
                        }
                    }
                    catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    

    通过按钮建立或断开连接

    定义相关变量

    private static final String IP = "192.168.4.1";//服务端IP
        private static final int PORT = 8080;         //端口号
        Socket socket;     //创建一个socket
        Boolean IsConnected = false;       //连接标志
        ConnectThred mConnectThread;  //TCP连接线程
    
        //输入输出流
        OutputStream OutputStream = null;//数据输出流,发送数据
        BufferedReader bufferedReader;//声明输入流对象
        InputStream InputStream = null;//定义数据输入流,用于接收数据
    

    通过按钮实现连接:

     bt_link.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {  //连接按钮,点击与ESP8266芯片连接或断开
                        if (socket ==null || !socket.isConnected()){
                            mConnectThread = new ConnectThred(IP,PORT);
                            mConnectThread.start();
                        }
                        if (socket!=null && socket.isConnected()){
                            try {
                                socket.close();
                                socket = null;
                                bt_link.setText("点击连接");
                                bt_link.setBackgroundColor(Color.GRAY);
                                Toast.makeText(Controler.this,"连接已断开",Toast.LENGTH_LONG).show();
                            }catch (IOException e){
                                e.printStackTrace();
                            }
                        }
                }
            });
    

    通过按钮发送数据:
    通过new一个发送数据线程的对象,调用start方法启动发送数据线程即可发送数据。

    select_mode.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mode_count++;
                    if (mode_count > 4)
                        mode_count=0;
                    mode = mode_arr[mode_count];
    
                    msg_send = "mod"+Integer.toString(mode_count)+"/n";
                    new Send().start();
    
                    tempmode.setText(mode);                   //设置模式
                }
            });
    

    下位机端接收WIFI数据

    下位机端使用51单片机实现,下位机端与ESP8266之间通过串口进行通信,传输数据。所以下位机接收WIFI数据时使用的是串口接收程序。

    void UartConfiguration()
    {
      TMOD=0x20;      // 设置计数器1工作模式2
    	TH1=0xfd;			//计数器1初值
    	TL1=0xfd;			//计数器1初值  两个初值决定波特率,此处设置波特率9600
    	PCON=0x00;      //波特率倍增0x00不加倍,0x80加倍
    	SCON=0x50;		// 
    	EA=1;		    //
    	ES=1;			//
    	TR1=1;			//
    	TI=1;
    }
    

    将接收到的数据存入一个数组中然后进行处理

    void ESP_UART() interrupt 4
    {
    	static uchar i=0;
    // 	led1=~led1;
    	if(RI==1)
    	{
    		 RI=0;       //½ÓÊÕ±êÖ¾
    		 Recive_table[i]=SBUF;
    		 sendByte(Recive_table[i]);   
    		 i++;         
    		 if((Recive_table[i-1]=='\n'))
    		 {
    				Recive_table[i]='\0';
    				i=0; 
    		 }
    	}
    	else
    		TI=0;
    }
    

    处理接收到的数据

    void getData()
    {
    	if(Recive_table[0]=="+")
    			sendString(Recive_table);
    		if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))
    		{
    			if((Recive_table[3]=='D')&&(Recive_table[6]==','))
    			{   
    				if(Recive_table[9]=='0')//&& Recive_table[10]=='0'     //
    				{
    					Shutdown();
    				}
    				else if(Recive_table[9]=='1')//&& Recive_table[10]=='1'   //
    				{
    					
    					MakeNum(Recive_table[10],Recive_table[11]);
    					Startup();
    				}
    				else if(Recive_table[9]=='d')//&& Recive_table[10]=='1'   //
    				{
    					MakeNum(Recive_table[10],Recive_table[11]);
    				}
    				else if(Recive_table[9]=='e')//&& Recive_table[10]=='1'   //
    				{
    					MakeNum(Recive_table[10],Recive_table[11]);
    				}
    				else if(Recive_table[9]=='o'&& Recive_table[10]=='d')    //
    				{
    					m_index=Recive_table[11]-'0';
    					SetMode(m_index);
    				}
    				else if(Recive_table[9]=='f')//&& Recive_table[10]=='1'   //
    				{
    					SetSweep(Recive_table[10]-'0');
    				}
    				else if(Recive_table[9]=='p')//&& Recive_table[10]=='1'   //
    				{
    					SetSpeed(Recive_table[10]-'0');
    				}
    				else if(Recive_table[9]=='i')//&& Recive_table[10]=='1'   //
    				{
    					SetDirect(Recive_table[10]-'0');
    				}
    				memset(Recive_table,0,50);
    			}   
    		}
    }
    

    注意

    当ESP8266与51单片机通信时,51单片机不能使用CH340芯片进行串口数据的传输,不然会出现ESP8266发送的数据51单片机接收不到的情况。

    展开全文
  • 51单片机源码和调试助手,源码烧进单片机后按教程走,文档里有一个安卓端的调试助手和一个电脑的调试助手
  • ESP8266wifi模块与51单片机通信教程

    千次阅读 2019-11-10 17:45:59
    ESP8266wifi模块与51单片机通信教程 准备两个200欧左右的电阻 准备6根杜邦线 然后将ES8266通过如图这种方式连接起来 注意:在连接单片机的RX和TX引脚时必须和ESP8266模块的RX和TX反接才能保证正常通信 将程序下载...

    **

    ESP8266wifi模块与51单片机通信教程

    1. 准备两个200欧左右的电阻
    2. 准备6根杜邦线
    3. 然后将ES8266通过如图这种方式连接起来
    4. 注意:必须先配置ESP8266模块,配置需要用到ESP8266的固件烧录器也叫WiFi模块下载器,具体可到某宝上买到,拿到收录器后连接上电脑打开串口调试助手,用调试助手发送如下指令
      5.AT(返回 ok 表示通信成功)
      • AT+CIOBAUD=X(改模块的波特率, X 为要改成的波特率,因单片机达不到
      太高的波特率所以要更改一下波特率,因为我学习板上的晶振是 12MHZ 的,
      所以我这里改成 4800,再发 AT,有 ok 表明通信成功)
      • AT+CWMODE=X(设置工作模式指令, X 可以是 1、 2、 3,具体如下:
      1: Station 模式
      2: AP 模式
      3: Station+AP 模式
      Station 可理解为让 wifi 模块去连接路由器或热点,此时模块作为客户端
      AP 模式可理解为模块本身是一个热点,手机或电脑可以连接这个热点,此时模块作为服务器。
      这里用的是 AP 模式
      • AT+RST(重启指令,设置新的工作模式后需重启才能生效。 发送完这条指令后再发送其它指令可能会显示串口无效,需要退出串口调试助手再重新进入 )
      • AT+CWSAP?(可以查看当前 AP 模式下模块热点的具体信息)
      • AT+CIFSR( 查看 IP 地址,好像都是 192.168.4.1)
      • AT+CIPMUX=1
      • AT+CIPSERVER=1, X( 1 表示开启服务器, X 为自己设置的端口号,一般设 3或 4 位。也可以只开启服务器而不设置端口号,默认端口是 333 好像)注: 倒数的这两条指令在模块掉电后需要重新配置,其它那几条配置过一次不用再重新配置了。
      到这里拿出手机,打开 wifi 并连接上模块的热点。
      连接热点成功后打开网络调试助手这个软件,右滑进入设置,协议设置为TCP Client,即客户端模式, IP 地址为 192.168.4.1,端口为刚才设置的:6666,然后点连接,连接成功后就能通信了
      在这里插入图片描述
      在这里插入图片描述
    5. 注意:在连接单片机的RX和TX引脚时必须和ESP8266模块的RX和TX反接才能保证正常通信
    6. 将程序下载到单片机中
    7. 注意:为保证通信正常必须先将ESP8266上电5S左右后才开启51单片机或MCU,这一步是为了将单片机发送的指令成功发送给ESP8266模块
    8. 打开安卓端的或电脑的调试助手进行调试
    9. 欢迎有问题提问,共同解决
    展开全文
  • 最近学习APP与单片机通过ESP8266通信ESP8266做服务器,APP能将数据发送到ESP8266,但ESP8266不能发送给单片机,请各位大佬帮忙解答一下。下面是代码。万分感谢 ``` void UartConfiguration() { TMOD |=0x20; ...
  • 小车效果 APP效果 设计材料 ESP8266-01s模块。 51单片机最小系统板。 L298N芯片一个。 Android系统手机一部。...ESP8266与51单片机之间使用串口通信。 51单片机通过L298N芯片驱动两个电机,一个负责方向,

    小车效果在这里插入图片描述

    APP效果在这里插入图片描述

    设计材料

    1. ESP8266-01s模块。
    2. 51单片机最小系统板。
    3. L293D芯片一个。
    4. Android系统手机。
    5. 面包板一块。
    6. 充电宝一个,当做电源。
    7. 杜邦线若干。

    设计思路

    说明:这是一个可远程遥控的小车,只要小车连接上WIFI,理论上无论你在多远的地方都能遥控小车,因为使用了onenet云平台;当然如果小车使用GSM模组就更好了,小车在哪都能受控。

    1. ESP8266通过MQTT协议连接onenet云服务器。
    2. ESP8266与51单片机之间使用串口通信。
    3. 51单片机通过L293D芯片驱动两个电机,一个负责方向,另一个负责前进和后退。
    4. ESP8266订阅手机端发布的主题,从而实现手机控制小车。
    5. 工作过程。在这里插入图片描述

    ESP8266端开发

    说明:这是基于ESP8266-SDK进行二次开发的,怎么通过MQTT协议连接onenet不在多说,详情请查看我的另一篇博客看ESP8266端开发部分,提供了源代码,当然你也可以去安信可官方平台下载sdk包;在这里主要完成将相应的消息通过串口发送出去。

    1. 首先,订阅手机发布的CAR主题。
    void mqttConnectedCb(uint32_t *args)
    {
        MQTT_Client* client = (MQTT_Client*)args;
        INFO("MQTT: Connected\r\n");
        MQTT_Subscribe(client, "CAR", 0);//完成订阅
    }
    
    1. 先判断是不是CAR主题,然后将该主题下的消息通过串口发送出去,比如说收到1,那么就在新的一行打印1即可。
    void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
    {
        char *topicBuf = (char*)os_zalloc(topic_len+1),
                *dataBuf = (char*)os_zalloc(data_len+1);
        MQTT_Client* client = (MQTT_Client*)args;
        os_memcpy(topicBuf, topic, topic_len);
        topicBuf[topic_len] = 0;
        os_memcpy(dataBuf, data, data_len);
        dataBuf[data_len] = 0;
      //  INFO("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);
       // INFO("Topic_len = %d, Data_len = %d\r\n", topic_len, data_len);//串口打印主题长度、有效载荷长度
        if( os_strcmp(topicBuf,"CAR") == 0 )//判断是哪一个主题
                  {
                  	if( os_strcmp(dataBuf,"0") == 0 )	//如果收到的是0就打印0
                  	{
                  		os_printf("0\n");
    
                  	}
    
                  	else if( os_strcmp(dataBuf,"1") == 0 )
                  	{
                  		os_printf("1\n");
    
                  	}
                  	//此处省略了2,3,4,5的打印代码,可以自行补充。
                  }
        os_free(topicBuf);
        os_free(dataBuf);
    }
    
    1. 串口调试助手,调试实例。在这里插入图片描述

    51单片机端开发

    1. 说明:51单片机只需要读取到上述串口打印的消息,然后合理的解读到消息内容,同时做出相应的动作就可以了。 比如说,串口收到0,表示让小车左转;收到1让小车右转,收到2停止转向。手机按键是按下左键发送0,抬起左键发送2。这样马达就不会一直处于带电的状态。
    2. 晶振为11.0592M的, 初始化串口,波特率为9600,与ESP8266波特率保持一致即可。
    3. 源程序如下,可直接编译使用:
    #include "reg52.h"	
    #include "intrins.h"
    
    typedef unsigned int u16;	  
    typedef unsigned char u8;
    sbit Led=P3^7;
    sbit JDQ_S=P0^0;
    sbit JDQ_C=P0^1;
    sbit turn_left=P1^1;
    sbit turn_right=P1^2;
    sbit qianjin=P1^3;
    sbit houtui=P1^4;
    u8 receivearray[100];
    //串口初始化函数,波特率设置为9600
    void UsartInit()
    {
    	  SCON=0x50;                                           
          PCON=0x80;                 
          TMOD=0x21;                
          TH1=0xFA;          
          TL1=TH1;
          EA=1;                     
          ES=1;                      
          TR1=1;   
    }
    //串口发送函数,发送函数第一位为2,esp8266端才会发布消息
    void Sent2Esp8266(u8 *p)				
    {	
     	while(*p)
     	{
    	 	SBUF=*p;
    		while(!TI);
    		TI=0;
    		p++;
    	}   
    }
    
    //主函数
    void main()
    {	
    	UsartInit();  
    	while(1)
    	{
    		
    				
    }
    	}
    //串口中断函数,用来读取串口读取到的数据
    u8 i=0;
    void Usart() interrupt 4
    {
    	u8 receiveData;
    	receiveData=SBUF;
    	receivearray[i]=receiveData;
    	i++;
    	if(receivearray[i-1]=='\n')i=0;	
    	switch(receivearray[0])
    		{
    			case '0':
    				turn_left=1;
    				turn_right=0;
    			    Led=1;
    				//Sent2Esp8266("turn_left");
    			break;
    			case '1':
    				turn_left=0;
    				turn_right=1;
    			    Led=0;
    				//Sent2Esp8266("turn_right");
    			break;
    			case '2':
    					turn_left=0;
    				turn_right=0;
    				//Sent2Esp8266("stop_turn");
    			break;
    			case '3':
    				qianjin=1;
    			    houtui=0;
    				//Sent2Esp8266("qianjin");
    			break;
    			case '4':
    				qianjin=0;
    			    houtui=1;
    				//Sent2Esp8266("houtui");
    			break;
    			case '5':
    				qianjin=0;
    			    houtui=0;
    				//Sent2Esp8266("stop");
    			break;
    		}
    	RI = 0;
    	SBUF=receiveData;
    	while(!TI);			 
    	TI=0;						
    }
    
    1. L293D的使用,只需要使用单片机的6个管脚就够了,两个控制前进后退,两个控制方向,两个使EN能端。比如说P1.0,P1.1来控制方方向,当高低电平不同时,电机旋转方向不同,将P1.0接1A,P1.1接2A;1Y、2Y接在电机上另一个电机也是一样,4、5、12、13管脚是联通的,将其中的一个接地即可,EN使能端高电平有效,可以给两个使能高电平,VCC1、2接电源正极在这里插入图片描述

    APP端开发

    1. 开发环境AndroidStudio3.6。
    2. 这里只说明一些代码的作用,详情请查看我的另一篇博客看APP开发部分
    3. 手机端是不需要订阅消息的,只需要按键触发发布消息就可以了,下面是相关代码。
    4. 你可以下载最下面的源码填写你的OneNet相关ID直接使用。
    @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (v.getId()){
                case R.id.left:
                    if(event.getAction()==MotionEvent.ACTION_DOWN){//如果按键是按下的状态
                        btn_left.setTextColor(Color.parseColor("#6200EE"));//更改按键颜色
                        byte[] left={'0'};//左转所要发布的消息
                        MqttPublish mqttPublish_left=new MqttPublish("CAR",left,QoS.AT_LEAST_ONCE);//这里一CAR主题名发布
                        MqttClient.getInstance().sendMsg(mqttPublish_left);//发布消息
                    }else if(event.getAction()==MotionEvent.ACTION_UP){
                        btn_left.setTextColor(Color.parseColor("#c0c0c0"));
                        byte[] left={'2'};
                        MqttPublish mqttPublish_zt=new MqttPublish("CAR",left,QoS.AT_LEAST_ONCE);
                        MqttClient.getInstance().sendMsg(mqttPublish_zt);
                    }
                    break;
                case R.id.right:
                    if(event.getAction()==MotionEvent.ACTION_DOWN){
                        btn_right.setTextColor(Color.parseColor("#6200EE"));
                        byte[] right={'1'};
                        MqttPublish mqttPublish_left=new MqttPublish("CAR",right,QoS.AT_LEAST_ONCE);
                        MqttClient.getInstance().sendMsg(mqttPublish_left);
                    }else if(event.getAction()==MotionEvent.ACTION_UP){
                        btn_right.setTextColor(Color.parseColor("#c0c0c0"));
                        byte[] left={'2'};
                        MqttPublish mqttPublish_zt=new MqttPublish("CAR",left,QoS.AT_LEAST_ONCE);
                        MqttClient.getInstance().sendMsg(mqttPublish_zt);
                    }
                    break;
                case R.id.qj:
                    if(event.getAction()==MotionEvent.ACTION_DOWN){
                        btn_qj.setTextColor(Color.parseColor("#6200EE"));
                        byte[] right={'4'};
                        MqttPublish mqttPublish_left=new MqttPublish("CAR",right,QoS.AT_LEAST_ONCE);
                        MqttClient.getInstance().sendMsg(mqttPublish_left);
                    }else if(event.getAction()==MotionEvent.ACTION_UP){
                        btn_qj.setTextColor(Color.parseColor("#c0c0c0"));
                        byte[] left={'5'};
                        MqttPublish mqttPublish_zt=new MqttPublish("CAR",left,QoS.AT_LEAST_ONCE);
                        MqttClient.getInstance().sendMsg(mqttPublish_zt);
                    }
                    break;
                case R.id.ht:
                    if(event.getAction()==MotionEvent.ACTION_DOWN){
                        btn_ht.setTextColor(Color.parseColor("#6200EE"));
                        byte[] right={'3'};
                        MqttPublish mqttPublish_left=new MqttPublish("CAR",right,QoS.AT_LEAST_ONCE);
                        MqttClient.getInstance().sendMsg(mqttPublish_left);
                    }else if(event.getAction()==MotionEvent.ACTION_UP){
                        btn_ht.setTextColor(Color.parseColor("#c0c0c0"));
                        byte[] left={'5'};
                        MqttPublish mqttPublish_zt=new MqttPublish("CAR",left,QoS.AT_LEAST_ONCE);
                        MqttClient.getInstance().sendMsg(mqttPublish_zt);
                    }
                    break;
            }
            return true;
        }
    
    1. 点击下载源码
      到此就结束喽,有什么问题的话,还请大家指出。
    展开全文
  • 使用ESP826651单片机的智能开关/智能灯

    万次阅读 多人点赞 2017-03-29 11:04:54
    本文章所介绍的智能开关为在局域网内实现手机开关的简单方法,功能能简单,仅供参考。 如果对ESP8266模块不了解...TCP通信调试:Python3二、硬件电路连接ESP8266的最小系统参照:ESP8266与电脑连接 ESP8266最小系统与

    本文章所介绍的智能开关为在局域网内实现手机开关的简单方法,功能能简单,仅供参考。

    如果对ESP8266模块不了解,请阅读以下两篇文章:
    ESP8266与电脑连接
    ESP8266基础功能调试

    一、软件工具

    单片机编程:keil
    手机应用编程:Android Studio
    TCP通信调试:Python3

    二、硬件电路连接

    ESP8266的最小系统参照:ESP8266与电脑连接
    ESP8266最小系统与单片机最小系统连接:
    这里写图片描述
    在正常使用的时候,固件刷写开关不需要打开,如果需要热刷写固件,可以考虑将刷写固件的引脚与单片机的引脚相连。
    ESP8266内是一块单片机,也可以通过模块本身直接控制开关,本文仅使用模块的TCP透传功能,这里不再展开。

    三、单片机程序编写

    (1)首先定义如下变量/常量:

    /**********类型定义**************/
    #define u8 unsigned char
    #define u16 unsigned int
    #define u32 unsigned long
    #define code const
    
    /***********IO定义***************/
    //定义P5.5口 LED指示灯
    sbit  LED=P2^4;         
    
    /**********缓存变量**************/
    //串口接受缓存
    u8 xdata RX_buffer[tbuf];
    //接收计数变量
    u8 RX_num;
    
    /**********预定义字符串**************/
    //握手连接指令,返回"OK"
    u8 code esp_at[]="AT\r\n";
    //设置ESP8266的工作模式1 Station,返回"OK"或者"no change"
    u8 code esp_cwmode[]="AT+CWMODE=1\r\n";
    //连接到WiFi热点或无线路由上,NXP为无线路由名称,12345678为密码;连接成功返回“OK”             
    u8 code esp_cwjap[]="AT+CWJAP=\"NXP\",\"123456789\"\r\n";
    //本机IP地址查询指令                     
    u8 code esp_cifsr[]="AT+CIFSR\r\n";
    //连接到TCP服务器,返回“Linked”
    //192.168.0.149为服务器IP地址 6000为服务器端口号 不同电脑不同软件可能会不一样的
    u8 code esp_cipsta[]="AT+CIPSTART=\"TCP\",\"192.168.0.149\",6000\r\n"; 
    // 设置发送数据长度
    u8 code esp_cipsend[]="AT+CIPSEND=5\r\n";
    
    
    //设置多链接
    u8 code esp_DuoLianjie []="AT+CIPMUX=1\r\n";        
    //设置端口号
    u8 code esp_Port []="AT+CIPSERVER=1,3122\r\n";      
    //查询模块自身IP,返回IP地址
    u8 code esp_IP []="AT+CIFSR\r\n";                   
    
    //服务器发送 握手数据
    u8 code esp_Woshou []=":test";
    //服务器发送 LED检测数据             
    u8 code esp_test_LED []=":LED";
    //服务器发送 打开LED              
    u8 code esp_LED_ON []=":LED ON";
    //服务器发送 关闭LED           
    u8 code esp_LED_OFF []=":LED OFF";          
    
    //复位重启
    u8 code esp_Rst []="AT+RST\r\n";            
    //发送数据长度
    u8 code esp_DATA []="AT+CIPSEND=1024\r\n";   

    接下来是缓存字符串比较函数,用于判断返回值中是否含有OK等来自ESP8266模块的工作标识。如需用到更复杂的匹配,可以将之替换为正则表达式引擎。

    //指定字符串与缓存数组数据进行数据比较
    //*p 要比较的指定字符串指针数据
    //返回:1 数据一致  0 数据不一致 
    u8 Data_compare(u8 *p)
    { 
        if(strstr(RX_buffer,p)!=NULL)
            return 1;
        else
            return 0;
    }

    程序的变量已经定义完,接下来是介绍主程序的部分。

    (2)端口初始化

    51单片机部分无需初始化端口,另一部分需要初始化端口才能使用:

    //针对 IAP15W4K61S4   STC15W4K56S4 系列 IO口初始化
    //io口初始化 P0 P1 P2 P3 P4 为准双向IO口   
    //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
    //      高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
    //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
    //        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
    void IO_init(void)
    {
      P0M0 = 0X00;
      P0M1 = 0X00;
    
      P1M0 = 0X00;
      P1M1 = 0X00;
    
      P2M0 = 0X00;
      P2M1 = 0X00;
    
      P3M0 = 0X00;
      P3M1 = 0X00;
    
      P4M0 = 0X00;
      P4M1 = 0X00;  
    }

    串口配置及中断配置:

    void UartInit(void)     
    {      
        S2CON = 0x50;       //8位数据,可变波特率
        AUXR |= 0x04;       //定时器2时钟1为FOSC,即1T
    
        T2L=(65536-(11059200/4/115200));    //设置定时初值
        T2H=(65536-(11059200/4/115200))>>8; //设置定时初值
    
        AUXR |= 0x10;       //启动定时器2       
    }
    
    //串口2发送串口数据(字节)
    void Uart2SendByte(u8 ch)
    {
        S2BUF = ch;                 //写数据到UART2数据寄存器
        while(!(S2CON&S2TI));    
        S2CON&=~S2TI;
    }
    
    //串口2发送字符串
    void Uart2SendStr(u8 *s)
    {
     IE2 = 0x00; 
        while (*s)                  //检测字符串结束标志
        {
           Uart2SendByte(*s++);     //发送当前字符
        }
     IE2 = 0x01;
    }
    
    //串口2中断
    void Uart2() interrupt 8 using 1
    {
    
            IE2 = 0x00;       //关闭串口2中断
        if (S2CON & S2RI)
        {
            S2CON &= ~S2RI;         
                    RX_buffer[RX_num] = S2BUF; 
                    RX_num++;               
                    if(RX_num>tbuf) RX_num = 0;  
        }
        if (S2CON & S2TI)
        {
            S2CON &= ~S2TI;            
        }
            IE2 = 0x01;     //开启串口2中断
    
    }
    

    调用这一段代码中的UartInit(void) 函数初始化串口。
    全部初始化完毕后,就可以使用代码对ESP8266配置了。

    // 1 发送AT 进行握手
        while(1)
        {
         Uart2SendStr(esp_at);     //串口2对wifi模块发送握手指令 即AT
         if(Data_compare("OK"))break;
         else  Uart1SendStr("ERROR1,some problems with ESP8266 \r\n");
         delay1ms(600);
        }
         Uart1SendStr("OK,mcu connection success with ESP8266! \r\n");
         memset(RX_buffer, 0, tbuf);//清缓存数据
         RX_num=0;                 //接收计数变量清0
    
    
    
        // 2 配置wifi工作模式为SA模式
        while(1)
        {
         Uart2SendStr(esp_cwmode);     //串口2对wifi模块工作模式进行设置  
         if(Data_compare("OK")||Data_compare("no change"))break;
         delay1ms(600);
        }
         memset(RX_buffer, 0, tbuf);//清缓存数据 
         RX_num=0;                 //接收计数变量清0
    
    
    
        // 3 连接热点wifi  wifi名 密码  如果失败 延时继续连接
        while(1)
        {
         Uart2SendStr(esp_cwjap);      //串口2发送 指点wifi名 密码 等待模块连接 
         if(Data_compare("OK"))break;
         delay1ms(3000);
        }
        memset(RX_buffer, 0, tbuf);//清缓存数据
        RX_num=0;                  //接收计数变量清0
    
    
         // 4 设置多链接
        while(1)
        {
             Uart2SendStr(esp_DuoLianjie);              //设置多链接
             if(Data_compare("OK"))break;
             delay1ms(3000);
        }
        memset(RX_buffer, 0, tbuf);//清缓存数据
        RX_num=0;                  //接收计数变量清0
    
        // 5 设置端口号
        while(1)
        {
             Uart2SendStr(esp_Port);                //设置端口号
             if(Data_compare("OK"))
             {
                delay1ms(3000); 
                break;
             }
             delay1ms(3000);
        }
        Uart1SendStr("OK,Succeed esp_Port\r\n");    
        memset(RX_buffer, 0, tbuf);//清缓存数据
        RX_num=0;                  //接收计数变量清0
    

    这时,模块已经被配置成Station模式连接上我们测试的路由器,并且开放了3122端口,我们就可以进行开关灯的操作了。

    展开全文
  • 使用51单片机驱动ESP8266相关问题讲解ESP8266有三种模式:STA,AP,AP+STA通过单片机的串口将ESP...1,ESP8266与单片机串口连接,即交叉连线:RX-TX TX-RX2,ESP8266与单片机的波特率设置为一样注意:单片机串口(实际...
  • 使用51单片机驱动ESP8266相关问题讲解 ESP8266有三种模式:STA,AP,AP+STA 通过单片机的串口将ESP8266EX模块设置AP模式,然后通过手机网络调试助手(连接上ESP8266)发送数据,单片机收到以后,处理数据,并点灯 举例...
  • 51单片机通过WIFI模块ESP8266控制LED灯

    万次阅读 多人点赞 2018-06-16 18:47:40
    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而...
  • 1. ESP8266与USB-TTL转串口连接 ESP8266管脚 VCC CH_PD/EN TX RX GND USB-TTL管脚 3.3V 3.3V RXD TXD GND  连线完成后,插入电脑USB口准备通过串口调试助手向ESP8266发送AT指令进行配置和测试。 2. 通过...
  • 一、电脑端实现单片机与ESP8266通信

    千次阅读 多人点赞 2019-07-02 10:14:32
    硬件:51单片机开发板、ESP8266无线模块(ESP8266-01)、TTL-USB串口、杜邦线、数据线; 软件:keil uv4单片机软件、STC-ISP烧录软件、串口调试助手:SSCOM或ATK-XCOM、TCP/UDP调试助手:SocketTool或网络调试助手...
  • ESP8266与51单片机控制系统,包括液晶1602、电机,通过按钮可经ESP8266向上位机会送数据。通过Protues的控件映射到计算机的串口上,Protues系统通过计算机串口与ESP8266通信
  • 手机APP通过ESP8266 WIFI模块与51单片机通信控制四路继电器。下位机由单片机、ESP8266模块和继电器模块组成,上位机由Android手机APP承担。我们在APP上发送继电器的开关控制指令,ESP8266将收到的数据发送给单片机,...
  • MSP430F149与ESP8266串口通信(上)

    千次阅读 2018-11-01 22:13:19
    针对网上90%的例程都是针对51单片机(或者STM32)和ESP8266模块进行串口通信,故开此帖记录MSP430与ESP8266对接的过程,希望大家不要走弯路,及时实现自己所需要的功能。本帖分为MSP430F149与ESP8266串口通信(上)...
  • 手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而...
  • 1.3、ESP8266WIFI模块和HTTP通信

    千次阅读 2019-06-11 20:36:36
    以下代码是基于51单片机ESP8266WIFI模块和HTTP通信,使用AT指令进行,因为需要设计和后端进行交接,所以还有 //get请求/post请求略,可参看截图写出。 为了更好的验证模块是否在接收指令之后能够正确返回,即OK...
  • MCS-51单片机内部有两个独立的接收发送SBUF,接收SBUF不能发送,发送SBUF不能接收,它们共用一个地址(99H)。内部逻辑结构下图所示:在串行内部逻辑结构中可以看到,串行通信除了SBUF有关外,还串行口控制...
  • 文章目录前言预备知识正文ESP8266模块的配置代码设计总结 前言 学了这么长,今天给大家分享一个小项目的雏形。...快速学习51单片机串口通信 以及单片机按键液晶的使用 正文 (因为疫情原因,没开
  • 基于51单片机WiFi温湿度远程控制 硬件 STC89C52RC单片机最小系统 ESP8266系列模块 5V继电器模块 蜂鸣器 DHT11温湿度传感器 软件 keil4 sbit LED1=P1^0; //手动自动状态 sbit LED2=P1^1; //湿度状态 sbit LED3=P1...
  • 所使用硬件设备主要包括51单片机开发板、ESP8266 WIFI无线模块。ESP8266 WIFI模块本文主要介绍上位机端开发,通过使用PC端开发软件实现电脑端创建TCP连接服务器,为下一步ESP8266作为TCP客户端实现客户端服务器端...
  • 所使用硬件设备主要包括51单片机开发板、ESP8266 WIFI无线模块。ESP8266 WIFI模块本文主要介绍上位机端开发,通过使用PC端开发软件实现电脑端创建TCP连接服务器,为下一步ESP8266作为TCP客户端实现客户端服务器端...
  • wifi+温传.zip

    2020-07-17 12:34:18
    51单片机作为WIFI麦轮小车温度采集系统控制中心,与ESP8266WIFI模块、直流电机、L298N驱动模块、蜂鸣器、温度传感器一起构成可用手机控制的WIFI麦轮温度测量小车系统。单片机输出高低电平来驱动电机驱动模块,控制4...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

esp8266与51单片机通信