找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1665|回复: 4
打印 上一主题 下一主题
收起左侧

单片机蓝牙控制小车 求大牛求相助!

[复制链接]
跳转到指定楼层
楼主
ID:224249 发表于 2017-10-19 20:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件从做好的循迹小车中改过来的。是好的。存在问题:
手机发送16进制代码,小车没有反应

蓝牙型号为HC-05

附上程序代码,求大神解惑!
不胜感激!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:224249 发表于 2017-10-19 20:42 | 只看该作者
#include <reg52.h>
#include <math.h>

//宏定义
#define uchar unsigned char
#define uint unsigned int
#define SPEED_L_MAX 60
#define SPEED_R_MAX 60


//端口声明
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit R1 = P0^2;
sbit R2 = P0^3;

  
//变量定义
uchar t;                         //   计数
uchar PWM_L1;                 //          占
uchar PWM_L2;                 //          空
uchar PWM_R1;                 //          比
uchar PWM_R2;                 //

uchar Temp;                        //    接收数据暂存变量

uchar Port_flag;                   // 串口接收标志位

int mode;                           // 控制模式
int SPEED_L_TARGET;           // 左轮速度
int SPEED_R_TARGET;           // 右轮速度

//子程序声明
void Speed_Calculate();
void motor();
void Port_init();

void Time0_init()
{
  TMOD|=0x01;
  TH0=(65536 - 100)/256;
  TL0=(65536 - 100)%256;
  EA=1;
  ET0=1;
  TR0=1;
}

void Port_init()
{
        TMOD|=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
}

void main()
{
  Time0_init();
  Port_init();
  while(1)
  {
      if( Port_flag == 1 )
          {       
            Port_flag = 0;
            switch (Temp)
                {
                   case 0x01 :                   
                      mode = 1;                          // 直走
                   case 0x02 :
                      mode = 2;                   // 左拐
                   case 0x03 :
                      mode = 3;                          // 右拐
                   case 0x04 :
                      mode = 4;                           // 倒退
                   case 0x05 :
                      mode = 5;                          // 停止
                }
            
          }
          
          Speed_Calculate();
          motor();

  }

}

void motor()
{
        if(SPEED_L_TARGET>=0)
        {
        PWM_L1=SPEED_L_TARGET;
        PWM_L2=0;
        }
        else
        {
        PWM_L1=0;
        PWM_L2=abs(SPEED_L_TARGET);
        }


        if(SPEED_R_TARGET>=0)
        {
        PWM_R1=SPEED_R_TARGET;
        PWM_R2=0;
        }
        else
        {
        PWM_R1=0;
        PWM_R2=abs(SPEED_R_TARGET);                 //绝对值
        }
}

void Speed_Calculate()
{
        if     (mode == 1)
        {
                SPEED_L_TARGET = SPEED_L_MAX*0.45;                                   //直走
                SPEED_R_TARGET = SPEED_R_MAX*0.45;
        }
        else if(mode == 2)
        {                                                                                                                  //稍微左拐
                SPEED_L_TARGET = SPEED_L_MAX*0;       
                SPEED_R_TARGET = SPEED_R_MAX*0.55;
        }
        else if(mode == 3)
        {
                SPEED_L_TARGET = SPEED_L_MAX*0.55;                                      //稍微右拐
                SPEED_R_TARGET = SPEED_R_MAX*0;
        }
        else if(mode == 4)
        {
                SPEED_L_TARGET = SPEED_L_MAX*(-0.45);                      //后退
                SPEED_R_TARGET = SPEED_R_MAX*(-0.45);
        }
       
        else if (mode == 5)
        {
                SPEED_L_TARGET = SPEED_L_MAX*0;                                      //停止
                SPEED_R_TARGET = SPEED_R_MAX*0;
        }
}


void Timer0 () interrupt 1
{
            
         TH0=(65536 - 100)/256;
     TL0=(65536 - 100)%256;
         t++;
       
        if(t<PWM_L1) L1=1;else L1=0;       
       
        if(t<PWM_L2) L2=1;else L2=0;
       
        if(t<PWM_R1) R1=1;else R1=0;
       
        if(t<PWM_R2) R2=1;else R2=0;
       
        if(t>100)
                t=0;
       
}

void Port () interrupt 4
{
        RI=0;
        Temp=SBUF;
        Port_flag=1;
}
回复

使用道具 举报

板凳
ID:224249 发表于 2017-10-19 20:53 | 只看该作者
别沉了啊,自顶。纠结半天了
回复

使用道具 举报

地板
ID:164602 发表于 2017-10-20 08:32 | 只看该作者
s-Pual 发表于 2017-10-19 20:53
别沉了啊,自顶。纠结半天了

因为没有你说的相应硬件,也没办法试验你的程序。
你到本论坛的智能小车/机器人板块去找找答案吧。
你的小车没反应,不一定只是51单片机的程序问题,还和你的手机APK程序有关,两边要配套才行。我的蓝牙小车就是从那里学来的,多看几篇相关文章。
以我的经验,提醒你以下几点:
1、首先是单片机蓝牙接收和手机蓝牙发送的数据类型一定要相同,一定一定一定。
2、51单片机的晶振是多少?如果是12M,串口的波特率最大4800,一定要加倍,否则,接收数据误差太大,没法工作的。
3、手机APK程序是自己写的吗?如果是用别人的,那得好好研究一下别人的51单片机程序,才知道别人的手机是发的什么样的数据,网上很难找到手机APK的源程序,只能从单片机程序中去找相关的信息。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:240022 发表于 2017-10-20 10:28 | 只看该作者
s-Pual 发表于 2017-10-19 20:53
别沉了啊,自顶。纠结半天了

二、蓝牙sbuf分为接受和发送,接受完成后,一定要将RI关闭,并接受到的数据用发送缓冲器sbuf发送到单片机内部,具体实现:SBUF=/*变量*/;
                                      while(!TI);                  //等待发送数据完成
                                                               TI=0;                         //清除发送完成标志位。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表