一、硬件设计
1.硬件选型
主控芯片:选用STC15W104。这款MCU比较小巧,控制3个LED灯的亮灭只需要3个IO即可,不足之处是没有串口,与ESP8266通信只能使用模拟串口,买了挺多的,先将就用着先吧。
LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117-3.3V将常用的5V转成3.3V。
2.原理图设计
原理图比较简单,注意ESP8266模块的TX和RX引脚需要连接到STC15W104的P3.0和P3.1引脚上以及EN引脚连接到3.3V即可。原理图如下:
3.PCB设计
PCB设计的话,我设计成板上焊接一个8P的母座,然后将ESP8266模块插上去就可以正常使用。PCB图和效果如下:
二|、软件设计
1. 51单片机程序设计
1.1 单片机要和ESP8266正常通信,需要设置通信波特率相同。如:51单片机使用的波特率为9600,ESP8266也需要设置为9600,否则无法正常通信,而ESP8266模块默认波特率为115200。修改ESP8266波特率的方法:ESP8266和USB-TTL连接好线后,使用串口助手发送AT+UART=9600,8,1,0,0指令即可。
ESP8266 | USB-TTL |
3V3 | 3V3 |
EN | 3V3 |
RX | TX |
TX | RX |
GND | GND |
1.2 模拟串口这部分程序参考官方文档,程序中为收到字符A,开启LED2,收到字符B,关闭LED2,要控制多个LED灯的亮灭,根据收到的不同指令来区分即可。部分程序如下:
//发送一个字节
void sendChar(uchar a)
{
if(!TING) //发送空闲
{
TBUF = a;
TING = 1;
}
Delay10ms();
}
//发送字符串
void sendString(uchar *s)
{
while(*s!='\0')
{
sendChar(*s);
s++;
}
}
void esp8266_init()
{
Delay3000ms();
sendString("AT+CIPMUX=1\r\n"); //允许多连接
Delay3000ms();
sendString("AT+CIPSERVER=1,8080\r\n"); //建立服务器
Delay3000ms();
}
//-----------------------------------------
//UART模块的初始变量 initial UART module variable
void UART_INIT()
{
TING = 0;
RING = 0;
REND = 0;
TCNT = 0;
RCNT = 0;
}
void main()
{
InternalRAM_enable();
Timer0_1T();
Timer0_AsTimer();
Timer0_16bitAutoReload();
Timer0_Load(Timer0_Reload);
Timer0_InterruptEnable();
Timer0_Run();
EA = 1; //打开总中断 open global interrupt switch
UART_INIT(); //UART模块的初始变量
esp8266_init();
LED3 = 1;
while (1)
{
if (REND) //如果接收完,把接收到的值存入接收buff
{
REND = 0;
temp = RBUF; //取出接收到的数据
if(temp=='A'){
LED2 = 0;
}
if (temp == 'B') {
LED2 = 1;
}
}
}
}
2. Android APP程序设计
Android APP我是使用Android Studio来编写的,首先设计好界面,页面布局如下:
代码部分的话,需要注意的地方是连接esp8266需要有网络权限,在AndroidManifest.xml文件中添加
MainActivity代码如下:
package com.lili.esp8266;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
public ImageView ledImageView;
public Button connectButton; // 连接esp8266
public Button openOrCloseLEDButton; // 打开或者关闭LED按钮
private ConnectThread connectThread;
public boolean isConnected;
public boolean isOpenLED;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
connectThread = new ConnectThread(this, "192.168.4.1", 8080);
// 开启连接线程
connectThread.start();
}
private void initView() {
// LED灯图标
ledImageView = (ImageView) findViewById(R.id.image);
connectButton = findViewById(R.id.button_connect);
openOrCloseLEDButton = findViewById(R.id.openOrCloseLED);
}
// 连接esp8266
public void connect(View view)
{
// 如果没有连接
if (!isConnected)
{
connectThread.startConnect = true;
} else {
try {
connectThread.closeConnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 打开或者关闭LED
public void openOrCloseLED(View view)
{
// 如果已经连接到esp8266
if (isConnected)
{
// 如果已经打开LED
if (isOpenLED)
{
// 关闭LED
connectThread.closeLED();
} else {
// 开启LED
connectThread.openLED();
}
} else {
Toast.makeText(this, "未连接到服务器!", Toast.LENGTH_SHORT).show();
}
}
}
最后,有需要的小伙伴们可以使用“单片机项目设计”小程序获取下载链接。