基于51单片机开发的蓝牙遥控智能车+舵机扫描

遥控车是基于STC89C52RC单片机开发,车体组成有底盘,直流电机33GB-520-18.7,L298N电机驱动模块,LM2596降压模块,12V DC电源,HC-05蓝牙模块。其中HC-05蓝牙模块与单片机是串口通信所以要注意连线,STC89C52RC中P30,P31为串口引脚,具体连线如下示意图:
在这里插入图片描述
在这里插入图片描述

本次实验目的是:通过手机蓝牙调试器发送信号控制车辆的前进,后退,原地左转,原地右转,单独左转,单独右转,舵机扫描以及寻迹模式的切换(在这里声明一下,本次代码的寻迹模式切换模式还不太完善,未达到理想效果,电子发烧友们可以多多指点。在下学艺不精,在接下来的解说中如有错误望大佬纠正。)手机采用蓝牙调试器,需要自己进行按键编辑以及字符发送。 将硬件设备搭建完成后,我们即将开始软件的编程:话不多说,代码走起!!!

// An highlighted block

#include <reg52.h>   //头文件
#include <intrins.h>
sbit blackorwhite1=P2^5;//黑白传感器定义引脚
sbit blackorwhite2=P2^6;
sbit blackorwhite3=P2^7;
sbit motor1=P1^0;
sbit motor2=P1^1;//电机1定义引脚
sbit motor3=P1^3;
sbit motor4=P1^4;//电机2定义引脚
sbit PWM1=P2^0;//SG90信号定义引脚
typedef unsigned char uc;
typedef unsigned int ui;    //复杂名称函数的替代
uc Com;
int i;
void Init();  //在这里一定要注意在main()函数后的子函数要进行声明,不声明虽然不会报错但有可能会忽略子函数导致一些功能不能实现
void Send(uc a); 
void Cont();  
void qianjin();
void houtui();
void youzhuan();
void zuozhuan();
void xunji();
//void L2_0();  
void L2_45(); 
void L2_90(); 
void L2_135();
//void L2_180();
void delay(int t);
void delayx1ms(int x);
void delay1ms();
void delay500us();
void ZUO();
void YOU();
 
void delay(int t)                          //延迟函数
{
        int a,b;
        for(a=0;a<t;a++)
                for(b=0;b<120;b++);
}
void delayx1ms(int x)
{
        unsigned char a,b;
        for(x;x>0;x--)
                for(b=102;b>0;b--)
                        for(a=3;a>0;a--);
}void delay1ms()
{
        unsigned char a,b;
        for(b=102;b>0;b--)
                for(a=3;a>0;a--);
}
void delay500us()
{
        unsigned char a,b;
        for(b=1;b>0;b--)
                for(a=227;a>0;a--);
}
void main()   //    主函数
{
 Init();         //     串口初始化函数调用
 while (1)
 { 
  if (RI==1)   //    判断是否有数据
  {
   RI = 0;     // 置0
   Com = SBUF;    // 暂时存放接收的数据
   Cont();             // 调用数据处理函数
  }
 }
}void Init()    //串口初始化
{
 ES=0;                     //中断关闭
 SCON = 0x50;         //   串行控制寄存器   01010000串口工作方式1并允许中断接收数据
 TMOD = 0x20;        //    定时器/计 数器1设置为工作方式
 TH1=TL1=0xFD;     //   设置波特率9600=110592*1000000/12/(0x100-0xfd)/32   本次实验晶振(11.0592)
 PCON &= 0x7f;       //    波特率不倍增
 TR1 = 1;         //   开启定时器1
 TI=0;             //   发送中断位
 RI=0;             //   接收中断位
 ES=1;            //   开启串口中断
 motor1=0;
 motor2=0;     //   电机初始化
 motor3=0;
 motor4=0;
}
   
