• 硬件配置

    主控芯片:STC12C5A32S2 1个
    晶振:11.0592MHz 1个;
    电容:30pf 2个
    电机控制:L298N 1个~2个
    wifi芯片:ESP8266 1个
    电动小车模型(4个轮子,4个电机,车架)
    电源:9V电池1个(驱动L298N),充电宝1个(2个USB取电口,驱动主控芯片和ESP8266)
    接口: ttl转USB接口线 2个(从USB端口取5V和3.3V电源用)
    导线若干

    上述硬件,某宝上可以一站式买齐;

  • 硬件连线简图

  • 软件

    • stc-isp-v6.88F 烧录STC程序
    • Keil uVision5 控制程序编写及编译
    • XCOM V2.6 串口助手,用于调试串口信息
    • Andriod Studio 编写安卓APP
  • 整体思路

#mermaid-svg-LJ0wd3IpfzykQQS9 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .label text{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .node rect,#mermaid-svg-LJ0wd3IpfzykQQS9 .node circle,#mermaid-svg-LJ0wd3IpfzykQQS9 .node ellipse,#mermaid-svg-LJ0wd3IpfzykQQS9 .node polygon,#mermaid-svg-LJ0wd3IpfzykQQS9 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-LJ0wd3IpfzykQQS9 .node .label{text-align:center;fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .node.clickable{cursor:pointer}#mermaid-svg-LJ0wd3IpfzykQQS9 .arrowheadPath{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-LJ0wd3IpfzykQQS9 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-LJ0wd3IpfzykQQS9 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-LJ0wd3IpfzykQQS9 .edgeLabel rect{opacity:0.9}#mermaid-svg-LJ0wd3IpfzykQQS9 .edgeLabel span{color:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-LJ0wd3IpfzykQQS9 .cluster text{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-LJ0wd3IpfzykQQS9 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-LJ0wd3IpfzykQQS9 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-LJ0wd3IpfzykQQS9 .actor-line{stroke:grey}#mermaid-svg-LJ0wd3IpfzykQQS9 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .sequenceNumber{fill:#fff}#mermaid-svg-LJ0wd3IpfzykQQS9 #sequencenumber{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .messageText{fill:#333;stroke:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-LJ0wd3IpfzykQQS9 .labelText,#mermaid-svg-LJ0wd3IpfzykQQS9 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-LJ0wd3IpfzykQQS9 .loopText,#mermaid-svg-LJ0wd3IpfzykQQS9 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-LJ0wd3IpfzykQQS9 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-LJ0wd3IpfzykQQS9 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-LJ0wd3IpfzykQQS9 .noteText,#mermaid-svg-LJ0wd3IpfzykQQS9 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-LJ0wd3IpfzykQQS9 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-LJ0wd3IpfzykQQS9 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-LJ0wd3IpfzykQQS9 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-LJ0wd3IpfzykQQS9 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .section{stroke:none;opacity:0.2}#mermaid-svg-LJ0wd3IpfzykQQS9 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-LJ0wd3IpfzykQQS9 .section2{fill:#fff400}#mermaid-svg-LJ0wd3IpfzykQQS9 .section1,#mermaid-svg-LJ0wd3IpfzykQQS9 .section3{fill:#fff;opacity:0.2}#mermaid-svg-LJ0wd3IpfzykQQS9 .sectionTitle0{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .sectionTitle1{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .sectionTitle2{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .sectionTitle3{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-LJ0wd3IpfzykQQS9 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .grid path{stroke-width:0}#mermaid-svg-LJ0wd3IpfzykQQS9 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-LJ0wd3IpfzykQQS9 .task{stroke-width:2}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskText:not([font-size]){font-size:11px}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-LJ0wd3IpfzykQQS9 .task.clickable{cursor:pointer}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskText0,#mermaid-svg-LJ0wd3IpfzykQQS9 .taskText1,#mermaid-svg-LJ0wd3IpfzykQQS9 .taskText2,#mermaid-svg-LJ0wd3IpfzykQQS9 .taskText3{fill:#fff}#mermaid-svg-LJ0wd3IpfzykQQS9 .task0,#mermaid-svg-LJ0wd3IpfzykQQS9 .task1,#mermaid-svg-LJ0wd3IpfzykQQS9 .task2,#mermaid-svg-LJ0wd3IpfzykQQS9 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutside0,#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutside2{fill:#000}#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutside1,#mermaid-svg-LJ0wd3IpfzykQQS9 .taskTextOutside3{fill:#000}#mermaid-svg-LJ0wd3IpfzykQQS9 .active0,#mermaid-svg-LJ0wd3IpfzykQQS9 .active1,#mermaid-svg-LJ0wd3IpfzykQQS9 .active2,#mermaid-svg-LJ0wd3IpfzykQQS9 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-LJ0wd3IpfzykQQS9 .activeText0,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeText1,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeText2,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeText3{fill:#000 !important}#mermaid-svg-LJ0wd3IpfzykQQS9 .done0,#mermaid-svg-LJ0wd3IpfzykQQS9 .done1,#mermaid-svg-LJ0wd3IpfzykQQS9 .done2,#mermaid-svg-LJ0wd3IpfzykQQS9 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-LJ0wd3IpfzykQQS9 .doneText0,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneText1,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneText2,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneText3{fill:#000 !important}#mermaid-svg-LJ0wd3IpfzykQQS9 .crit0,#mermaid-svg-LJ0wd3IpfzykQQS9 .crit1,#mermaid-svg-LJ0wd3IpfzykQQS9 .crit2,#mermaid-svg-LJ0wd3IpfzykQQS9 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCrit0,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCrit1,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCrit2,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCrit0,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCrit1,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCrit2,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-LJ0wd3IpfzykQQS9 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-LJ0wd3IpfzykQQS9 .milestoneText{font-style:italic}#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCritText0,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCritText1,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCritText2,#mermaid-svg-LJ0wd3IpfzykQQS9 .doneCritText3{fill:#000 !important}#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCritText0,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCritText1,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCritText2,#mermaid-svg-LJ0wd3IpfzykQQS9 .activeCritText3{fill:#000 !important}#mermaid-svg-LJ0wd3IpfzykQQS9 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-LJ0wd3IpfzykQQS9 g.classGroup text .title{font-weight:bolder}#mermaid-svg-LJ0wd3IpfzykQQS9 g.clickable{cursor:pointer}#mermaid-svg-LJ0wd3IpfzykQQS9 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-LJ0wd3IpfzykQQS9 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-LJ0wd3IpfzykQQS9 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-LJ0wd3IpfzykQQS9 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-LJ0wd3IpfzykQQS9 .dashed-line{stroke-dasharray:3}#mermaid-svg-LJ0wd3IpfzykQQS9 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 .commit-id,#mermaid-svg-LJ0wd3IpfzykQQS9 .commit-msg,#mermaid-svg-LJ0wd3IpfzykQQS9 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-LJ0wd3IpfzykQQS9 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-LJ0wd3IpfzykQQS9 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-LJ0wd3IpfzykQQS9 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-LJ0wd3IpfzykQQS9 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-LJ0wd3IpfzykQQS9 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-LJ0wd3IpfzykQQS9 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-LJ0wd3IpfzykQQS9 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-LJ0wd3IpfzykQQS9 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-LJ0wd3IpfzykQQS9 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-LJ0wd3IpfzykQQS9 .edgeLabel text{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-LJ0wd3IpfzykQQS9 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-LJ0wd3IpfzykQQS9 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-LJ0wd3IpfzykQQS9 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-LJ0wd3IpfzykQQS9 .note-edge{stroke-dasharray:5}#mermaid-svg-LJ0wd3IpfzykQQS9 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-LJ0wd3IpfzykQQS9 .error-icon{fill:#522}#mermaid-svg-LJ0wd3IpfzykQQS9 .error-text{fill:#522;stroke:#522}#mermaid-svg-LJ0wd3IpfzykQQS9 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-LJ0wd3IpfzykQQS9 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-LJ0wd3IpfzykQQS9 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-LJ0wd3IpfzykQQS9 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-LJ0wd3IpfzykQQS9 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-LJ0wd3IpfzykQQS9 .marker{fill:#333}#mermaid-svg-LJ0wd3IpfzykQQS9 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-LJ0wd3IpfzykQQS9 {color: rgba(0, 0, 0, 0.75);font: ;}

