历史上的今天
返回首页

历史上的今天

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

正在发生

2021年07月27日 | 51单片机通过WIFI模块ESP8266控制四路继电器

2021-07-27 来源:eefocus

一、系统方案

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

二、硬件设计

ESP8266模块作为一个透传模块使用,RXD、TXD分别连接51单片机的TXD和RXD,VCC和EN管脚接3.3V电压,GND接地,只需要连接这些管脚,ESP8266模块就可以正常工作了。


单片机的P2^0,P2^1,P2^2,P2^3输出高低电瓶控制四路继电器,继电器模块是从网上购买的已经焊接好的模块,其他地方为手工万用板焊接。

三、单片机软件设计

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


1.串口和ESP8266初始化:


/**

*发送单个字符

*/

void sendChar(uchar a)

{

SBUF = a;

while(TI==0);

TI=0;

}

 

/**

*发送字符串

*/

void sendString(uchar *s)

{

while(*s!='')

{

sendChar(*s);

s++;

}

}

 

/**

*初始化ESP8266模块

*/

void initEsp()

{

TMOD=0x20; //定时器1工作在方式2

TH1 = 0xfd; //波特率9600

TL1 = 0xfd;

SM0=0; //串口工作在方式1

SM1=1;

EA = 1; //开总中断

REN = 1; //使能串口

TR1 = 1; //定时器1开始计时

delayms(200);

sendString("AT+CWMODE=2rn"); //AP模式

delayms(200);

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

delayms(200);

sendString("AT+CIPSERVER=1rn"); //建立TCP Server

delayms(200);

ES = 1; //开串口中断

}

sendString("AT+CWMODE=2rn") ----- 单片机发送AT指令到ESP8266模块,AT+CWMODE=2是将ESP8266设置为AP模式,rn是换行,因为AT指令加换行才能生效。

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

sendString("AT+CIPSERVER=1rn") ---- 建立TCP Server


2.串口中断函数,负责处理App发送给单片机的指令:


/**

* 串口中断函数,负责处理App发送给单片机的指令

*/

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': //打开继电器

JDQ4=0;

break;

case '2': //关闭继电器

JDQ4=1;

break;

case '3':

JDQ3=0;

break;

case '4':

JDQ3=1;

break;

case '5':

JDQ2=0;

break;

case '6':

JDQ2=1;

break;

case '7':

JDQ1=0;

break;

case '8':

JDQ1=1;

break;

}

}

  }

}

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


四、Android APP软件设计

Android APP是借助Android Studio来开发的,界面比较清新。esp8266默认的IP地址是192.168.4.1,端口号是333。四个开关控制四路继电器,其中长按开关的名字可以编辑开关名称,APP界面截图如下所示:

 负责连接ESP8266的按钮点击回调方法:


/**

 * 连接按钮点击事件回调方法

 * @param v

 */

@Override

public void onClick(View v) {

    if(v.getId()==R.id.btn_connect){

        if (mSocket == null || !mSocket.isConnected()) {

            new Thread(){

                @Override

                public void run() {

                    try {

                        mSocket = new Socket("192.168.4.1", 333);

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

                            }

                        });

                    }

                }

            }.start();

        }

        if (mSocket != null && mSocket.isConnected()) {

            try {

                mSocket.close();

                mBtnConnect.setText("连接");

                mSocket = null;

            } catch (IOException e) {

                e.printStackTrace();

                mSocket = null;

            }

        }

    }

}

滑动开关点击回调方法,发送指令到单片机控制继电器的开关:


/**

 * 滑动按钮监听事件,发送指令到单片机控制继电器开关

 * @param buttonView

 * @param isChecked

 */

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    switch (buttonView.getId()) {

        case R.id.switch1:

            if (isChecked) {

                //turn on

                Log.d(TAG, "onCheckedChanged: send1");

                sendData("1");

            } else {

                //turn off

                Log.d(TAG, "onCheckedChanged: send2");

                sendData("2");

            }

            break;

        case R.id.switch2:

            if (isChecked) {

                //turn on

                Log.d(TAG, "onCheckedChanged: send3");

                sendData("3");

            } else {

                //turn off

                Log.d(TAG, "onCheckedChanged: send4");

                sendData("4");

            }

            break;

        ....

....

....

           

    }

}


本文完!

推荐阅读

史海拾趣

EMLSI公司的发展小趣事

随着电子行业的快速发展,市场竞争也日益激烈。为了保持领先地位,EMLSI公司开始实施全球化战略。公司先后在亚洲、欧洲和北美等地建立了生产基地和研发中心,与当地企业建立了紧密的合作关系。这一战略不仅让EMLSI能够更快地了解市场需求和技术趋势,还为公司带来了更多的商业机会和合作伙伴。

AMRI Enterprise Co Ltd公司的发展小趣事

