ESP8266控制2051单片机的LED亮灭

@[TO近年来物联网控制渐渐流行起来了,我闲着无事就打算来玩一下,本打算上淘宝买成品的拿来就使用的,可是回想起N年前玩51单片机时大神朋友的一句话:“自己制作的东西虽然不值钱,但是可以拓展自己的思维空间,享受制作过程中的乐趣,体会成功每一步后的喜悦”!于是我就买了两块ESP8266-01模块(两才12元)实物见下图:ESP8266控制2051单片机的LED亮灭_第1张图片

在等快递的几天里我仔细在网络论坛里查找了WiFi模块控制单片机帖子和博文,发现有的是用网络助手软件控制,有的是用APP和51单片机控制的,有的还要烧写什么固件的,我也决定使用APP和50单片机控制方案之后,就在我要自学网里,通过20多天的安卓软件开发视频教程的学习后(学习的是使用eclipse软件开发安卓,我看论坛里好多朋友都说过时了样,现在都用AndroidStudio了),参照网络论坛朋友和博主朋友发的一些帖子、博文,我终于写好了APP了,我又下载了串口助手,使用USB转TTL转换器将WiFi模块到电脑上,在串口助手里给模块发送:AT
AT+CWMODE=2 //设置AP模式
AT+RST //重启生效
AT+CIPMUX=1 //启动多连接
AT+CIPSERVER=1,8080 //建立server
如下图:ESP8266控制2051单片机的LED亮灭_第2张图片

我又用电脑连接这个WiFi模块发送的热点后,在eclipse软件里启动AVD虚拟机后运行myapp,输入WiFi模块的IP:192.168.4.1,端口号:8080
(注意WiFi模块的IP是出厂设置的样,可以在串口助手里给模块输入:AT+CIFSR获取)
如下图ESP8266控制2051单片机的LED亮灭_第3张图片

在eclipse软件里运行编译好了的myapp如下图ESP8266控制2051单片机的LED亮灭_第4张图片

点击APP里面的开和关按键,在电脑串口助手里就显示出来了模块接收到的消息了,+IPD,0,1:0是开 +IPD,0,1:1是关,我点了两次开后又点了两次关,最后又点了开和关各一次串口助手里都正确接收了的如下图:ESP8266控制2051单片机的LED亮灭_第5张图片

接下来我就用Keil软件编译好WiFi模块控制51单片机上的LED程序,找到我抽屉里几年前买的AT89C2051单片机,制作好了单片机最小系统后,又用自己制作的烧写器将HEX文件下载到2051里面,将APP重新签名后导出安装到手机上,用手机连接模块发送的热点后,打开myapp输入IP和端口号,点击连接可是APP一下子就闪退了,后我通过网络论坛才知道可能是我编译APP的版本问题,我又下载了Android5.1.1版API(因为我还有一个旧手机刚刚是5.1.1版本的),原来开始使用eclipse软件我只下了Android4.4版的,因为新版的API太大了我的硬盘小,D盘分配也小网络下载速度也很慢的,最后重新编译好myapp又签名导出安装在旧手机上面,连接好WiFi模块和2051单片机,使用myapp连接WiFi模块发送的热点,成功控制了2051单片机上的LED亮灭了,见下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200526211640432.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Rlbm1pbnNoZW4=,size_16,color_FFFFFF,t_70ESP8266控制2051单片机的LED亮灭_第6张图片
ESP8266控制2051单片机的LED亮灭_第7张图片

下一步就是将能接受控制的LED后级加上继电器就可以用APP完美控制电器了。可是现在出现了一个问题就是在APP里点击开或者关时,有时候要点击2次或者3次才能正确执行开或者关的指令,用串口助手里接受查看每一次指令又是正确的,不知道是怎么回事了,还请知道的高手朋友给看看,谢谢啦!!!
下面是51单片机程序:
#include
#include
#include

sbit P37_LED=P3^7;

char Recive_table[20]=""; //接收缓冲,最大20个字节
char Recive_state = 0; //接收完成标志
void WIFI_Init(void);
void Uart_Init(void);
void ms_delay(int t);
void LED(void);

int main (void)
{
/功能初始化***/
Uart_Init();//串口初始化,波特率为9600
ms_delay(1000) ;
WIFI_Init(); //wifi初始化
P37_LED=1;
/**************************************************/
/主循环
/
while(1)
{
ms_delay(10) ;
if(Recive_state == 1)
{
ES=0; //清空接收标志位
if((Recive_table[0]’+’)&&(Recive_table[1]‘I’)&&(Recive_table[2]‘P’))//接收到的字符串形式为+IPD,x,x:y
{
if((Recive_table[3]
‘D’)&&(Recive_table[6]’,’))
{
if(Recive_table[9]
‘0’)
P37_LED = 0;
if(Recive_table[9]==‘1’)
P37_LED = 1;
}
}
memset(Recive_table,’\0’,20);
Recive_state = 0;
ES=1; //打开接收标志位
}

}
/****************************************************/

}

/******************************************************************
函 数: void Uart_Interrupt() interrupt 4
功 能: 串口中断函数,将收到的字符存到Recive_table[]数组中
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Interrupt() interrupt 4
{
static char i=0; //因为是一位一位接收,所以用static
if(RI==1)
{
ES = 0;
RI=0;
Recive_table[i]=SBUF;
i++;
if((Recive_table[i-1] == ‘\n’))
{
Recive_table[i]=’\0’;
i=0;
Recive_state = 1;
}
ES = 1;
}
else
TI = 0;
}

/******************************************************************
函 数: void Uart_Init(void)
功 能: 串口初始化,波特率为9600(这个不会,上网百度)
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Init(void)
{
TMOD=0x20;
TH1=0xfD;
TL1=0xfD;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}

/******************************************************************
函 数: void ms_delay(int t)
功 能: 毫秒级延时
参 数: 无
返回值: 无
*******************************************************************/
void ms_delay(int t)
{
int i,j;
for(i=t;i>0;i–)
for(j=110;j>0;j–);
}

/******************************************************************

*******************************************************************/

/******************************************************************
函 数: void WIFI_Init(void)
功 能: wifi初始化(名字:esp8266;密码:1234567890)
参 数: 无
返回值: 无
*******************************************************************/
void WIFI_Init(void)
{
ES = 0;
TI = 1;
printf(“AT+RST\r\n”);
//LED();
ms_delay(1000) ;
printf(“AT+CWMODE=3\r\n”);
//LED();
ms_delay(1000) ;
printf(“AT+CIPMUX=1\r\n”);
//LED();
ms_delay(1000) ;
printf(“AT+CIPSERVER=1,8080\r\n”);
//LED();
//ms_delay(1000) ;
printf(“AT+CIOBAUD=9600\r\n”); // 设置与单片机一致的波特率
//LED();
ms_delay(1000) ;
while(!TI);
TI = 0;
ES = 1;
}

这个是myapp程序
package com.example.myapp;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

import com.example.myapp.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
private EditText mIp; // IP
private EditText mPort; // 端口号
private String mStrIp; // 字符串类型ip
private int miPort; // 字符类型端口
private Button mBtnConnect; // 连接
private Socket mSocket; // 套接字
private PrintStream out; // 打印输出流
private ConnectThread mConnectThread; // TCP连接线程
private Button mMotorZ; // 按钮LED灯开
private Button mMoyorF; // 按钮LED灯关

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	mBtnConnect=(Button)findViewById(R.id.mBt1);
    mMotorZ=(Button)findViewById(R.id.mBt2);
    mMoyorF=(Button)findViewById(R.id.mBt3);

    mIp=(EditText)findViewById(R.id.mEtIP);
    mPort=(EditText)findViewById(R.id.mEtPort);

    mBtnConnect.setOnClickListener(this);
    mMotorZ.setOnClickListener(this);
    mMoyorF.setOnClickListener(this);

	
}