发送串口信号
发送串口信号
发送信号
手机andriod 客户端
ESP8266
STC
L298N驱动电机
  • 关键知识点

    • STC中断及串口通信 (可参考https://blog.csdn.net/qiaoermeng/article/details/89248450)
    • ESP8266 接线及AT指令(可参考https://blog.csdn.net/qq_32171385/article/details/109363279)
    • 电机控制逻辑 (正负极控制电机的正转或反转,可以后面根据实际情况调试确定)
    • andriod APP 串口通信 (可参考https://www.cnblogs.com/yangfengwu/p/11203546.html )
  • 关键代码

    • 主函数

#include <STC12C5A60S2.H>  //STC芯片库函数,可以在stc-isp-v6.88F里面找到,把它保存到Keil uVision5库函数目录下就可以引用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  //字符串库函数,用来解析字符串
#include <intrins.h> //延时函数中的_nop_() 要用
#include "motor.h"  // 电机控制逻辑,已经被保存为.H文件了unsigned char receiveData[100]; //定义一个数组,用来保存收到的数据
/************************
*函数名    :延时函数
*函数功能: 延时1000ms
*输入:无
*输出:无*************************/void Delay1000ms()        //@11.0592MHz
{unsigned char i, j, k;_nop_();_nop_();i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);
}/************************
*函数名    :延时函数
*函数功能: 延时100ms
*输入:无
*输出:无*************************/void Delay100ms()     //@11.0592MHz
{unsigned char i, j, k;_nop_();_nop_();i = 5;j = 52;k = 195;do{do{while (--k);} while (--j);} while (--i);
}/****************
*函数:Send_data()
*函数功能: 发送字符串
****************/
void send_byte(unsigned char b){SBUF=b;while(!TI);TI=0;
}/****************
*函数:Send_data()
*函数功能: 发送单个字符
****************/void Send_data(unsigned char *P){while(*P!='\0'){send_byte(*P);P++;}}/****************
*函数:ESPinit()
*函数功能: ESP8266初始化
****************/void ESPinit()
{// ESP8266的AT指令,可以自行百度各个指令的含义unsigned char Botelv[]="AT+CIOBAUD=9600";unsigned char Runserver[]="AT+CWSAP=\"ESPcar\",\"0123456789\",11,0";unsigned char IPconfig[]="AT+CIPSERVER=1,8080";unsigned char RunAp[]="AT+CWMODE=2";unsigned char Connect[]="AT+CIPMUX=1";Send_data(Botelv);send_byte('\r');//回车send_byte('\n');//换行Delay100ms(); //延时函数,给点时间让ESP8266反应过来;Send_data(RunAp);send_byte('\r');//回车send_byte('\n');//换行Delay100ms();Send_data(Runserver);send_byte('\r');//回车send_byte('\n');//换行Delay100ms();Send_data(Connect);send_byte('\r');//回车send_byte('\n');//换行Delay100ms();Send_data(IPconfig);send_byte('\r');//回车send_byte('\n');//换行Delay100ms();
}/****************
*函数:usartInit()
*函数功能: 串口初始化
****************/
void UsartInit()
{SCON=0x50;            //设置为工作方式1TMOD=0x20;           //设置计数器工作方式2PCON=0x80;         //波特率加倍TH1=0xFA;               //计数器初始值设置,注意波特率是9600的TL1=0xFA;ES=1;                       //打开接收中断EA=1;                      //打开总中断TR1=1;                  //打开计数器
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   P0=0;UsartInit();  //  串口初始化Delay1000ms();// 故意设置的延时,没有什么特殊含义,可以自行取消;Delay1000ms();ESPinit(); //ESP8266初始化Delay1000ms(); // 故意设置的延时,没有什么特殊含义,可以自行取消;// while循环判断手机发出的信号是哪个,以便执行对应的程序;while(1){if ((receiveData[9]=='1')&&(receiveData[10]=='1')&&(receiveData[11]=='1')){front(); //前进}else if((receiveData[9]=='0')&&(receiveData[10]=='0')&&(receiveData[11]=='1')){back(); //后退}else if((receiveData[9]=='1')&&(receiveData[10]=='1')&&(receiveData[11]=='0')){left();  //左转}else if((receiveData[9]=='0')&&(receiveData[10]=='1')&&(receiveData[11]=='1')){right();  //右转}else if((receiveData[9]=='0')&&(receiveData[10]=='0')&&(receiveData[11]=='0')){stop(); //停止}else {P0=0;}}}      /*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能        : 串口通信中断函数,分析收到的数据指定位是否为1,是则点灯
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Usart() interrupt 4
{static char i=0;  if (RI==1){   receiveData[i]=SBUF;   //将缓存中的数据赋值到数组保存起来RI = 0;      //清除接收中断标志位i++;if(receiveData[i-1]=='\n'){receiveData[i]='\0'; //字符串末尾的时候,数组序号清零i=0;}      }}
  • motor.h库函数

/************************
驱动电机,定义电机运动方向
*************************/
sbit motor_right_A=P0^1;
sbit motor_right_B=P0^2;
sbit motor_left_A=P0^3;
sbit motor_left_B=P0^4;void front(){motor_right_A=1;motor_right_B=0;motor_left_A=1;motor_left_B=0;}void back(){motor_right_A=0;motor_right_B=1;motor_left_A=0;motor_left_B=1;}void stop(){motor_right_A=0;motor_right_B=0;motor_left_A=0;motor_left_B=0;}void left(){motor_right_A=1;motor_right_B=0;motor_left_A=0;motor_left_B=0;}void right(){motor_right_A=0;motor_right_B=0;motor_left_A=1;motor_left_B=0;
}
  • andriod APP 布局及程序

    • 下载安装Andirod Studio
    • 新建工程文件
    • 在activity_main.xml里,进行元素布局
      这是我的布局效果图,大家可以根据自己的想法玩。
  • 在 MainActivity里,编辑控制逻辑
  • 编写控制逻辑代码
    • Andriod studio 已经提供了大体的框架,实际不用写很多行;
    • 代码是抄的,理解得不够透彻,应该还可以再精简一些;原版的在这里:https://www.cnblogs.com/yangfengwu/p/11203546.html 非常感谢原作者!
    • 记得要开启Andriod的网络权限,不然连不上网;
package com.example.carapp;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import java.io.OutputStream;
import java.net.Socket;public class MainActivity extends AppCompatActivity {Button connect_button,front_button,stop_button,back_button,right_button,left_button;TextView connect_textview;Socket socket; //定义一个socket,用于连接网络MyHandler myHandeler;  //定义一个消息处理机制handlerprivate OutputStream outputStream;  //定义输出数据流byte[] Tcpcomander=new byte[1024];  //定义发送命令的数组int Tcpcomanderlen=0; //定义发送的数据长度@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myHandeler= new MyHandler();connect_button = findViewById(R.id.connect_button);front_button = findViewById(R.id.front_button);stop_button = findViewById(R.id.stop_button);back_button = findViewById(R.id.back_button);right_button = findViewById(R.id.right_button);left_button= findViewById(R.id.left_button);connect_textview= findViewById(R.id.connect_textView);//连接按钮connect_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (connect_button.getText().toString().equals("连接我的小车")){new Thread(new Runnable() {@Overridepublic void run() {try{socket=new Socket("192.168.4.1",8080); //IP地址是ESP8266默认的,端口可以通过AT命令设置if(socket.isConnected()){Log.e("MainActivity","is connected");Message msg= myHandeler.obtainMessage();msg.what=1;myHandeler.sendMessage(msg);connect_textview.setText("连接成功");connect_button.setText("断开连接");outputStream=socket.getOutputStream();}else {connect_textview.setText("连接已断开");connect_button.setText("连接我的小车");}}catch (Exception e){Log.d("mainactivity","连接失败");connect_textview.setText("连接失败");}}}).start();}else {try {socket.close();connect_button.setText("连接我的小车");connect_textview.setText("已断开");}catch (Exception e){}}}});//前进按钮front_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String sts="111";try{byte[] front =sts.getBytes("utf-8");Tcpcomander= front;Tcpcomanderlen= Tcpcomander.length;if(socket!=null&&socket.isConnected()){new Thread(new Runnable() {@Overridepublic void run() {try{outputStream.write(Tcpcomander,0,Tcpcomanderlen);connect_textview.setText("ok");}catch (Exception e){}}}).start();}}catch (Exception e){}}});//后退按钮back_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String sts="001";try{byte[] back=sts.getBytes("utf-8");Tcpcomander=back;Tcpcomanderlen=Tcpcomander.length;if(socket!=null&&socket.isConnected()){new Thread(new Runnable() {@Overridepublic void run() {try{outputStream.write(Tcpcomander,0,Tcpcomanderlen);}catch (Exception e){}}}).start();}}catch (Exception e){}}});//左转按钮left_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String sts="110";try{byte[] left=sts.getBytes("utf-8");Tcpcomander=left;Tcpcomanderlen=Tcpcomander.length;if(socket!=null&&socket.isConnected()){new Thread(new Runnable() {@Overridepublic void run() {try{outputStream.write(Tcpcomander,0,Tcpcomanderlen);}catch (Exception e){}}}).start();}}catch (Exception e){}}});//右转按钮right_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String sts="011";try{byte[] right=sts.getBytes("utf-8");Tcpcomander=right;Tcpcomanderlen=Tcpcomander.length;if(socket!=null&&socket.isConnected()){new Thread(new Runnable() {@Overridepublic void run() {try{outputStream.write(Tcpcomander,0,Tcpcomanderlen);}catch (Exception e){}}}).start();}}catch (Exception e){}}});//停止按钮stop_button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String sts="000";try{byte[] stop=sts.getBytes("utf-8");Tcpcomander=stop;Tcpcomanderlen=Tcpcomander.length;if(socket!=null&&socket.isConnected()){new Thread(new Runnable() {@Overridepublic void run() {try{outputStream.write(Tcpcomander,0,Tcpcomanderlen);}catch (Exception e){}}}).start();}}catch (Exception e){}}});}//定义handler(异步消息处理机制)class MyHandler extends Handler{@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);}}
}

STC+Andriod+ESP8266制作手机遥控小车相关推荐

  1. 基于ESP8266和51单片机的手机遥控小车

    小车效果 APP效果 设计材料 ESP8266-01s模块. 51单片机最小系统板. L293D芯片一个. Android系统手机. 面包板一块. 充电宝一个,当做电源. 杜邦线若干. 设计思路 说明 ...

  2. android控制手机强制手机横竖方向,使用android IOIO和安卓手机制作视频遥控小车(控制灯的开关、实时视频传输、方向控制)...

    android IOIO是通过安卓手机的USB接口控制的电路板,通过android IOIO可以不需要太多的硬件知识,通过安卓手机转接的IOIO板控制外围设备,配件有纸盒.L298N电机驱动模块.旧手 ...

  3. 基于MQTT百度天工服务器,实现微信小程序控制ESP8266,完成遥控小车的简单控制

    目录 前言 一.准备工具 二.百度天工物联网平台的搭建 三.Arduino IDE 环境的搭建和代码 四.微信小程序的搭建和代码 前言 基于MQTT协议借助百度天工物联网平台,通过Arduino ID ...

  4. 1.基于51单片机的蓝牙手机遥控小车

    第一节  基于51单片机控制的蓝牙遥控小车 51控制的蓝牙遥控小车是楼主大一刚开始接触单片机时DIY的项目,时间大概是2016年的6月,现在已经是19年的5月底,借毕业前有闲时间写一下之前自己做过得种 ...

  5. [树莓派] 轻松制作一个遥控小车(C++,Socket)

    最近闲来无事,便开始倒腾一些小玩具.我想从比较简单的开始入手,就先是树莓派遥控小汽车吧! 本文用来分享和总结经验.从0开始,小白级教程. 一.必备材料: 1.树莓派 1 个(什么版本都可以) 2.智能 ...

  6. python遥控汽车玩具_ESP32MicroPython 手机遥控小车

    MicroPython是Python的精简版,但保留了python的基本特色.是学习python的工具之一. 烧录软件用的是uPyCraft. 本案例用了ESP32 和 L298N电机驱动.以及两个直 ...

  7. 基于HAL库-蓝牙遥控小车

    stm32+HAL库制作蓝牙遥控小车 材料及其接线 蓝牙模块:HC05/6 材料均可在某宝上进行购买. 注意:蓝牙模块可进行串口调试也可不调试(及为默认设置),本文使用的为未调试状态下的蓝牙串口,有关 ...

  8. Android蓝牙遥控小车软件

    PS:不需写一行Android代码哦~~~                    很多热衷于玩单片机小车.机器人的童靴,往往也向往着有天能自己编写一个Android手机的遥控程序,通过自己的手机遥控小 ...

  9. 基于STM32设计的遥控小车(手机APP+GPS+温湿度+ESP8266)

    一.环境介绍 小车主控MCU: STM32F103ZET6 STM32程序开发IDE: keil5 STM32程序风格:  采用寄存器方式开发,注释齐全,执行效率高,方便移植 手机APP:  采用QT ...

最新文章

  1. 在CentOS 6.9 x86_64上开启nginx 1.12.2的stub_status模块(ngx_http_stub_status_module)监控
  2. mysql with语句_MySQL列举数据库(SHOW DATABASES语句)
  3. 详解python2 和 python3的区别
  4. 解决 TortoiseGit 诡异的 Bad file number 问题(转)
  5. NeurIPS 2021有哪些值得读的NLP论文?
  6. java读取excel数据_Java读取Excel内容(转)
  7. 使用 Chrome 开发者工具的 lighthouse 功能分析 web 应用的性能问题
  8. php正则表达式函数案例,PHP正则表达式函数preg_replace用法实例分析
  9. java的基础语法和数据类型,IDEA
  10. 基于jenkins的go语言项目自动化发布遇到的坑
  11. struct sk_buff与struct socket及struct sock 结构体分析
  12. JAVA中运行看不见窗口_eclipse中已经把窗口设置为可视,为什么运行 时还是看不到窗口?...
  13. Python 项目实践三(Web应用程序)第一篇
  14. Redhat 7搭建iscsi存储系统
  15. 程序员使用 Top 5 的 Python 代码编辑器,你在使用哪一款?
  16. mcgs组态软件中字体如果从左到右变化_MCGS脚本程序 -
  17. P3110 [USACO14DEC]驮运Piggy Back-最短路,spfa
  18. vue echarts柱状统计图,多组数据对比
  19. UESTC ACM训练题二
  20. 如何开发HTML编辑器

热门文章

  1. 计算机主板上的bios与cmos的关系是,bios cmos 关系是什么?有什么区别?
  2. QT获取当前目录的上一级目录dir->cdUp()
  3. C语言之结构体、结构体数组
  4. 华为鸿蒙有可能成功吗 (by quqi99)
  5. 中国科学院院士徐宗本:人工智能的基石是数学
  6. 使用Springboot实现Nginx均衡负载功能
  7. 用超级计算机打游戏是什么样的体验,用超级计算机来玩游戏 GTX Titan显卡评测...
  8. 超级玛丽3号MAX 达尔文3号,谁才是真正的重疾险王炸?
  9. RNN 、LSTM、 GRU、Bi-LSTM 等常见循环网络结构以及其Pytorch实现
  10. Mybatis配置文件http://mybatis.org/dtd/mybatis-3-config.dtd报错