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