一、硬件设计
1. 硬件选型
主控芯片:选用STC89C52RC,单片机通过串口与EPS866模块通信。
LDO: 选用AMS1117-3.3V,ESP8266模块需要使用3.3V电源,使用1117-3.3V将常用的5V转成3.3V。
WIFI模块:使用ESP8266-01模块,为了可以正常和51单片机通信,使用串口助手将ESP8266的波特率改为9600。
2. 原理图设计
3. PCB设计
4. 实物
二、软件设计
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 部分程序如下:
// 初始化定时器0
void Timer0Init()
{
TMOD |= 0x01;
TH0 = (65536-50) / 256; //
TL0 = (65536-50) % 256;
TR0 = 1; // 启动定时器
ET0 = 1; // 打开定时器中断
EA = 1; // 打开总中断
}
void delayms(uint xms) //延时
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
uchar i,j,temp;
bit flag;
uchar receive[4];
void int_init(){ //开启定时器1,产生9600波特率
TMOD = 0x20; //定时器1工作在方式2八位自动重装模式
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1; //开启定时器1
PCON = 0x00; //波特率不加倍
SM0 = 0; //串口工作方式
SM1 = 1;
REN = 1; //串口接收允许
}
void send_char(uchar a)
{
SBUF = a;
while (TI == 0);
TI = 0;
}
void send_string(uchar * s)
{
while (*s != '\0')
{
send_char(*s);
s++;
}
}
void init_esp8266()
{
send_string("AT+CIPMUX=1\r\n");
delayms(3000);
send_string("AT+CIPSERVER=1,8080\r\n");
delayms(3000);
}
2. Android APP程序设计
Android APP我是使用Android Studio来编写的,首先设计好界面,页面布局如下:
需要连接esp8266需要有网络权限,在AndroidManifest.xml文件中添加
<uses-permission android:name="android.permission.INTERNET" />
MainActivity代码如下:
package com.lili.controlled;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
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 implements MoveListener {
public ImageView ledImageView;
public Button connectButton; // 连接esp8266
public Button openOrCloseLEDButton; // 打开或者关闭LED按钮
private IosColumnBrightnessView mIosColumnBrightnessView;
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);
// 调节亮度view
mIosColumnBrightnessView = findViewById(R.id.ios_brightness);
mIosColumnBrightnessView.setMoveListener(this);
}
// 连接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();
}
}
@Override
public void move_light(int value) {
// 如果已经连接到esp8266
if (isConnected)
{
// 发送数据
}
}
}
三、资料
1. 原理图和PCB图 https://url83.ctfile.com/f/45573183-864690180-b2cb50?p=7526 (访问密码: 7526)
2. 单片机源码 https://url83.ctfile.com/f/45573183-864690177-0cac34?p=7526 (访问密码: 7526)
3. Android APP源码 https://url83.ctfile.com/f/45573183-864690174-e2fcb9?p=7526 (访问密码: 7526)
4. 实物 https://item.taobao.com/item.htm?ft=t&id=680383434690