51单片机通过WIFI模块ESP8266控制LED灯

51单片机通过WIFI模块ESP8266控制LED灯一 系统方案手机 APP 通过 ESP8266WIFI 模块与 51 单片机通信控制 LED 灯的开关 下位机由单片机 ESP8266 模块和 LED 灯组成 上位机由 Android 手机 APP 承担 我们在 APP 上发送 LED 灯的开关控制指令 ESP8266 将收到的数据发送给单片机 从而实现对 LED 灯进行开关控制 设计好的实物是这个样子 二 硬件设计 ESP8266 模块作为一个透传模块使用 RXD

完整源码下载地址:https://download.csdn.net/download/tongxin082/

一、系统方案

手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而实现对LED灯进行开关控制。

51单片机通过WIFI模块ESP8266控制LED灯

设计好的实物是这个样子:

51单片机通过WIFI模块ESP8266控制LED灯

二、硬件设计

ESP8266模块作为一个透传模块使用,RXD、TXD分别连接51单片机的TXD和RXD,VCC和CH_PD管脚接3.3V电压,GND接地,只需要连接这些管脚,ESP8266模块就可以正常工作了。在单片机P2口上连接了三个5mm的LED灯,分别是红黄蓝三种颜色,我们的目的是通过手机APP上的开关控制着三个LED灯的亮灭。

51单片机通过WIFI模块ESP8266控制LED灯

ESP8266实物管脚图

51单片机通过WIFI模块ESP8266控制LED灯

三、单片机软件设计

硬件的连接不复杂,接下来主要是单片机和手机APP代码的编写。

单片机代码主要是串口初始化、串口中断和ESP8266的初始化。首先是串口初始化:

 TMOD=0x20; //定时器1工作在方式2 TH1 = 0xfd; //波特率9600 TL1 = 0xfd; SM0=0;                  //串口工作在方式1 SM1=1; EA = 1; //开总中断 REN = 1; //使能串口 TR1 = 1; //定时器1开始计时

然后是ESP8266初始化:

 delayms(1000);                        //延时 sendString("AT+CWMODE=2\r\n");        //设置ESP8266工作在AP模式下 delayms(1000); sendString("AT+CIPMUX=1\r\n");        //允许多连接 delayms(1000); sendString("AT+CIPSERVER=1\r\n");     //建立服务器 delayms(1000); ES = 1;       //esp8266初始化之后开串口中断

贴上51单片机负责串口发送的两个函数:

//发送一个字节 void sendChar(uchar a) { SBUF = a; while(TI==0); TI=0; } //发送字符串 void sendString(uchar *s) { while(*s!='\0') { sendChar(*s); s++; } }

在串口中断中处理接收到的数据:

1:打开红色灯    2:关闭红色灯

3:打开黄色灯    4:关闭黄色灯

5:打开蓝色灯    6:关闭蓝色灯

esp8266在收到数据并转发给单片机时的数据格式:+IPD,<client号>,<收到的字符长度>:收到的字符,比如+IPD,0,5:hello,其中+PID是固定的;0代表的是TCP客户端编号,esp8266最多支持5个客户端同时连接,也就是说客户端编号是0到4,在本设计中由于只有一个客户端与esp8266相连,所以客户端编号是0;5代表收到的字符长度;hello是收到的字符。在本例中esp8266发送给单片机的数据是+IPD,0,1:1,我们把接收到的字符串缓存到字符数组中,所以在处理收到的数据逻辑中,首先判断是否是以’+’开始的,否则视作无效数据,然后判断数组中的第十个数据,因为第十个数据才是上位机发送过来的数据。

