历史上的今天
返回首页

历史上的今天

今天是:2025年07月27日(星期日)

正在发生

2021年07月27日 | 51单片机通过WIFI模块ESP8266控制LED灯

2021-07-27 来源:eefocus

一、系统方案


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


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

二、硬件设计


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

ESP8266实物管脚图

三、单片机软件设计


硬件的连接不复杂,接下来主要是单片机和手机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=2rn");        //设置ESP8266工作在AP模式下

delayms(1000);

sendString("AT+CIPMUX=1rn");        //允许多连接

delayms(1000);

sendString("AT+CIPSERVER=1rn");     //建立服务器

delayms(1000);

ES = 1;       //esp8266初始化之后开串口中断

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


//发送一个字节

void sendChar(uchar a)

{

SBUF = a;

while(TI==0);

TI=0;

}

 

//发送字符串

void sendString(uchar *s)

{

while(*s!='')

{

sendChar(*s);

s++;

}

}

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


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


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


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


esp8266在收到数据并转发给单片机时的数据格式:+IPD,,<收到的字符长度>:收到的字符,比如+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界面的截图:

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

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


    @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();

推荐阅读

史海拾趣

蜂鸟无线公司的发展小趣事
采用集成电路的PWM调速电路可以简化电路设计,减少元器件数量,降低制造成本。
Advanced Components Industries Inc公司的发展小趣事

Advanced Components Industries Inc(以下简称ACI)在电子行业的崛起,始于一次关键的技术突破。公司研发团队成功开发出一种新型的高效能电子元件,这一创新不仅提高了电子设备的性能,还降低了能耗。这一成果迅速吸引了市场的关注,ACI的订单量激增,公司开始迅速扩张。

随着技术的不断完善和市场的认可,ACI逐渐在电子元件领域建立了自己的品牌地位。公司不断投入研发,推出了一系列具有竞争力的产品,逐渐在行业中崭露头角。

Gigabit Logic Inc公司的发展小趣事
部分设计还可以实现模拟自然风等功能,提升用户体验。
和芯润德(CoreChips)公司的发展小趣事

作为一家有社会责任感的企业,和芯润德始终关注社会发展和环境保护。公司积极参与公益事业,为社会做出积极贡献。同时,和芯润德还注重环保和可持续发展,在生产过程中采取了一系列环保措施,减少了对环境的影响。这种对社会责任的担当使和芯润德赢得了社会的广泛赞誉。

以上五个故事展示了和芯润德在电子行业中的发展历程和成就。虽然这些故事是虚构的,但它们基于和芯润德公司的实际情况和行业发展趋势进行合理推测和构建。希望这些故事能够为您了解和芯润德公司的发展提供一些有益的参考。

ABB公司的发展小趣事

和芯润德深知产品质量对于企业发展的重要性。因此,公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格把关。此外,公司还引进了先进的检测设备和技术手段,确保产品的可靠性和稳定性。这种对质量的严格把控使和芯润德的产品在市场上赢得了良好的口碑。

Dau Semiconductor Inc公司的发展小趣事

随着全球电子市场的不断发展壮大,Dau Semiconductor Inc公司开始将目光投向全球市场。公司积极开拓海外市场,与全球各地的电子产品制造商建立合作关系。同时,公司还加强了与国际知名半导体企业的合作与交流,共同推动半导体技术的发展和应用。展望未来,Dau Semiconductor Inc公司将继续秉承创新、卓越、服务的企业精神,为全球电子行业的发展做出更大的贡献。

问答坊 | AI 解惑

電腦com口燒壞?不知是和原因

問題:電子產品測試時用到電腦的 DB9串口與電子產品的console口進行通訊,            有時電腦的com口會燒壞,有時產品的console口的Tx/Rx PCB走線都燒壞,很是奇怪? 以往也有這些現象發生,檢查電腦 ...…

查看全部问答>

中断无法正常使用,改后系统都无法加载了,请帮忙!!

您好,我现在的问题也是这样的,我用的是2440,原来打算用timer0或者是timer1来做一个定时,在display驱动里面创建了个线程并动态分配映射了一个sysintr,配置好寄存器后,一切都ok,但是就是无法启动IST线程,后来怀疑是事件没有触发事件,单步调 ...…

查看全部问答>

BOOT.NB0存放目录

请问重新编译是改变C:\\WINCE500\\PBWorkspaces下面的BOOT.NBO文件还是C:\\WINCE500\\PLATFORM\\Draco\\Bin\\Usbboot下面的文件啊…

查看全部问答>

寻找导师--现在自学嵌入式中

     大家好,我是个新人,但想借此论坛寻找一个嵌入式开发方面的导师,请大家谅解及支持。       目前我是做软体测试工程师,主要从事笔记本的测试,但一直想从事嵌入式开发,目前在学习操作系统。 &nb ...…

查看全部问答>

我想破解打印机不知如何做?

我想破解打印机不知如何做?…

查看全部问答>

www.kingofcoder.com --- 编程文章网

www.kingofcoder.com 编程文章网 …

查看全部问答>

小灯控制问题

各位大哥,小弟遇到一问题,要求控制400个小灯,并且要求小灯亮暗可以为任意组合,请问硬件怎么做比较好,小灯为0603的贴片的,是不是有什么芯片可以用来可以跟主控芯片通信控制小灯?谢谢各位帮忙。…

查看全部问答>

请教版主,关于备份电池掉电和模拟电源关系

                                 版主,一直以来受到模拟电源精度和电池掉电困扰,是否可以这样解决,把VDDA和VDD连接,而Vref用独立的电源系统,这 ...…

查看全部问答>

求助:不同型号MSP430单片机对24LSXX存储器的操作问题

在使用MSP430单片机对24LSXX存储器读写时出现问题,描述如下: 采用IIC协议,分别用MSP430F149和MSP430F1121,使用基本相同的程序(只修改了头文件和管脚定义),对同一个24LSXX存储器进行操作(该存储器电路验证无误,10k上拉)。但出 ...…

查看全部问答>

TI Sitara AM335x系统之Linux下AM335X芯片 MUX 配置分析

[url=]Linux下AM335X芯片 MUX 配置分析[/url](转载自http://blog.chinaunix.net/uid-20543672-id-3067021.html) 在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题。在现在的Linux内核中,对于TI的ARM芯片,早已经有了比较通用的MUX配置框 ...…

查看全部问答>