标题:
单片机蓝牙控制小车 求大牛求相助!
[打印本页]
作者:
s-Pual
时间:
2017-10-19 20:41
标题:
单片机蓝牙控制小车 求大牛求相助!
硬件从做好的循迹小车中改过来的。是好的。存在问题:
手机发送16进制代码,小车没有反应
蓝牙型号为HC-05
附上程序代码,求大神解惑!
不胜感激!
作者:
s-Pual
时间:
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;
}
作者:
s-Pual
时间:
2017-10-19 20:53
别沉了啊,自顶。纠结半天了
作者:
HC6800-ES-V2.0
时间:
2017-10-20 08:32
s-Pual 发表于 2017-10-19 20:53
别沉了啊,自顶。纠结半天了
因为没有你说的相应硬件,也没办法试验你的程序。
你到本论坛的智能小车/机器人板块去找找答案吧。
你的小车没反应,不一定只是51单片机的程序问题,还和你的手机APK程序有关,两边要配套才行。我的蓝牙小车就是从那里学来的,多看几篇相关文章。
以我的经验,提醒你以下几点:
1、首先是单片机蓝牙接收和手机蓝牙发送的数据类型一定要相同,一定一定一定。
2、51单片机的晶振是多少?如果是12M,串口的波特率最大4800,一定要加倍,否则,接收数据误差太大,没法工作的。
3、手机APK程序是自己写的吗?如果是用别人的,那得好好研究一下别人的51单片机程序,才知道别人的手机是发的什么样的数据,网上很难找到手机APK的源程序,只能从单片机程序中去找相关的信息。
作者:
芦苇劫
时间:
2017-10-20 10:28
s-Pual 发表于 2017-10-19 20:53
别沉了啊,自顶。纠结半天了
二、蓝牙sbuf分为接受和发送,接受完成后,一定要将RI关闭,并接受到的数据用发送缓冲器sbuf发送到单片机内部,具体实现:SBUF=/*变量*/;
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1