本次向通过Android远程控制直流电机正反转,在这之前可以看一下我写的“STC单片机简单控制直流电机正反转”有助刚学的同学理解。
可以看一下我的硬件连接电路,如图:
单片机硬件程序:
#include
#include
#include
sbit EN = P1^0; // 电机输入输出1,2
sbit IN1 = P1^1; // 输入1
sbit IN2 = P1^2; // 输入2
char Recive_table[20]=""; //接收缓冲,最大20个字节
char Recive_state = 0; //接收完成标志
void WIFI_Init(void);
void Uart_Init(void);
void ms_delay(int t);
void LED(void);
int main (void)
{
/********************功能初始化***********************/
Uart_Init();//串口初始化,波特率为9600
ms_delay(1000) ;
WIFI_Init(); //wifi初始化
/****************************************************/
/**********************主循环************************/
while(1)
{
ms_delay(10) ;
if(Recive_state == 1)
{
ES=0; //清空接收标志位
if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//接收到的字符串形式为+IPD,x,x:y
{
if((Recive_table[3]=='D')&&(Recive_table[6]==','))
{
if(Recive_table[9]=='0')
{
IN1=1;
IN2=0;
}
if(Recive_table[9]=='1')
{
IN1=0;
IN2=1;
}
}
}
memset(Recive_table,'\0',20);
Recive_state = 0;
ES=1; //打开接收标志位
}
}
/****************************************************/
}
/******************************************************************
函 数: void Uart_Interrupt() interrupt 4
功 能: 串口中断函数,将收到的字符存到Recive_table[]数组中
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Interrupt() interrupt 4
{
static char i=0; //因为是一位一位接收,所以用static
if(RI==1)
{
ES = 0;
RI=0;
Recive_table[i]=SBUF;
i++;
if((Recive_table[i-1] == '\n'))
{
Recive_table[i]='\0';
i=0;
Recive_state = 1;
}
ES = 1;
}
else
TI = 0;
}
/******************************************************************
函 数: void Uart_Init(void)
功 能: 串口初始化,波特率为9600(这个不会,上网百度)
参 数: 无
返回值: 无
*******************************************************************/
void Uart_Init(void)
{
TMOD=0x20;
TH1=0xfD;
TL1=0xfD;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
/******************************************************************
函 数: void ms_delay(int t)
功 能: 毫秒级延时
参 数: 无
返回值: 无
*******************************************************************/
void ms_delay(int t)
{
int i,j;
for(i=t;i>0;i--)
for(j=110;j>0;j--);
}
/******************************************************************
函 数: void LED(void)
功 能: 发送完命令后显示用的函数
参 数: 无
返回值: 无
*******************************************************************/
void LED(void)
{
P2 = 0;
ms_delay(100);
P2 = 0xff;
ms_delay(100);
}
/******************************************************************
函 数: void WIFI_Init(void)
功 能: wifi初始化(名字:esp8266;密码:1234567890)
参 数: 无
返回值: 无
*******************************************************************/
void WIFI_Init(void)
{
ES = 0;
TI = 1;
printf("AT+RST\r\n");
LED();
ms_delay(1000) ;
printf("AT+CWMODE=3\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIPMUX=1\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIPSERVER=1,8080\r\n");
LED();
ms_delay(1000) ;
printf("AT+CIOBAUD=9600\r\n"); // 设置与单片机一致的波特率
LED();
ms_delay(1000) ;
while(!TI);
TI = 0;
ES = 1;
}
Android程序:
package com.open_open_wifi_motor.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText mIp; // IP
private EditText mPort; // 端口号
private String mStrIp; // 字符串类型ip
private int miPort; // 字符类型端口
private Button mBtnConnect; // 连接
private Button mMotorZ; // 按钮LED灯开
private Button mMoyorF; // 按钮LED灯关
private Socket mSocket; // 套接字
private PrintStream out; // 打印输出流
private ConnectThread mConnectThread; // TCP连接线程
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnConnect=(Button)findViewById(R.id.mBt1);
mMotorZ=(Button)findViewById(R.id.mBt2);
mMoyorF=(Button)findViewById(R.id.mBt3);
mIp=(EditText)findViewById(R.id.mEtIP);
mPort=(EditText)findViewById(R.id.mEtPort);
mBtnConnect.setOnClickListener(this);
mMotorZ.setOnClickListener(this);
mMoyorF.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.mBt1:
// 连接
if(mSocket == null || !mSocket.isConnected()){
mStrIp=mIp.getText().toString();
miPort=Integer.valueOf(mPort.getText().toString());
mConnectThread = new ConnectThread(mStrIp,miPort);
mConnectThread.start();
}
if(mSocket != null && mSocket.isConnected()){
try{
mSocket.close();
mSocket=null; // 清空mSocket
mBtnConnect.setText("连接");
Toast.makeText(MainActivity.this,"连接已关闭",Toast.LENGTH_LONG).show();
}catch (IOException e){
e.printStackTrace();
}
}
break;
case R.id.mBt2:
if(out!=null){
out.print("0");
out.flush();
}
break;
case R.id.mBt3:
if (out!=null){
out.print("1");
out.flush();
}
break;
}
}
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("断开");
Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_LONG).show();
}
});
}catch (IOException e){
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"连接失败",Toast.LENGTH_LONG).show();
}
});
}
}
}
}
所有代码大家可以下载参考,效果如图:
坚持每天学习一点点,收获就多一点!!!!