附件中有藍牙遙控51單片機智能小車的程序,藍牙APK,通信協議等
0.png (758.29 KB, 下載次數: 86)
下載附件
2018-6-12 03:27 上傳
51智能小車接線圖.jpg (414.5 KB, 下載次數: 81)
下載附件
2018-6-12 03:27 上傳
藍模塊連接說明.jpg (559.77 KB, 下載次數: 70)
下載附件
2018-6-12 03:27 上傳
51智能小車藍牙遙控通訊協議
協議格式如下:
$0,0,0,0,0,0,0,0,0,0,0,100,4200#
1、上下左右停止(對應協議中的第1位)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:direction:
{up(1),down(2),left(3),right(4),stop(0)}
2、左旋轉、右旋轉(對應協議中的第3位)(自定義1)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:revolve:
{turn_left(1),turn_right(2)}
3、鳴笛(對應協議中的第5位)(自定義3)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:whistle
{true,false}
4、加速(對應協議中的第7位)(自定義5)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:expedite
{true,false}
5、減速(對應協議中的第9位)(自定義6)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:reduce
{true,false}
6、點燈(自鎖)(對應協議中的第17位)(自定義2)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:light
{true,false}1,0
7、滅火(自鎖)(對應協議中的第19位)(自定義8)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:outfire
{true,false}1,0
8、超聲波(對應協議中的第23位)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:ultrasonic
{100.8} cm
9、電池電壓(對應協議中的第25位)
舉例:$0,0,0,0,0,0,0,0,0,0,0,100,4200#
變量:voltage
{4.2} v
單片機源程序如下:
- /**********************亞博智能小車黑線循跡例程************************
- * 平臺:BST-V51 + Keil uVision3 + STC89C52RC
- * 名稱:智能小車例程
- * 公司:深圳亞博智
- * 編寫:羅工
- * 晶振:11.0592MHZ
- * 說明:免費開源,不提供源代碼分析,有問題直接到交流群交流
- * 硬件設置:要有自己動手能力,進行組裝接線和傳感器靈敏度的調試,才能完成實驗
- * 使用說明:根據下面IO口自己用杜邦線連接各種模塊,可以自己修改各種模塊IO口
- ******************************************************************/
- //按下K4按鍵,1秒左右啟電小車
- //按下復位健可以停止小車
- #include "reg52.h" //包含52系統頭文件
- #include <string.h>
- #include "bst_car.h" //包含bst_car.h智能小車頭文件
- unsigned char pwm_val_left =0;//變量定義
- unsigned char pwm_val_right =0;
- unsigned char push_val_left ;// 左電機占空比N/20 //速度調節變量 0-20。。。0最小,20最大
- unsigned char push_val_right ;// 右電機占空比N/20
- // 大家可以根據循跡效果修改以上兩個數值
- bit Right_PWM_ON=1; //右電機PWM開關
- bit Left_PWM_ON =1; //左電機PWM開關
- bit startBit = 0; //串口接收開始標志位
- bit newLineReceived = 0; //串口一幀協議包接收完成
- unsigned char control=0X03; //車運動控制全局變量
- unsigned char inputString[50]; //接收數據協議
- long int distance = 0; //距離變量
- unsigned int timeH, timeL;
- unsigned char succeed_flag;
- /*小車運行狀態枚舉*/
- enum{
- enSTOP = 0,
- enRUN,
- enBACK,
- enLEFT,
- enRIGHT
- }enCarState;
- #define enMinMin() {push_val_left =20;push_val_right =20;}
- #define enMin() {push_val_left =24;push_val_right =24;}
- #define enMidle() {push_val_left =28;push_val_right =28;}
- #define enMax() {push_val_left =32;push_val_right =32;}
- #define run_car '1'//按鍵前
- #define back_car '2'//按鍵后
- #define left_car '3'//按鍵左
- #define right_car '4'//按鍵右
- #define stop_car '0'//按鍵停
- int g_volume = 0;
- int g_carstate = 0;
- char returntemp[] = "$0,0,0,0,0,0,0,0,0,0,0,0000cm,8.2V#";
- //延時函數
- void delay(unsigned int xms)
- {
- unsigned int i,j;
- for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
- for(j=112;j>0;j--);
- }
- /******************************************************************************/
- /* 函數名稱 : delayt */
- /* 函數描述 : 延時函數 */
- /* 輸入參數 : x */
- /* 參數描述 : 延時時間數據 */
- /* 返回值 : 無 */
- /******************************************************************************/
- void delayt(unsigned int x)
- {
- unsigned char j;
- while(x-- > 0)
- {
- for(j = 0;j < 125;j++)
- {
- ;
- }
- }
- }
- /******************************************************************************/
- /* 函數名稱 : Trig_SuperSonic */
- /* 函數描述 : 發出聲波函數 */
- /* 輸入參數 : 無 */
- /* 參數描述 : 無 */
- /* 返回值 : 無 */
- /******************************************************************************/
- void Trig_SuperSonic(void)//發出聲波
- {
- OUTPUT = 1;
- delayt(1);
- OUTPUT = 0;
- }
- /******************************************************************************/
- /* 函數名稱 : Measure_Distance */
- /* 函數描述 : 計算距離函數 */
- /* 輸入參數 : 無 */
- /* 參數描述 : 無 */
- /* 返回值 : 無 */
- /******************************************************************************/
- long Measure_Distance(void)
- {
- unsigned int time;
- OUTPUT = 0;
- EA = 1;
- T2MOD = 0X00;
- T2CON = 0x00; //定時器12位工作模式 自動重裝
- while(1)
- {
- EA = 0;
- Trig_SuperSonic();
- while(INPUT == 0);
- succeed_flag = 0;
- EA = 1;
- EX0 = 1;
- TH2 = 0;
- TL2 = 0;
- TR2 = 1; //開啟定時器
- delayt(10);
- TR2 = 0;
- EX0 = 0;
- if(succeed_flag == 1)
- {
- time = timeH*256 + timeL;
- distance = time*0.0172;
- return distance;
- }
- else
- {
- distance = 0;
- }
- }
- }
- //前進
- void run(void)
- {
- //push_val_left=5; //速度調節變量 0-20。。。0最小,20最大
- //push_val_right=5;
- Left_moto_go ; //左電機往前走
- Right_moto_go ; //右電機往前走
- }
- //左轉
- void leftrun(void)
- {
- //push_val_left=5;
- //push_val_right=5;
- Right_moto_go ; //右電機往前走
- Left_moto_Stop ; //左電機停止
- // delay(100);
- // Right_moto_Stop; //微信打開注釋
- // delay(100);
- }
- //右轉
- void rightrun(void)
- {
- //push_val_left=5;
- //push_val_right=5;
- Left_moto_go ; //左電機往前走
- Right_moto_Stop ; //右電機往前走
- // delay(100);
- // Left_moto_Stop; //微信打開注釋
- // delay(100);
-
- }
- //后退
- void back(void)
- {
- Left_moto_back ; // 左輪后退
- Right_moto_back ; // 左輪后退
- }
- //停轉
- void stop(void)
- {
- Right_moto_Stop ; //停轉
- Left_moto_Stop ; //
- }
- //左旋轉
- void tleft(void)
- {
- Left_moto_go ; //左電機往前走
- Right_moto_back ; // 左輪后退
- }
- //右旋轉
- void tright(void)
- {
- Left_moto_back ; //左電機往前走
- Right_moto_go ; // 左輪后退
- }
- /************************************************************************/
- // PWM調制電機轉速
- // 左電機調速
- /*調節push_val_left的值改變電機轉速,占空比*/
- void pwm_out_left_moto(void)
- {
- if(Left_PWM_ON)
- {
- if(pwm_val_left<=push_val_left)
- {
- EN1=1;
- }
- else
- {
- EN1=0;
- }
- if(pwm_val_left>=32)
- pwm_val_left=0;
- }
- else
- {
- EN1=0; //若未開啟PWM則EN1=0 左電機 停止
- }
- }
- /******************************************************************/
- /* 右電機調速 */
- void pwm_out_right_moto(void)
- {
- if(Right_PWM_ON)
- {
- if(pwm_val_right<=push_val_right) //20ms內電平信號 111 111 0000 0000 0000 00
- {
- EN2=1; //占空比6:20
- }
- else
- {
- EN2=0;
- }
- if(pwm_val_right>=32)
- pwm_val_right=0;
- }
- else
- {
- EN2=0; //若未開啟PWM則EN2=0 右電機 停止
- }
- }
-
-
- //TIMER0中斷服務子函數產生PWM信號
- void timer0()interrupt 1 using 2
- {
- TH0=0XFC; //1Ms定時
- TL0=0X66;
- pwm_val_left++;
- pwm_val_right++;
- pwm_out_left_moto();
- pwm_out_right_moto();
- }
- void exit0() interrupt 0 // 外部中斷0 超聲波接收
- {
- timeH = TH2;
- timeL = TL2;
- succeed_flag = 1;
- EX0 = 0;
- }
- void timer2() interrupt 5 //定時器2
- {
- TF2 = 0;
- TH2 = 0; //1Ms定時
- TL2 = 0;
- }
- /******************************************************************/
- /* 串口中斷程序*/
- /******************************************************************/
- void UART_SER () interrupt 4
- {
- unsigned char n; //定義臨時變量
- static int num = 0;
- if(RI) //判斷是接收中斷產生
- {
- RI = 0; //標志位清零
- n = SBUF; //讀入緩沖區的值
- //control=n;
- )
- {
- startBit = 1;
- num = 0;
- }
- if(startBit == 1)
- {
- inputString[num] = n;
- }
- if (n == '#')
- {
- newLineReceived = 1;
- startBit = 0;
- }
- num++;
- if(num >= 50)
- {
- num = 0;
- startBit = 0;
- newLineReceived = 0;
- }
- }
- }
- //pwm初始化
- void pwmint(void)
- {
- TMOD=0X01;
- TH0= 0XFC; //1ms定時
- TL0= 0X66;
- TR0= 1;
- ET0= 1;
- EA = 1; //開總中斷
- }
- //WIFI、藍牙初始化
- void WifiInit(void)
- {
-
- SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收
- TMOD |= 0x20;
- TH1=0xfd; //波特率9600 初值
- TL1=0xfd;
- TR1= 1;
- EA = 1; //開總中斷
- ES= 1; //打開串口中斷
- }
- //串口發送函數
- void PutString(unsigned char *TXStr)
- {
- ES=0;
- while(*TXStr!=0)
- {
- SBUF=*TXStr;
- while(TI==0);
- TI=0;
- TXStr++;
- }
- ES=1;
- }
- //主函數
- void main(void)
- {
- P0 = 0X00; //關電機
- P1 = 0xff; //關閉所有LED和風扇
- FIRE = 0;
- pwmint();
- WifiInit();
- while(1) //無限循環
- {
-
- distance = Measure_Distance(); //計算脈寬并轉換為距離
-
- if (newLineReceived)
- {
- switch(inputString[1])
- {
- case run_car: g_carstate = enRUN; break;
- case back_car: g_carstate = enBACK;break;
- case left_car: g_carstate = enLEFT;break;
- case right_car: g_carstate = enRIGHT;break;
- case stop_car: g_carstate = enSTOP;break;
- default:g_carstate = enSTOP;break;
- }
- if(inputString[3] == '1') //左旋轉
- {
- TR0= 1;
- tleft();
- delay(2000);//延時2s
- stop();
- TR0= 0;
- }
- else if(inputString[3] == '2') // 右旋轉
- {
- TR0= 1;
- tright();
- delay(2000);//延時2s
- stop();
- TR0= 0;
- }
- if(inputString[5] == '1') //鳴笛
- {
- FM = 0;
- delay(1000);
- FM = 1;
- }
- if(inputString[7] == '1') //加速
- {
- g_volume++;
- if(g_volume>=4)
- {
- g_volume = 4;
- }
- }
- if(inputString[9] == '1') //減速
- {
- g_volume--;
- if(g_volume<=0)
- {
- g_volume = 1;
- }
- }
- if(inputString[17] == '1') //點燈
- {
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- LED = (LED == 1)?0:1; //反轉電平
- delay(200);//延時2s
- }
-
- if(inputString[19] == '1') //滅火
- {
- FIRE = (FIRE == 1)?0:1;
- }
-
- //返回狀態
- //組裝超聲波數據
- returntemp[23] = (distance / 1000) + 0x30;
- returntemp[24] = (distance / 100 % 10) + 0x30;
- returntemp[25] = (distance / 10 % 10) + 0x30;
- returntemp[26] = (distance % 10 ) + 0x30;
- PutString(returntemp); //返回協議數據包
-
- newLineReceived = 0;
- memset(inputString, 0x00, sizeof(inputString));
-
- }
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (51.38 KB, 下載次數: 72)
下載附件
2018-6-12 03:26 上傳
所有資料51hei提供下載:
51智能小車藍牙遙控.zip
(4.39 MB, 下載次數: 142)
2018-6-11 22:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|