void uart() interrupt 4 {     if(RI == 1)   {     RI = 0; //清除串口接收标志位 receiveTable[i]=SBUF; if(receiveTable[0]=='+') { i++; } else { i=0; } if(i==10) { i=0; switch(receiveTable[9]) { case '1': RedLED=0; break; case '2': RedLED=1; break; case '3': YellowLED=0; break; case '4': YellowLED=1; break; case '5': BlueLED=0; break; case '6': BlueLED=1; break; } } } }

四、Android APP软件设计

Android APP是借助Android Studio来开发的,界面比较简单,通过编辑框输入esp8266的IP地址和端口号,esp8266默认的IP地址是192.168.4.1,端口号是333,这些都可以通过AT指令进行修改。布局页面的xml代码我们就不贴了,熟悉Android开发的读者很快就能根据截图编写出来,放上一个APP界面的截图:

51单片机通过WIFI模块ESP8266控制LED灯

我们主要看一下逻辑代码部分:

首先是控件的初始化和按钮点击事件回调的绑定

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnConnect = (Button) findViewById(R.id.btn_connect); mEtIP = (EditText) findViewById(R.id.et_ip); mEtPort = (EditText) findViewById(R.id.et_port); mBtnRedOn = (Button) findViewById(R.id.btn_red_on); mBtnRedOff = (Button) findViewById(R.id.btn_red_off); mBtnYellowOn = (Button) findViewById(R.id.btn_yellow_on); mBtnYellowOff = (Button) findViewById(R.id.btn_yellow_off); mBtnBlueOn = (Button) findViewById(R.id.btn_blue_on); mBtnBlueOff = (Button) findViewById(R.id.btn_blue_off); mBtnConnect.setOnClickListener(this); mBtnRedOn.setOnClickListener(this); mBtnRedOff.setOnClickListener(this); mBtnYellowOn.setOnClickListener(this); mBtnYellowOff.setOnClickListener(this); mBtnBlueOn.setOnClickListener(this); mBtnBlueOff.setOnClickListener(this); }

按钮的点击回调方法:

 public void onClick(View v) { switch (v.getId()) { case R.id.btn_connect: //连接 if (mSocket == null || !mSocket.isConnected()) { String ip = mEtIP.getText().toString(); int port = Integer.valueOf(mEtPort.getText().toString()); mConnectThread = new ConnectThread(ip, port); mConnectThread.start(); } if (mSocket != null && mSocket.isConnected()) { try { mSocket.close(); mBtnConnect.setText("连接"); } catch (IOException e) { e.printStackTrace(); } } break; case R.id.btn_red_on:         //开红灯 if (out != null) { out.print("1"); out.flush(); } break; case R.id.btn_red_off:        //关红灯 if (out != null) { out.print("2"); out.flush(); } break; case R.id.btn_yellow_on: if (out != null) { out.print("3"); out.flush(); } break; case R.id.btn_yellow_off: if (out != null) { out.print("4"); out.flush(); } break; case R.id.btn_blue_on: if (out != null) { out.print("5"); out.flush(); } break; case R.id.btn_blue_off: if (out != null) { out.print("6"); out.flush(); } break; } }
 

负责连接esp8266的线程:

private 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("断开"); } }); new HeartBeatThread().start(); } catch (IOException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show(); } }); } } }

完整源码下载地址:https://download.csdn.net/download/tongxin082/

本文完!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233534.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea2022.01.13激活码获取-激活码分享2022.03.10

    (idea2022.01.13激活码获取)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsa…

    2022年4月2日
    151
  • stress模拟CPU使用100%

    stress模拟CPU使用100%(1)安装stress解压:tar-xzvfstress-1.0.4.tar.gz./configuremakemakeinstall默认安装在/usr/local/bin目录下:(2)使用stress模拟CPU使用100%先使用top看下CPU使用情况,基本空闲。使用stress模拟CPU使用100%:stress-c8-t100再次使用top查看CPU使用情况,可以看到us使用100%了。vmstat查看运行前

    2025年6月10日
    4
  • datax(12):调度源码解读AbstractScheduler「建议收藏」

    datax(12):调度源码解读AbstractScheduler「建议收藏」datax的jobContainer最终会通过调度周期性的执行,今天把它看完;一、基类AbstractScheduler概述类继承关系全部方法二、AbstractScheduler的主要属性和方法1、主要属性/***脏数据行数检查器,用于运行中随时检查脏数据是否超过限制(脏数据行数,或脏数据百分比)*/privateErrorRecordCheckererrorLimit;/***积累容器通讯器,来处理JobContainer、Tas.

    2022年5月17日
    50
  • pycharm激活成功教程失败后重装也打不开_pycharm2019.3激活码

    pycharm激活成功教程失败后重装也打不开_pycharm2019.3激活码1.先声明一下,这种解决方法适用于任何版本的永久激活成功教程启动不了的情况(包括:2019版本的)2.下面直接切入正题之所以我们激活成功教程之后,不能正常启动的原因有两种:①之前pycharm可以正常的使用,突然有一天,就启动不了了,这种一般是系统的环境变量出了问题;②在第二次安装别的版本时,残留了之前的环境配置历史3.不管是以上哪种情况,同一的解决方法是:进入C盘目录,找到用户文件,可以找到下面…

    2022年8月26日
    10
  • Android widget之CompoundButton[通俗易懂]

    Android widget之CompoundButton[通俗易懂]ButtonCheckBoxRadioButtonSwitchSwitchCompatToggleButtonAppCompatCheckBoxAppCompatRadioButton

    2022年6月7日
    39
  • XLSTransformer生成excel文件简单演示样例「建议收藏」

    XLSTransformer生成excel文件简单演示样例「建议收藏」项目结构图:项目中所用到的jar,能够到http://www.findjar.com/index.x下载ExcelUtil类源代码:packageutil;importjava.io.IOExce

    2022年7月3日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号