直入主题:
硬件部分:l298n、单片机最小系统(最优选,因为有很多外设的板子会影响输出电压大小,导致输出电压不够)、12V直流电源、HC-05蓝牙模块、USB转TTl模块、小车底盘一个(带电机的)、杜邦线若干。
下图为HC-05蓝牙模块,此模块有6引脚。
下图为USB转 TTL模块,此模块有5引脚。
下图为L298N电机驱动模块。
下图为单片机最小系统(单片机下为12V直流电源)
基本介绍完小车各部件,下面讲一下各模块怎么使用。
首先说HC-05蓝牙模块,这个模块是一个主从一体的蓝牙模块,需要先和USB转TTL模块连接VCC-VCC、GND-GND、TXD-RXD、RXD-TXD,然后和电脑相连(注意:连接电脑时需要同时按住HC-05上黑色小按钮,红灯双闪就对了),然后打开串口调试软件(链接:https://pan.baidu.com/s/1O-5b1qmakEjfLp74LzPw0A 提取码:oxez ),我用的是链接中的串口调试软件V2.4,工具中波特率设置为38400,发送AT,收到OK就对了。
然后发送以下指令:AT+ROLE=0(设置为从机,此时只可以被搜索)
AT+CMODE=1(允许连接)
AT+UART=9600(设置模块比特率为9600)
AT+NAME=随意英文(设置模块名字)
AT+PSWD=1234(设置密码)
还需要在手机下载蓝牙串口app。
然后讲一下L298N电机驱动模块,模块正对自己(左2蓝,右2蓝,下3蓝),左2蓝和右2蓝分别连接一个电机,是输出端,IN1、IN2、IN3、IN4是输入端,两两一对,12左、34右,当1和2分别一个高电平一个低电平时(即in1=0、in2=1),电机转(in1=1,in2=0反转)。ENA、ENB为PWM调速端口。下3蓝中,最左是12v直流输入,中间gnd,最右5v输出,可以给单片机5v供电。
然后再说一下连线部分:电源给L298N供电,L298n给两个电机以及单片机供电,单片机2.7654分别连接in1234,2.32分别接ena、enb。蓝牙模块TXD、RXD接单片机3.0、3.1。
在本程序中设置31.32.33.34为字符段发送,HC-05接收到通过单片机3.1、3.0输入给单片机,然后单片机引脚做出反应,使l298n输入端做出反应,实现电机前后转,两轮转速不同实现转向。
下面给出全部源代码,此小车只是做出最简单的前后左右,其它细节还需要进一步完善。
#include<reg52.h>
sbit in1=P2^7;
sbit in2=P2^6;
sbit in3=P2^5;
sbit in4=P2^4;
sbit ena=P2^3;
sbit enb=P2^2;
typedef unsigned int uint;
typedef unsigned char uchar;
uint pass = 0; //传递数据位
void delay(unsigned int z) //延时函数
{
unsigned int y;
for(;z>0;z--)
for(y=0;y<125;y++);
}
void delay_10um(unsigned int n)
{
while(n--);
}
void qianjin() //前进
{
in1=1;
in2=0;
in3=1;
in4=0;
ena=1;
enb=1;
delay_10um(40);
ena=0;
enb=0;
delay_10um(60);
}
void houtui() //后退
{
in1=0;
in2=1;
in3=0;
in4=1;
ena=1;
enb=1;
delay_10um(40);
ena=0;
enb=0;
delay_10um(60);
}
void zuozhuan() //左转
{
in1=1;
in2=0;
ena=1;
delay_10um(60);
ena=0;
delay_10um(40);
in3=1;
in4=0;
enb=1;
delay_10um(40);
enb=0;
delay_10um(60);
}
void youzhuan() //右转
{
in1=1;
in2=0;
ena=1;
delay_10um(40);
ena=0;
delay_10um(60);
in3=1;
in4=0;
enb=1;
delay_10um(60);
enb=0;
delay_10um(40);
}
void tingzhi() //停止
{
in1=0;
in2=0;
}
void UART_init()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; //波特率9600
SM0 = 0;
SM1 = 1; // 串口工作方式1 10位异步
REN = 1; //串口允许接收
TR1 = 1;
EA = 1;
ES =1 ; //串口中断
}
int main()
{
UART_init(); //波特率9600
while(1)
{
if(pass == 0x31)
qianjin();
if(pass == 0x32)
zuozhuan();
if(pass == 0x33)
youzhuan();
if(pass == 0x34)
houtui();
if(pass == 0x35)
tingzhi();
}
}
void UART_INTERRUPT() interrupt 4
{
pass = SBUF;
RI = 0;
SBUF = pass;
while(!TI);
TI = 0;
}