基于蓝牙控制的51单片机小车

目录

一、硬件部分

二、代码部分

三、代码分析

一、硬件部分 

名称功能图片
小车零件小车项目的前提(组装方法问某宝商家)
面包板

我把面包板分为了四个区域。一区和四区功能相同,二区和三区功能相同。一区要看列,一区有正负极,如果一区要通电,+接正极,-接负极。这样+的那一列全都带正电,-的那一列全相当于GND。

二区要看行,二区的每一行的电压性质相同。

2路L9110s模块控制着小车的电机,输入不同电平控制正反转。以图中的方向为准,六个引脚分别是A-1B,A-1A,VCC,GND,B-1B,B-1A。在这里我让VCC和GND接入面包板的区域一,A-1B,A-1A,控制着左边的电机,B-1B,B-1A控制着右边的电机。同时将电机接线接入绿色的槽里面,正负无所谓,但要一对一对的接入,左边接左电机引线,右边接右电机引线。
蓝牙模块配合蓝牙手机助手使用,注意接线正确

二、代码部分

main.c

#include "motor.h"
#include "uart.h"
void main()
{
     
    UartInit();
    
    while(1)
    {
        
    }
}

motor.c

#include "motor.h"

void Go_Forward()//前进
{
    RightConA=0;
     RightConB=1;
     LeftConA=0;
   LeftConB=1;
}

void Go_Back()//后退
{
    RightConA=1;
     RightConB=0;
     LeftConA=1;
   LeftConB=0;
}

void Go_Left()//左转
{
    RightConA=0;
     RightConB=1;
     LeftConA=0;
   LeftConB=0;
}
void Go_Right()//右转
{
    RightConA=0;
     RightConB=0;
     LeftConA=0;
   LeftConB=1;
}

void STOP()//停止
{
    RightConA=0;
     RightConB=0;
     LeftConA=0;
   LeftConB=0;
}

motor.h

#ifndef _MOTOR_H
#define _MOTOR_H
#include <reg52.h>

sbit RightConA=P3^2;
sbit RightConB=P3^3;
sbit LeftConA=P3^4;
sbit LeftConB=P3^5;

void Go_Forward();//前进


void Go_Back();//后退


void Go_Left();//左转

void Go_Right();//右转
void STOP();//停止
#endif

uart.c

#include "uart.h"
#include "motor.h"
#include <string.h>
char buffer[5];
void UartInit(void) //9600bps@11.0592MHz
{
  AUXR = 0x01;
SCON = 0x50;    //配置串口工作方式1,REN使能接收
TMOD &=0XF0;    
TMOD |= 0x20;//定时器1工作方式位8位自动重装
TH1 = 0xFD;
TL1 = 0xFD;//9600波特率的初值
TR1 = 1;//启动定时器
EA = 1;//开启总中断
ES = 1;//开启串口中断
}


void Uart_Hangdler() interrupt 4
{
    static int i=0;//静态变量,被初始化一次
    char tmp;
    if(RI==1)//中断处理函数中,对于接收中断的响应
        {
            RI=0;//清除接收中断标志位
            tmp = SBUF;
      if(tmp == 'M')
            {
      i = 0;
      }
      buffer[i++] = tmp;
            if(i==5)
            {
                i=0;
            }
        if(buffer[0] == 'M' )//将第一位设置为M            {
                switch(buffer[1])
                {
        case '1':
                    Go_Forward();
                    break;
                case '2':
                    Go_Back();
                    break;
                case '3':
                    Go_Left();
                    break;
                case '4':
                    Go_Right();
                    break;
                case '5':
                    STOP();
                    break;
        }    
           }
             if(i==2)
             {
                 memset(buffer,'\0',5);//记下了数字和字母清零
                 i=0;
             }
         }
}

uart.h

#ifndef _UART_H
#define _UART_H
#include <reg52.h>
sfr  AUXR=0x8E;

void UartInit(void);

#endif

三、代码分析

关于motor部分

 RightConA对应B-1A
 RightConB对应B-1B
 LeftConA对应A-1A
 LeftConB对应A-1B

让RightConA=0;
     RightConB=1;
     LeftConA=0;
   LeftConB=1;来一个正向电压,前进(相对于车头),如果你的和我的不一样你可以调节一下2路L9110s模块里的方向。

让RightConA=0;
     RightConB=1;
     LeftConA=0;
   LeftConB=0;在这里我们实行左转的时候,右轮动,左轮不动。

当需要停止的时候,四个引脚都停止供电。

关于uart部分

TR1=1,启动定时器开始计数,TF1=1,CPU申请中断,但是虽然他申请我们却可以不用,因此我在程序里并没有体现他的存在,我们不需要定时器1中断,我们需要串口中断

开启定时器1的中断,打开EA,ES。

进入中断后,判断中标志位RI是否为1,为1,软件清零。

设立一个临时变量接受来自接受寄存器SBUF的数据。如果遇到M,将其设置为第一个字符,接着数字是第二个字符。

M1前进

M2后退

M3左转

M4右转

M5停止

当i==2时,清零,并调用memset函数,对buffer的内容清零。

四、其它

扫描这个二维码,下载蓝牙助手

打开手机蓝牙,打来蓝牙助手软件。找到我们的蓝牙,连接

点击 自定义按钮,点击 设置方向按钮

长按上方的蓝色长方形,设置为前进 M1,点击发送,确定。其余的功能对应设置。

设置完成后点击对应的按钮小车就会执行命令。

如果大家没有蓝牙,也可以选择串口助手,并打开串口,在发送缓冲区选择文本模式分别输入M1,M2,M3,M4,M5执行相应的命令。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值