包含手机端apk程序还有单片机程序usb驱动等等很全的资料
所有资料下载:
蓝牙模块资料.zip
(6.59 MB, 下载次数: 60)
蓝牙模块的at指令
AT指令集
1 、测试通讯
发送:AT(返回OK,一秒左右发一次)
返回:OK
2 、改蓝牙串口通讯波特率
发送:AT+BAUD1
返回:OK1200
发送:AT+BAUD2
返回:OK2400
……
1---------1200
2---------2400
3---------4800
4---------9600
5---------19200
6---------38400
7---------57600
8---------115200
9---------230400
A---------460800
B---------921600
C---------1382400
不建议用在超过115200的波特率,信号的干扰会使系统不稳定。
设置超过115200后用电脑无法使用,要用单片机编程于高于 115200 才能使用此波特率和
重新发AT命令设低波特率
用AT命令设好波特率后,下次上电使用不需再设,可以掉电保存波特率。
3 、改蓝牙名称
发送:AT+NAMEname
返回:OKsetname
参数name:所要设置的当前名称,即蓝牙被搜索到的名称。20个字符以内。
例:发送AT+NAMEbill_gates
返回OKsetname
这时蓝牙名称改为bill_gates
参数可以掉电保存,只需修改一次。 PDA 端刷新服务可以看到更改后的蓝牙名称。
4 、改蓝牙配对密码
发送:AT+PINxxxx
返回:OKsetpin
参数xxxx :所要设置的配对密码,4 个字节,此命令可用于从机或主机。从机是适配器或手
机弹出要求输入配对密码窗口时,手工输入此参数就可以连接从机。主蓝牙模块搜索从机后,
如果密码正确,则会自动配对,主模块除了可以连接配对从模块外,其他产品包含从模块的
时候也可以连接配对,比如含蓝牙的数码相机,蓝牙GPS ,蓝牙串口打印机,等等,特别地,
蓝牙GPS 为典型例子
例:发送AT+PIN8888
返回OKsetpin
这时蓝牙配对密码改为8888,模块在出厂时的默认配对密码是 1234。
参数可以掉电保存,只需修改一次。
5 、获取版权命令: AT+VERSION
返回Linvor 则为正品
附录 1 程序
#include <reg52.h>
#include<math.h>
#include<intrins.h>
#define ucharunsigned char
#define uint unsigned int
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
uchar j,pro;
uchar i;
uchar zhuangtai1 ,zhuangtai2,zhuangtai3;
sbit key1=P2^3;
sbit key2=P2^4;
sbit servor0=P0^0; //舵机控制左右
sbit red0=P0^4; // 右边红外接收
sbit red1=P0^2; //左边红外接收
sbit red2=P0^3; // 右边红外接收2
sbit red3=P0^5; // 左边红外接收2
sbit water=P0^7; //水泵
//定义智能小车驱动模块输入IO
sbit IN1 = P1^0;// 高电平1 后退(反转)
sbit IN2 = P1^1; // 高电平1 前进(正转)
sbit IN3 = P1^2;// 高电平1 前进(正转)
sbit IN4 = P1^3; // 高电平1 后退(反转)
sbit IN5 = P1^4;// 高电平1 后退(反转)
sbit IN6 = P1^5; // 高电平1 前进(正转)
sbit IN7 = P1^6;// 高电平1 前进(正转)
sbit IN8 = P1^7; // 高电平1 后退(反转)
//wifi数据定义
uchar Buffer =0; //从串口接收的数据
uint URTAReceivedCount=0,n=1;
uchar dataTempdatatable[5],CommandDatatable[5];//数据包
uchar serVal[2];
uintpwm[]={1120,1190,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)
uchar pwm_flag=0;
uint code ms0_5Con=461; //0.5ms计数 (实际是460.8,取整得461)
uint code ms2_5Con=2304; //2.5ms计数
bit key_stime_ok;
//延时1ms
void delay_ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
* 功能 :前进
***********************************************************************/
void comeon()
{
IN1=0; //左电机
IN2=1;
IN3=1; //右电机
IN4=0;
IN5=0; //左电机
IN6=1;
IN7=1; //右电机
IN8=0;
delay_ms(10);
}
/********************************************************************
* 功能 : 左转
***********************************************************************/
void comeleft()
{
IN1=0; //左电机
IN2=1;
IN3=0; //右电机
IN4=1;
IN5=0; //左电机
IN6=1;
IN7=0; //右电机
IN8=1;
delay_ms(10);
}
/********************************************************************
* 功能 : 右转。
***********************************************************************/
void comeright()
{
IN1=1; //左电机
IN2=0;
IN3=1; //右电机
IN4=0;
IN5=1; //左电机
IN6=0;
IN7=1; //右电机
IN8=0;
delay_ms(10);
}
/********************************************************************
* 功能 : 停止
***********************************************************************/
void stop()
{
IN1=0; //左电机
IN2=0;
IN3=0; //右电机
IN4=0;
IN5=0; //左电机
IN6=0;
IN7=0; //右电机
IN8=0;
delay_ms(10);
}
/********************************************************************
* 功能 : 后退。
***********************************************************************/
void back()
{
IN1=1; //左电机
IN2=0;
IN3=0; //右电机
IN4=1;
IN5=1; //左电机
IN6=0;
IN7=0; //右电机
IN8=1;
delay_ms(10);
}
//自动浇花初始化
void INIT() //初始化
{
TMOD= 0x01; //T/C1采用16位定时器/计数器
ET0 = 1; //定时器1开中断
TH0= 0xff;
TL0 = 0xce;
TR0=0;
EA = 1; //CPU开中断
}
//定时0.1ms
void timer0() interrupt 1
{
EX0=0;
TH0=0xff;
TL0=0xce;
j++;
if(j<=pro)
{
servor0=1;
}
else
{
servor0=0;
}
if(j==400) //周期20ms
{
j=0;
servor0=~servor0;
}
}
//右转90度
voidservorr()
{
TR0=1;
pro=8; //舵机转动到0°
delay_ms(200);
TR0=0;
}
//左转90度
voidservorl()
{
TR0=1;
pro=34; //舵机转动到0°
delay_ms(200);
TR0=0;
}
//转到0度
voidservorc() //0
{
TR0=1;
pro=20; //舵机返回90°方向
delay_ms(200);
}
//循迹
void scanline()
{
P1=0XFF;
if(K3==0||K3==0&&K2==0){comeleft();comeleft();zhuangtai1=1;zhuangtai2=0;zhuangtai3=0;}
//当左边检测到黑线时则 左转 状态1 置1 状态2 状态3清零
elseif(!K1||!K1&&!K2) { comeright();comeright ();zhuangtai1=0;zhuangtai2=1;zhuangtai3=0;}
//当右边检测到黑线时则右转 状态2 置1 状态1 状态3清零
elseif(!K2) { comeon();zhuangtai1=0;zhuangtai2=0;zhuangtai3=1; }
else
{ //当没有探头检测到黑线时
if(zhuangtai1) {comeleft();} // 状态1 则左转
else if(zhuangtai2) {comeright();}//状态2 则右转
else if(zhuangtai3) {comeon();} //状态3 则前进直走
else{stop();}
}
}
/********************************************************************
* 名称 : Send_Data()
* 功能 : 向上位机传送字符
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Send_Data(uchar type,uchar cmd,uchardat)
{
uchar data Buffer[5];//构建数据包
uchar *p;
uint Send_Count=0;
p= Buffer;
Buffer[0]=0XFF;
Buffer[1]=type;
Buffer[2]=cmd;
Buffer[3]=dat;
Buffer[4]=0XFF;
while(1)
{
if(*p==0XFF)
{
Send_Count++; //0XFF标志统计位
}
SBUF = *p; //发送
while(!TI) //如果发送完毕,硬件会置位TI,等待发送完毕
{
_nop_();
}
p++;
TI = 0;
if(Send_Count == 2) //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环
{
TI = 0;
break;
}
}
}
/********************************************************************
协议规定:
包头 类型位 数据位 数据位 结束位
0XFF 0X** OX** 0X** 0XFF
各命令说明:
类型位 数据位 数据位 功能
0X00 0X02 0X00 前进
0X00 0X01 0X00 后退
0X00 0X03 0X00 左转
0X00 0X04 0X00 右转
0X00 0X00 0X00 停止
0X01 0X01 舵机l
0X01 0X02 . 舵机r
0X01 0X03 . 舵机c
0X02 0X01 喷水
0X02 0X02 . 不喷水
***********************************************************************/
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断初始化
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x21;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
IT0=0;
EX0=1;
}
// 串口中断
void Com_Int(void) interrupt 4
{
uchar temp;
ES=0; //关串口中断
RI=0; //软件清除接收中断
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
Tempdatatable[0]=0XFF; //包头
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
if(URTAReceivedCount==0&&n==2)
n=1;
}
if(URTAReceivedCount==2)//包尾
{
Tempdatatable[0]=0XFF;
Tempdatatable[4]=0XFF;
n=1;
URTAReceivedCount=0; //组包完毕
temp=' ';
// Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //发送组成的数据包回去
}
CommandDatatable[0]=Tempdatatable[0];
CommandDatatable[1]=Tempdatatable[1];
CommandDatatable[2]=Tempdatatable[2];
CommandDatatable[3]=Tempdatatable[3];
CommandDatatable[4]=Tempdatatable[4];
ES=1;//开串口中断
}
//wifi控制初始化
void Timer0Init()
{
/*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
/.5 ms初始值 F700,(12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/
TMOD|= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=-ms2_5Con>>8; //给定初值,17ms中断
TL0=-ms2_5Con;
EA=1; //总中断打开
ET0=1; //定时器0中断打开
TR0=1; //定时器0开关打开
}
// 自动控制主程序
voidzidong() //自动浇花
{
P0=0X7d;
P1=0X00;
P2=0XFF;
INIT();
servorc();
while(1)
{
//舵机转动浇水
if(red1==0)
{
while(red1==0&&red3==0)
{
stop();
delay_ms(100);
servorl();
delay_ms(100);
water=1;
}
water=0;
delay_ms(200);
servorc();
}
if(red0==0)
{
while(red0==0&&red2==0)
{
stop();
delay_ms(100);
servorr();
delay_ms(100);
water=1;
}
water=0;
delay_ms(200);
servorc();
}
scanline(); //循环调用寻线子程序
}
}
// wifi控制主程序
void wifico()
{
delay_ms(50);
water=0;
P1=0X00;
INIT();
Com_Init();//串口初始化
servorc();
while(1)
{
if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
{
switch (CommandDatatable[1]) //根据键值不同,执行不同的内容
{
case 0X00: //类型位0X00,表明是控制数据包,进入控制数据case
switch(CommandDatatable[2]) //根据数据位的值来进行选择执行不同的动作
{
case0X00:stop();break;
case0X01:comeon();break;
case0X02:back();break;
case0X03:comeleft();break;
case0X04:comeright ();break;
default : break;
}
break;
case 0X01: //类型位0X01,表明是舵机数据包,进入舵机case
switch(CommandDatatable[2])
{ case 0x01:servorr();break;
case0x02:servorc();break;
case0x03:servorl();break;
default: break;
}
break;
case0X02:
switch(CommandDatatable[2])
{ case 0x01:water=1;break;
case0x02:water=0;break;
default: break;
}
break;
default : break;
}
}
}
}
//主函数
void main()
{
water=0;
if(key1==0&&key2!=0)zidong();
elseif(key2==0&&key1!=0) wifico();
else
{
water=0;
servorc();
stop();}
}
|