0.png (67.99 KB, 下載次數: 192)
下載附件
2016-6-5 00:37 上傳
包含手機端apk程序還有單片機程序usb驅動等等很全的資料
所有資料下載:
藍牙模塊資料.zip
(6.59 MB, 下載次數: 60)
2016-5-20 10:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
藍牙模塊的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 則為正品
0.png (121.48 KB, 下載次數: 171)
下載附件
2016-6-5 00:37 上傳
附錄 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();}
}
|