@Override
public void onClick(View v) {
	// TODO 自动生成的方法存根
	switch (v.getId()) {
	case R.id.mBt1:
		 if( mSocket == null || ! mSocket.isConnected()) {
			 mStrIp = mIp.getText().toString(); 
			 miPort = Integer.valueOf(mPort.getText().toString());
			 mConnectThread = new ConnectThread(mStrIp, miPort);
			 mConnectThread.start();
         }
             if(mSocket != null && mSocket.isConnected()){
                 try {
                     mSocket.close();
                     mSocket=null;   //  清空mSocket

mBtnConnect.setText(“连接”);
Toast.makeText(MainActivity.this,“连接已关闭”, Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}

             }
                   break;
             case R.id.mBt2:
                 if(out!=null){
                     out.print("0");
                     out.flush();
                 }
                 break;
                 case R.id.mBt3:
                   if (out!=null){
                  out.print("1");
                  out.flush();

		 }
		break;

	default:
		break;
	}
}

public class ConnectThread extends Thread{

	private String ip;
    private int port;
    public ConnectThread(String ip,int port){
        this.ip=ip;
        this.port=port;
    }

    @Override
    public void run() {
        try {
            mSocket=new Socket(ip,port);
            out = new PrintStream(mSocket.getOutputStream());
            runOnUiThread(new Runnable(){
                @Override
                public void run() {
                    mBtnConnect.setText("断开");
                    Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_LONG).show();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        runOnUiThread(new Runnable(){
            @Override
            public void run() {
                    mBtnConnect.setText("断开");
                    Toast.makeText(MainActivity.this,"连接失败",Toast.LENGTH_LONG).show();

            }
        });
        }
}
}


}

这个是布局文件

android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_x=“9dp”
android:layout_y=“24dp”
android:text=“服务器IP:”
android:textSize=“20dp”
tools:ignore=“HardcodedText,MissingConstraints,ObsoleteLayoutParam,SpUsage” />

android:id="@+id/mEtIP"
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_x=“112dp”
android:layout_y=“20dp”
android:ems=“10”
android:inputType=“textPersonName”
android:text=“192.168.4.1”
tools:ignore=“HardcodedText,LabelFor,ObsoleteLayoutParam” />

android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_x=“36dp”
android:layout_y=“86dp”
android:text=“端口:”
android:textSize=“20dp”
tools:ignore=“HardcodedText,MissingConstraints,ObsoleteLayoutParam,SpUsage” />

android:id="@+id/mEtPort"
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_x=“113dp”
android:layout_y=“66dp”
android:ems=“10”
android:inputType=“textPersonName”
android:text=“8089”
tools:ignore=“HardcodedText,LabelFor,ObsoleteLayoutParam” />

android:id="@+id/mBt1"
android:layout_width=“wrap_content”
android:layout_height=“59dp”
android:layout_x=“155dp”
android:layout_y=“173dp”
android:text=""
tools:ignore=“HardcodedText,ObsoleteLayoutParam”
tools:layout_editor_absoluteX=“144dp”
tools:layout_editor_absoluteY=“163dp” />

android:id="@+id/mBt2"
android:layout_width=“wrap_content”
android:layout_height=“69dp”
android:text=“开”
tools:ignore=“HardcodedText” />

android:id="@+id/mBt3"
android:layout_width=“wrap_content”
android:layout_height=“72dp”
android:text=“关”
tools:ignore=“HardcodedText” />

最后别忘了在AndroidManifest.xml里添加权限


我是将这几个都添加进去了的
/

你可能感兴趣的:(ESP8266控制2051单片机的LED亮灭)