直入主题:

硬件部分:l298n、单片机最小系统(最优选,因为有很多外设的板子会影响输出电压大小,导致输出电压不够)、12V直流电源、HC-05蓝牙模块、USB转TTl模块、小车底盘一个(带电机的)、杜邦线若干。

     下图为HC-05蓝牙模块,此模块有6引脚。

  

51 单片机 蓝牙 Android 51单片机蓝牙模块教程_引脚

51 单片机 蓝牙 Android 51单片机蓝牙模块教程_引脚_02

        下图为USB转 TTL模块,此模块有5引脚。

51 单片机 蓝牙 Android 51单片机蓝牙模块教程_引脚_03

 

 

 

 

  

       下图为L298N电机驱动模块。

51 单片机 蓝牙 Android 51单片机蓝牙模块教程_引脚_04

     下图为单片机最小系统(单片机下为12V直流电源)

51 单片机 蓝牙 Android 51单片机蓝牙模块教程_串口_05

    基本介绍完小车各部件,下面讲一下各模块怎么使用。

    首先说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;  
}