基于51单片机与Android手机通信的android蓝牙小车
(班门弄斧,请各位大神批评指正,烦请提出宝贵意见。)
#一、材料:
1.stc51单片机最小系统板(最好带上拉电阻);
2.HC-02蓝牙芯片;
3.减速电机,电机驱动;
4.充电宝(感谢刘帆同学赞助的充电宝);
5.车架是自己设计,3D打印出来的,打印件下载;
5.Android手机及app,APP下载;
二、硬件连接
1.把小车电机驱动上的四根控制线接在单片机4个IO口上;
2.把HC-02的rxd接在单片机的txd上,txd接在单片机的rxd上;
3.把单片机、HC-02、小车电机驱动的电源线接在充电宝输出上;
4.把码盘(用于测速)上的GND、VCC连上电源,输入连在51单片机的IO 口上;
4.给单片机烧程序;
5.打开Android手机扫描蓝牙,连接测试;
6.手机控制小车。
#三、调试过程及相关代码
1.调试HC-02蓝牙芯片(买的时候店家会送调试程序及教程);
2.调试单片机蓝牙通信;
(1).扫描,连接,键盘模式。
(2).右上角三点,设定IO模式,接收:hex字符串,发送:hex字符串。
(3).配置键盘值(发送给蓝牙芯片的字符串就是这个);
(4).前进(1A),长按(1A),释放(DD)
(5).左转(1B),长按(1B),释放(DD)
(6).后退(1F),长按(1F),释放(DD)
(7).右转(1C),长按(1C),释放(DD)
(8).刹车(DD),长按(DD),释放(DD)
3.相关代码
/*
程序名称: 蓝牙手机遥控小车
功能原理: 利用智能手机app连接HC-02蓝牙芯片实现蓝牙串口通信,
利用stc51单片机控制电机驱动模块驱动小车 。
扩展功能:循迹、避障等。
*/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#define time_0 5
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit output_date1=P2^7;
sbit output_date2=P2^6;
sbit output_date3=P2^5;
sbit output_date4=P2^4;
sbit STA=P1^0;
#define GO_STAIGHT {output_date1=1,output_date2=0,output_date3=1,output_date4=0;} //前进
#define GO_BACK {output_date1=0,output_date2=1,output_date3=0,output_date4=1;} //后退
#define TURN_RIGHT {output_date1=0,output_date2=1,output_date3=1,output_date4=0;} //右转
#define TURN_LEFT {output_date1=1,output_date2=0,output_date3=0,output_date4=1;} //左转
#define STOP_CAR {output_date1=0,output_date2=0,output_date3=0,output_date4=0;} //停车
#define USART_MAX_RECV_LEN 40
u8 USART_RX_BUF[USART_MAX_RECV_LEN];
u16 USART_RX_STA=0;
void delay(u16 n);
void UsartInit();
void USART_SendData();
void delay(u16 n) //1ms (误差 -0.651041666667us)
{
u16 i ;
unsigned char a,b;
for(i=1;i<=n;i++)
{
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
}
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XFa; //计数器初始值设置,注意波特率是9600的
TL1=0XFa;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void USART_SendData(u8 datbuf[])
{
u8 i=0;
for(i=0;i<1;i++)
{
SBUF=datbuf[i];//将接收到的数据放入到发送寄存器
while(!TI);//等待发送数据完成
TI=0;//清除发送完成标志位
}
}
void main()
{ u8 date_get=0;
STA=0;
UsartInit(); //串口初始化
while(1)
{
date_get=USART_RX_BUF[0];
switch(date_get)
{
case 0x1B: //左转
TURN_LEFT;
USART_SendData(USART_RX_BUF);
delay(time_0);
break;
case 0x1A: //前进
GO_STAIGHT;
USART_SendData(USART_RX_BUF);
delay(time_0);
break;
case 0x1F: //后退
GO_BACK;
USART_SendData(USART_RX_BUF);
delay(time_0);
break;
case 0x1C: //右转
TURN_RIGHT;
USART_SendData(USART_RX_BUF);
delay(time_0);
break;
case 0xDD:
//停
STOP_CAR;
USART_SendData(USART_RX_BUF);
delay(time_0);
STOP_CAR;
}
STOP_CAR;
}
}
void Usart() interrupt 4 //串口中断
{
u8 res;
res=SBUF;
USART_RX_BUF[0]=res;
RI=0;//清除接收中断标志位
}