基于51单片机的蓝牙小车制作历程【新手向
前言
在自己摸索了一段时间的单片机之后,要开始做很基础的新手玩意了,说是蓝牙小车就像“点亮你的第一个LED灯”一样基础,然而还是遇到了很多问题。。。
一开始还觉得蓝牙太low了,想直接玩WiFi模块,然而遇到了不可描述的阻力,可能我后期解决了会再发博客吧【挠头
探索阶段的程序
就是去网上也找了很多制作小车相关的东西,最初的测试用的控制代码如下:
#include <reg52.h>
//输入指令的端口 //按钮1,2,3依次从左到右排列【正极一起接在VCC上
sbit con1 = P2^0;
sbit con2 = P2^1;
sbit con3 = P2^2;
//控制轮子的输出端口 //端口1,2控制左轮;3,4控制右轮
sbit mot1 = P1^0;
sbit mot2 = P1^1;
sbit mot3 = P1^2;
sbit mot4 = P1^3;
#define Moto P1
typedef unsigned char uc;
typedef unsigned int ui;
void main()
{
P2 = 0x00;//判断之前先关闭输出【保证不按按钮时小车不跑
while (1)
{
Moto = 0;//每次判断之前先初始化轮子的输出口
//对按钮的判断和对轮子的控制
if (con1==1&&con3==1) //按住两边的按钮前进
{
mot1 = 1;
mot3 = 1;
}
else if (con1==1) //按左边的按钮左转
{
mot3 = 1;
}
else if (con3==1) //按右边的按钮右转
{
mot1 = 1;
}
else if (con2==1) //按中间的按钮后退
{
mot2 = 1;
mot4 = 1;
}
}
}
然而直接接小马达是驱动不了的,单片机的端口只负责输出“信号”,高电平也高不到哪里去。
所以给新手尝试阶段一个建议:两边的输出(就是那两个控制马达的输出口),一边接两个反接的LED灯; ps:注意要那种反向断电的LED,我以前也不知道居然还有反向通电的LED灯。
然后前面两个灯亮代表正转,后面两个灯亮代表反转,这样做用来测试自己的小程序还是很好用哒。
连接蓝牙模块
蓝牙小车最基础的首先是一个蓝牙模块,这个东西有很多种,这里我就说我使用的HC-06蓝牙模块,出来的四个脚基本上就是这样的;
RXD连51单片机系统版上的TXD,TXD连RXD;
VCC接VCC或者5V; 【我试的都可以
GND就找一个GND插上;
然后通电,蓝牙模块上的红灯会一直闪;
用手机下载APP“蓝牙串口SPP”这个APP可以自定义按键的名字和各种功能,很好用;
接下来打开蓝牙找到一个叫做“HC-06”的蓝牙连接一下,连接上以后你会发现蓝牙模块的红灯不闪了。
还需要一个 L298N 步进电机模块,之后会说
但是在做出可以跑的小车之前你还缺一步,就是写一个通过蓝牙控制输出的程序
蓝牙小车的代码如下:
其实控制不是很难,难得是乱七八糟的内部资源的使用
我也不是很理解内部资源,但是我知道封装好的三个函数的功能,大家可以放心食用
能完全看懂上面那一块代码的,相信都能看懂下面的代码,即使不清楚具体的功能,大概也明白哪些是可以自己改动的吧
在使用的过程中只需要修改一下“Cont”函数中的输入输出即可。
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uc;
typedef unsigned int ui;
#define Moto P1
uc Com;
void Init(); //初始化程函数
void Send(uc a); //发送字符函数
void Cont(); //接收指令函数
void main()
{
Init();
while (1)
{
if (RI==1)
{
RI = 0;
Com = SBUF;
Cont();
}
}
}
void Init()
{
ES=0;
SCON = 0x50;
TMOD = 0x20;
TH1=TL1=0xFD;
PCON &= 0x7f;
TR1 = 1;
TI=0;
RI=0;
ES=1;
Moto = 0x00;
}
void Send(uc a)
{
TI=0;
SBUF=a;
while (TI==0) ;
TI=0;
}
void Cont()
{
switch(Com)
{
case '5':
Moto = 0x00; //0000 0000 停止
Send(Com);
break;
case '2':
Moto = 0x0d; //0000 0101 前进
Send(Com);
break;
case '4':
Moto = 0x05; //0000 1101 左转
Send(Com);
break;
case '6':
Moto = 0x07; //0000 0111 右转
Send(Com);
break;
case '8':
Moto = 0x0a; //0000 1010 后退
Send(Com);
break;
default:
Moto = 0x00;
Send(Com);
}
}
控制方面的事宜也说一下吧【虽然很简单,
基本上就是这样,一个普通的键盘一样的输出,然后在程序里定义功能即可。
供电
你以为这样就可以跑了吗,然而还有一个很可怕的坑——电源。
我因为想自己组装各种零件,所以学习单片机的时候一直用的是最小系统板,单片机用的是STC89C52RC
这里仔细的说一下连线:
蓝牙模块前文已经说过了;
因为程序里用的是 P1^0 ~P1^3 因此这四个脚依次接到 L298N 的“逻辑输入口” IN1 ~IN4;
L298N 的电源部分,中间的口直接接单片机系统板的GND,供电用左边的“12V”直接接到5V单片机系统板的口就可以了;
我之前遇到的坑就是 L298N 的5V接单片机的5V结果不能供电,我以为是单片机供电不够,又直接连电池,就是单片机用电源线供电,电机模块用电池供电,结果还是不行;
于是乎我就考虑接12V的口,然后我就很强势的串联了八节电池,还没有电池盒,自己用大泡沫做了个电池盒,连上了以后成功供电,但是OUT口不能驱动电机转动,很绝望;
后来直接把12V的口接在单片机的5V输出上,居然可以了。。。一脸懵逼?电压够么???
再之后尝试用电池当电源(毕竟小车要乱跑嘛),然后又是被卡了好久最后发现六节电池不能用,四节电池才可以正常使用
最后用四节电池给单片机供电就可以连接蓝牙开始飙车辣owo
最后
总之这些就是我在自学单片机做蓝牙小车的过程中遇到的一些坑,网上那些人做的博客大多就是直接一坨代码扔给你,硬件部分讲的很少,个人觉得对新手很不友善,所以我做好以后就想发个博客把我觉得当初遇到的困难给大家说一下,程序网上一搜一大堆,重要的是硬件部分有一些不理解的地方,就是这样。