AMRI Enterprise Co Ltd注重与高校和研究机构的产学研合作,通过引进先进技术和人才,推动公司的技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展科研项目和技术攻关。这些合作不仅为AMRI带来了前沿的技术成果,还提升了公司的研发能力和创新能力。在产学研合作的推动下,AMRI不断推出具有创新性和竞争力的新产品,为公司的持续发展提供了强有力的支撑。

佰鸿(BrtLed)公司的发展小趣事

佰鸿公司在2008年成立之初,正值LED行业蓬勃发展的时期。面对激烈的市场竞争,公司经过深入的市场调研,确立了LED大功率路灯制造商、方案提供商、系统集成商的市场定位。随后,佰鸿在大功率路灯照明市政LED改造方面投入大量精力,成功完成了兰池大道、咸阳快速干道等多个大型LED路灯方案设计及老旧路灯改造项目。这些项目的成功实施,不仅为佰鸿在市场上站稳了脚跟,也为其后续发展奠定了坚实的基础。

达方(DARFON)公司的发展小趣事

面对日益严峻的环境问题,达方电子积极响应国家号召,将绿色发展理念融入公司战略。公司加大了对环保技术的研发力度,推出了多款绿色、节能的产品。同时,达方电子还积极参与公益事业,为社会做出了积极贡献。这一阶段的努力,不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

杰力(EMC)公司的发展小趣事

为了确保产品质量和客户满意度,杰力建立了一套完善的质量管理体系。公司从原材料采购、生产制造到产品检测等各个环节都实行严格的质量控制和管理。同时,杰力还引进了先进的检测设备和技术手段,对产品质量进行全面检测和评估。这些措施使得杰力的产品在质量上得到了有效保障,并赢得了客户的信赖和好评。

达晶微(CREATEK)公司的发展小趣事

达晶微(CREATEK)公司成立于XXXX年,由一群具有丰富半导体行业经验的专家创立。公司初期主要专注于IGBT、MOSFET、FRD、TVS、SBD等功率半导体芯片与器件的研发。凭借其对技术的深刻理解和市场需求的敏锐洞察,达晶微迅速在市场中崭露头角。

问答坊 | AI 解惑

请教关于TL431参教电压的问题,与理论值相差很大

我照这样的图接线,为什么我测出的VKA是3.6伏而不是2.5伏?…

查看全部问答>

Cyclone III FPGA 数据手册

This chapter describes the electric characteristics, switching characteristics, and I/O timing for Cyclone® III devices. A glossary is also included for your reference.…

查看全部问答>

FIFO的使用和功能仿真

程序如下,在工程中为顶层模块 `timescale 1ps / 1ps module test_fifo(         clk,         rst_n,                &nbs ...…

查看全部问答>

利用C51接收10位UART,使用51汇编集成开发系统仿真时为什么显示定时器1未启动?那怎么启动?谢谢,程序如下

           ORG 0000H MAIN:      MOV TMOD,#20H         ;设置波特率,定时器工作于方式2            MO ...…

查看全部问答>

在vs.net2003中用C#,mscomm32控件编写通信程序如何与SQL Server2000同步更新

在vs.net2003中用C#,mscomm32控件编写winform通信程序与下位机通信,其上使用datagrid控件并增加数据集,更改数据可保存到SQL Server2000数据库中. 我的问题是:我想把保存到数据库中的数据发到下位机中去,接收时也先保存到数据库再显示,请问应该怎么 ...…

查看全部问答>

USB插上后,设备管理器中显示unknow device

我的USB插上后,电脑提示无法识别的USB设备,是怎么回事啊?各位高手请指点一下。网上大概查了一下出现这种提示的原因:一是USB连接线供电不足,二是驱动软件的问题。我还没检验过。还会不会有其他的原因啦。…

查看全部问答>

IAR堆栈溢出的问题

                                 以前看到有人提过,感到好奇 …

查看全部问答>

2812 flash烧写问题,Flash API Error #31

2812烧写的问题,昨天还烧写正常,今天就出现以下的错误: Flash API Error #31: There was a Zero Bit Error on the Program Operation. First Fail Address = 0x003d7801 Expected Data = 0x64a4 Actual Data = 0x653e 但是flash可以擦除, ...…

查看全部问答>

STM32 107 CAN过滤器和掩码 设置函数

芯片资料没看到如何设置过滤器ID和掩码,结果弄了好久才搞清楚,原来固件库的接口还需要自己加工一下才行。 CP_VOID CanSetFilter(CAN_NUM_TypeDef byDevNo,CP_BYTE byFilterNumber,CP_DWORD dwId,CP_DWORD dwMask,CP_BYTE bIsStdId) {   & ...…

查看全部问答>

TI最新LDO产品LP5907概述

TI工程师为您介绍TI LP5900系列LDO的最新产品LP5907,它提供了市面上最好的纹波抑制比以及瞬态响应的功能.video platformvideo managementvideo solutionsvideo player复制代码…

查看全部问答>