void Send(uc a)   //单字节数据发送{
 TI=0;             // TI是串口接收标志位 SBUF=a;         //SBUF---即串口数据缓冲寄存器   将数据存入
 while (TI = =0;   //等待发送结束
 TI=0;             //清零
} 
void qianjin()   //前进功能函数
{
      motor1=1;
      motor2=0; 
      motor3=1;
      motor4=0;
}
void zuozhuan()   //原地左转功能函数
{
      motor1=0;
      motor2=1; 
      motor3=1;
      motor4=0;
}
void youzhuan()  //原地右转功能函数
{
      motor1=1;
      motor2=0; 
      motor3=0;
      motor4=1;
}
void houtui()  //后退功能函数
{
      motor1=0;
      motor2=1; 
      motor3=0;
      motor4=1;
}
void ZUO()  // 单独左转功能函数
{
      motor1=0;
      motor2=0; 
      motor3=1;
      motor4=0;
}void YOU()  // 单独右转功能函数
{
      motor1=1;
      motor2=0; 
      motor3=0;
      motor4=0;
}
void xunji()  //寻迹模式切换 功能函数
{
// while(1)
 {
   if((blackorwhite1==1)&& (blackorwhite2==0)&&(blackorwhite3==1))
  qianjin();
  else if ((blackorwhite1==0&&blackorwhite2==0&&blackorwhite3==1)||(blackorwhite1==0&&blackorwhite2==1&&blackorwhite3==1))
  zuozhuan();
   else if((blackorwhite1==1&&blackorwhite2==1&&blackorwhite3==0)||(blackorwhite1==1&&blackorwhite2==0&&blackorwhite3==0))
  youzhuan();
  else if ((blackorwhite1==0)&&(blackorwhite2==0)&&(blackorwhite3==0))
   qianjin();
  else
  houtui(); 
                             
 }
}
//void L2_0()                                                  SG90舵机0度函数  若需要可以解禁此功能
/{
//        int i,j;
//        for(j=0;j<43;j++)
//        {
//                PWM1=1;
//                delay500us();
//       //      delay1ms(); 
//                PWM1=0;
//                for(i=0;i<19;i++)
//                delay1ms();
//                delay500us();
//                PWM1=0;
//                for(i=0;i<20;i++)
//                delay1ms();
//        }
//}
void L2_45()                                                    //舵机45度旋转函数
{
        int i,j;
        for(j=0;j<43;j++)
        {
                PWM1=1;
        //     delay500us();
                delay1ms(); 
                PWM1=0;
                for(i=0;i<20;i++)
                delay1ms();
        //     delay500us();
                PWM1=0;
                for(i=0;i<21;i++)
                delay1ms();
        }
}
void L2_90()                                              //舵机90度旋转函数
{
        int i,j;
        for(j=0;j<43;j++)
   {
                PWM1=1;
                delay1ms();
                delay500us(); 
                PWM1=0;
                for(i=0;i<18;i++)
                delay1ms();
                delay500us();
                PWM1=0;
                for(i=0;i<20;i++)
                delay1ms();
         }
}
void L2_135()                                              //舵机135度旋转函数
{
        int i,j;
        for(j=0;j<43;j++)
   {
                PWM1=1;
                delay1ms();
                delay1ms();
       //      delay500us(); 
                PWM1=0;
                for(i=0;i<18;i++)
                delay1ms();
           //  delay500us();
                PWM1=0;
                for(i=0;i<20;i++)
                delay1ms();
         }
}
//void L2_180()                                              //舵机180度旋转函数,有需要可解禁此功能
//{
//        int i,j;
//        for(j=0;j<43;j++)
//   {
//                PWM1=1;
//                delay1ms();
//                delay1ms();
//                delay500us(); 
//                PWM1=0;
//                for(i=0;i<17;i++)
//                delay1ms();
//                delay500us();
//                PWM1=0;
//                for(i=0;i<20;i++)
//                delay1ms();
//         }
//}   void Cont()            // 数据处理函数
{
 switch(Com)
 {
  case '5':
            motor1=0;
            motor2=0; 
            motor3=0;
            motor4=0;
            Send(Com);
  break;
  case '2':
            qianjin();
            Send(Com);
  break;
  case '4':
            zuozhuan();
            Send(Com);
  break;
  case '6':
            youzhuan();
            Send(Com);
  break;
  case '8':
            houtui();
            Send(Com);
  break; 
  case '1':
            xunji();
            Send(Com);
  break;
  case '9':
            L2_45(); 
            delay(30);
            L2_90();
            delay(30);
            L2_135();
            delay(30);
            L2_45(); 
            delay(30);
            L2_90();
            delay(30);
            L2_135();
            delay(30);
            L2_90();      
            Send(Com);
  break;
  case 'F':
            YOU();
            Send(Com);
  break; 
  case 'E':
            ZUO();
            Send(Com);
  break; 
  default:
   
            motor1=0;
            motor2=0;
            motor3=0;
            motor4=0;
            Send(Com);
  }
} 

程序编译好后即可烧录,对手机上的蓝牙调试器进行相应字符编辑即可进行操作。对于想基于此程序继续开发的朋友们,如果加入更多功能函数时操作未响应,建议你们逐条加入排除问题。谢谢大家的认真阅读,有更好的逻辑可以留言。 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值