|
藍(lán)牙控制小車單片機(jī)代碼,帶尋跡 避障等功能的整合版,51hei提供下載.
0.png (109.66 KB, 下載次數(shù): 128)
下載附件
2017-4-12 17:22 上傳
0.png (51.79 KB, 下載次數(shù): 102)
下載附件
2017-4-12 17:22 上傳
單片機(jī)源代碼:
- /****************************************************************************
- 藍(lán)牙控制程序:
- P1_0 接前進(jìn)
- P1_1 接后退
- P1_2 接左轉(zhuǎn)
- P1_3 接右轉(zhuǎn)
- 插入藍(lán)牙模塊:
- 晶振:11.0592M晶振
- ****************************************************************************/
- #include<AT89x52.H>
- #include <intrins.h>
- //#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左邊兩個(gè)電機(jī)向前走
- //#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個(gè)電機(jī)向后轉(zhuǎn)
- //#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左邊兩個(gè)電機(jī)停轉(zhuǎn)
- //#define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊兩個(gè)電機(jī)向前走
- //#define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊兩個(gè)電機(jī)向前走
- //#define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊兩個(gè)電機(jī)停轉(zhuǎn)
- #define TRIG0 P3_4 //右超聲波接口定義
- #define ECHO0 P3_5 //右超聲波接口定義
- #define TRIG1 P2_4 //中超聲波接口定義
- #define ECHO1 P2_5 //中超聲波接口定義
- #define TRIG2 P2_6 //左超聲波接口定義
- #define ECHO2 P2_7 //左超聲波接口定義
- #define TRIG3 P3_6 //后超聲波接口定義
- #define ECHO3 P3_7 //后超聲波接口定義
- #define Infrared_4 P1_7 //紅外輸出信號(hào)接口定義
- #define Infrared_6 P1_6 //紅外輸出信號(hào)接口定義
- //#define Sevro_moto_pwm P2_7 //接舵機(jī)信號(hào)端輸入PWM信號(hào)調(diào)節(jié)速度
- //#define Left_1_led P3_4 //P3_2接四路尋跡模塊接口第一路輸出信號(hào)即中控板上面標(biāo)記為OUT1
- //#define Left_2_led P3_5 //P3_3接四路尋跡模塊接口第二路輸出信號(hào)即中控板上面標(biāo)記為OUT2
- //#define Right_1_led P3_6 //P3_4接四路尋跡模塊接口第三路輸出信號(hào)即中控板上面標(biāo)記為OUT3
- //#define Right_2_led P3_7 //P3_5接四路尋跡模塊接口第四路輸出信號(hào)即中控板上面標(biāo)記為OUT4
- #define up 'A' //前進(jìn)
- #define down 'B' //后退
- #define left 'C' //左轉(zhuǎn)
- #define right 'D' //右轉(zhuǎn)
- #define stop 'F' //停止
- #define gear 'G' //擋位
- #define BrakeH 'H' //開制動(dòng)
- #define BrakeI 'I' //關(guān)制動(dòng)
- #define swrst 'S' //軟件復(fù)位
- //char code str[] = "收到指令,向前!\n";
- //char code str1[] = "收到指令,向后!\n";
- //char code str2[] = "收到指令,向左!\n";
- //char code str3[] = "收到指令,向右!\n";
- //char code str4[] = "收到指令,停止!\n";
- unsigned char const discode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
- //unsigned char const positon[3]= { 0xfe,0xfd,0xfb};
- unsigned char disbuff[3] = { 0,0,5};
- unsigned char swbuffer[5][4] = {{0,0,0,0},{1,4,5,0},{2,0,0,0},{3,0,0,0},{4,0,0,5}};//超聲波0、1、2、3,是否開自動(dòng)停止4-1,(默認(rèn)0關(guān))角度:4-2/3
- //unsigned char tswbuffer[5][4] = {{'1','1','1','1'},{'2','2','2','2'},{'3','3','3','3'},{'4','4','4','4'},{'5','5','5','5'}};
- //unsigned char code str[] = "www.mucstudio.com.cn\r\n";
- char angle = 5; //角度初始化
- unsigned int dynamic_distance = 1; //初始化前動(dòng)態(tài)距離
- unsigned int dynamic_distance_down = 1;//初始化后動(dòng)態(tài)距離
- //unsigned char pwm_val_left = 0;//變量定義
- //unsigned char push_val_left =13;//舵機(jī)歸中,產(chǎn)生約,1.5MS 信號(hào)
- unsigned int time=0; //時(shí)間變量
- unsigned int timer1=0; //時(shí)間變量
- unsigned int timer=0; //延時(shí)基準(zhǔn)變量
- unsigned int anglecenter = 0; //方向校正計(jì)數(shù)歸0
- unsigned int sw[4] = {450,450,450,450}; //超聲波距離值
- //unsigned long S=0; //計(jì)算出超聲波距離值
- //unsigned long S1=0;
- //unsigned long S2=0;
- //unsigned long S3=0;
- //unsigned long S4=0;
- bit flag_REC=0; //串口接收完成標(biāo)志位
- bit flag =0; //持續(xù)接收標(biāo)志位
- //bit flag_xj =0;
- //bit flag_bj =0;
- unsigned char t=0;
- unsigned char dat=0;
- unsigned char buff[5]=0; //接收緩沖字節(jié);
- unsigned char posit = 0;
- /************************************************************************/
- //函數(shù)聲明
- void delay(unsigned int); //延時(shí)函數(shù)
- //void brakeup(void); //前進(jìn)緊急制動(dòng)
- //void brakedown(void); //后退緊急制動(dòng)
- void run(void); //前進(jìn)
- void backrun(void); //后退
- void leftrun(void); //左轉(zhuǎn)
- void rightrun(void); //右轉(zhuǎn)
- void stoprun(void); //前后停止
- void gearrun(void); //擋位:1、2、3(循環(huán))
- void swrstrun(void); //軟件復(fù)位
- void stoplr(void); //停止左右轉(zhuǎn)動(dòng)
- void brakeh(void); //開自動(dòng)制動(dòng)
- void brakei(void); //關(guān)自動(dòng)制動(dòng)
- void startModule(int); //啟動(dòng)超聲波測距信號(hào)
- int conut(int); //計(jì)算距離
- void send_str(void); //數(shù)據(jù)發(fā)送
- void Display(void); //數(shù)碼管顯示
- void Loaddata(void); //啟動(dòng)超聲波測距,計(jì)算距離,載入buffer
- void control(void); //解析控制指令并執(zhí)行
- void time1(void); //TIMER1中斷服務(wù)子函數(shù)interrupt 3
- void receive(void); //中斷接收3個(gè)字節(jié),串行口中斷 interrupt
- void Init(void); //初始化
- void main(void); /*--主函數(shù)--*/
- /************************************************************************/
- /*********************************************************************/
- /*--主函數(shù)--*/
- void main(void)
- {
- // _nop_();
- // delay(500);
- // _nop_();
- Init(); //初始化
- // P1_0 = 0;
- // P1_1 = 0;
- // P1_2 = 0;
- // P1_3 = 0;
- // delay(200);
- // P1_0 = 1;
- // P1_1 = 1;
- // P1_2 = 1;
- // P1_3 = 1;
- // delay(100);
- // push_val_left=13; //舵機(jī)歸中
- //ISP_CONTR=00100000B,SWBS=0(選擇AP區(qū)),SWRST=1(軟件復(fù)位)
- while(1) /*無限循環(huán)*/
- {
- // Loaddata(); //數(shù)據(jù)采集
- // send_str(); //數(shù)據(jù)發(fā)送
- Display(); //顯示1號(hào)距離
- }
- }
- // while(flag_xj) //循線標(biāo)志位
- // {
- // if(flag_REC==1)
- // {
- // stoprun();
- // break;
- // }
- // //有信號(hào)為0 沒有信號(hào)為1
- // if(Left_2_led==0&&Right_1_led==0)
- // run();
- // else
- // {
- // if(Right_1_led==1&&Left_2_led==0) //右邊檢測到黑線
- // {
- // Left_moto_go; //左邊兩個(gè)電機(jī)正轉(zhuǎn)
- // Right_moto_back; //右邊兩個(gè)電機(jī)反轉(zhuǎn)
- // }
- // if(Left_2_led==1&&Right_1_led==0) //左邊檢測到黑線
- // {
- // Right_moto_go; //右邊兩個(gè)電機(jī)正轉(zhuǎn)
- // Left_moto_back; //左邊兩個(gè)電機(jī)反式開始轉(zhuǎn)
- // }
- // }
- // }
- // while(flag_bj) /*無限循環(huán)*/
- // {
- // if(timer>=1000) //100MS檢測啟動(dòng)檢測一次
- // {
- // timer=0;
- // StartModule(); //啟動(dòng)檢測
- // Conut(); //計(jì)算距離
- // if(S<20) //距離小于20CM
- // {
- // stoprun(); //小車停止
- // COMM(); //方向函數(shù)
- // }
- // else if(S>30) //距離大于,30CM往前走
- // run();
- // }
- // if(flag_REC==1)
- // {
- // push_val_left=13; //舵機(jī)歸中
- // stoprun();
- // break;
- // }
- // }
- //延時(shí)函數(shù)
- void delay(unsigned int k) //延時(shí)1.00043ms
- {
- unsigned int x,y;
- for(x=0; x<k; x++)
- for(y=0; y<111; y++);
- _nop_();
- _nop_();
- _nop_();
- }
- /************************************************************************/
- //機(jī)動(dòng)單元
- //void brakeup(void) //緊急制動(dòng)
- //{
- // if((sw[1] <= 40)||(sw[0] <= 30)||(sw[2] <=30))
- // {
- // P1_0 = 1; //靜止前進(jìn)
- // P1_1 = 0;
- // }
- //}
- //void brakedown(void)
- //{
- // if(sw[3] <= 50) //檢測前制動(dòng)
- // {
- // P1_1 = 1; //靜止后退
- // P1_0 = 0;
- // }
- //}
- void run(void) //前進(jìn)
- {
- if(swbuffer[4][1] == 0) //是否開動(dòng)態(tài)制動(dòng),0為關(guān)
- {
- P1_0 = 0;
- timer = 0;
- }
- else
- {
- if((sw[1] <= dynamic_distance*30)||(sw[0] <= (dynamic_distance*20))||(sw[2] <= (dynamic_distance*20))) //檢測距離||(sw[0] <= (dynamic_distance*25))||(sw[2] <= (dynamic_distance*25))
- {
- P1_0 = 1; //靜止前進(jìn)
- delay(150);
- if(--dynamic_distance <= 1) //重置動(dòng)態(tài)距離
- dynamic_distance = 1;
- }
- else
- {
- P1_0 = 0;
- timer = 0; //中斷停止計(jì)數(shù)值歸0
- dynamic_distance = dynamic_distance + 1;
- if(dynamic_distance >= 4)
- dynamic_distance = 4;
- }
- }
- // brakeup();
- }
- void backrun(void) //后退
- {
- if(swbuffer[4][1] == 0) //是否開動(dòng)態(tài)制動(dòng),0為關(guān)
- {
- P1_1 = 0;
- timer = 0;
- }
- else
- {
- if(sw[3] <= dynamic_distance_down*30) //檢測后超聲波數(shù)據(jù)
- {
- P1_1 = 1; //靜止后退
- delay(150);
- if(--dynamic_distance_down <= 1) //重置動(dòng)態(tài)距離
- dynamic_distance_down = 1;
- }
- else
- {
- P1_1 = 0;
- timer = 0; //中斷停止計(jì)數(shù)值歸0
- if(++dynamic_distance_down >= 4)
- dynamic_distance_down = 4;
- }
- }
- // brakedown();
- }
- void leftrun(void) //左轉(zhuǎn)
- {
- P1_2 = 0;
- // P1_3 = 1;
- // if(Infrared == 0)
- // angle = 5;
- if(--angle == -1) //角度左校正
- angle = 0;
- // angle = (--angle == -1) ? 0 : angle;
- anglecenter = 0; //中校正歸0
- }
- void rightrun(void) //右轉(zhuǎn)
- {
- P1_3 = 0;
- // P1_2 = 1;
- // if(Infrared == 0)
- // angle = 5;
- // else
- if(++angle == 11) //角度右校正
- angle = 10;
- // angle = (++angle == 11) ? 10 : angle;
- anglecenter = 0; //中校正歸0
- }
- void stoprun(void) //前后停止
- {
- P1_0 = 1;
- P1_1 = 1;
- dynamic_distance = 1; //重置動(dòng)態(tài)距離
- dynamic_distance_down = 1;
- }
- void gearrun(void) //擋位:1、2、3(循環(huán))
- {
- P1_5 = 0;
- _nop_();
- P1_5 = 1;
- }
- void swrstrun(void) //軟件復(fù)位
- {
- ISP_CONTR=0x20;
- // ISP_CONTR=0x60;
- }
- void stoplr(void) //停止左右轉(zhuǎn)動(dòng)
- {
- P1_2 = 1;
- P1_3 = 1;
- }
- void brakeh(void)
- {
- swbuffer[4][1] = 1; //1為開動(dòng)態(tài)制動(dòng)
- }
- void brakei(void)
- {
- swbuffer[4][1] = 0; //0為關(guān)動(dòng)態(tài)制動(dòng)
- }
- /************************************************************************/
- void startModule(int i) //啟動(dòng)測距信號(hào)
- {
- if(i == 0)
- TRIG0 = 1;
- else if(i == 1)
- TRIG1 = 1;
- else if(i == 2)
- TRIG2 = 1;
- else if(i == 3)
- TRIG3 = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- if(i == 0)
- TRIG0 = 0;
- else if(i == 1)
- TRIG1 = 0;
- else if(i == 2)
- TRIG2 = 0;
- else if(i == 3)
- TRIG3 = 0;
- }
- /***************************************************/
- //計(jì)算距離
- int conut(int i)
- {
- int S0 = 0;
- unsigned int chaoshi = 0;
- if(i == 0)
- while(!ECHO0) //當(dāng)RX為零時(shí)等待
- {
- // chaoshi=TH1*256+TL1;
- // if(chaoshi >26571) //超時(shí)彈出
- // break;
- }
- else if(i == 1)
- while(!ECHO1)
- {
- // chaoshi=TH1*256+TL1;
- // if(chaoshi >26571) //超時(shí)彈出
- // break;
- }
- else if(i == 2)
- while(!ECHO2)
- {
- // chaoshi=TH1*256+TL1;
- // if(chaoshi >26571) //超時(shí)彈出
- // break;
- }
- else if(i == 3)
- while(!ECHO3)
- {
- // chaoshi=TH1*256+TL1;
- // if(chaoshi >26571) //超時(shí)彈出
- // break;
- }
- TR0=1; //開啟計(jì)數(shù)0
- if(i == 0)
- while(ECHO0) //當(dāng)RX為1計(jì)數(shù)并等待
- {
- // if(++chaoshi >40000)
- // break;
- }
- else if(i == 1)
- while(ECHO1)
- {
- // if(++chaoshi >40000) //超時(shí)彈出
- // break;
- }
- else if(i == 2)
- while(ECHO2)
- {
- // if(++chaoshi >40000) //超時(shí)彈出
- // break;
- }
- else if(i == 3)
- while(ECHO3)
- {
- // if(++chaoshi >40000) //超時(shí)彈出
- // break;
- }
- TR0=0; //關(guān)閉計(jì)數(shù)0
- time=TH0*256+TL0; //讀取脈寬長度單位0.1MS
- TH0=0;
- TL0=0;
- if(chaoshi >40000) //超時(shí)彈出
- {
- S0 = sw[i]; //使用上次值
- }
- else
- S0 = ((time*1.7)/100);
- if(i == 1)
- {
- disbuff[0]=S0%1000/100; //更新顯示距離
- disbuff[1]=S0%1000%100/10;
- disbuff[2]=S0%1000%10 %10;
- // disbuff[0]=angle%1000/100; //更新顯示方向角
- // disbuff[1]=angle%1000%100/10;
- // disbuff[2]=angle%1000%10 %10;
- }
- return S0; //算出來是CM
- }
- /************************************************************************/
- //數(shù)據(jù)發(fā)送函數(shù)
- //void send_str()
- // // 傳送字串
- // {
- // char i = 0;
- // while(i<=9)
- // {
- // SBUF = 0x10;//0x31
- // while(!TI); // 等特?cái)?shù)據(jù)傳送
- // TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- // SBUF = '\n';//0x31
- // while(!TI); // 等特?cái)?shù)據(jù)傳送
- // TI = 0;
- // i++; // 下一個(gè)字符
- // }
- // }
- // void send(short int dat)
- //{
- //SBUF = dat>>8;
- //while(TI == 0);
- //TI = 0;
- //SBUF=dat &0XFF;
- //while(TI == 0);
- //TI = 0;
- //}
- void send_str(void)
- {
- int x = 0;
- // unsigned char k = 0;
- // SBUF = '\n'; //一幀數(shù)據(jù)開始標(biāo)志
- // while(!TI); // 等特?cái)?shù)據(jù)傳送
- // TI = 0;
- while(x <= 4)
- {
- int y = 0;
- while(y <= 3)
- {
- SBUF = swbuffer[x][y];
- // SBUF = k;
- while(!TI); // 等特?cái)?shù)據(jù)傳送
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- y++;
- }
- x++; // 下一個(gè)字符
- }
- SBUF = '\n'; //一幀數(shù)據(jù)完成標(biāo)志
- while(!TI); // 等特?cái)?shù)據(jù)傳送
- TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- // SBUF = '\r'; //一幀數(shù)據(jù)完成標(biāo)志
- // while(!TI); // 等特?cái)?shù)據(jù)傳送
- // TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- // SBUF = 0x0d; //一幀數(shù)據(jù)完成標(biāo)志
- // while(!TI); // 等特?cái)?shù)據(jù)傳送
- // TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
- }
- ///************************************************************************/
- //數(shù)碼管顯示
- void Display(void)
- {
- if(posit==0)
- {
- P0=(discode[disbuff[posit]])&0x7f; //+產(chǎn)生點(diǎn)
- P2_1=0;
- P2_2=1;
- P2_3=1;
- }
- else if(posit==1)
- {
- P0=discode[disbuff[posit]];
- P2_1=1;
- P2_2=0;
- P2_3=1;
- }
- else if(posit==2)
- {
- P0=discode[disbuff[posit]];
- P2_1=1;
- P2_2=1;
- P2_3=0;
- }
- P2_1=1;
- P2_2=1;
- P2_3=1;
- posit++;
- if(posit == 3)
- posit = 0;
- }
- /************************************************************************/
- //啟動(dòng)超聲波測距,計(jì)算距離,載入buffer
- void Loaddata(void)
- {
- unsigned int i= 0;
- while(i <= 4)
- {
- if(i <= 3)
- {
- startModule(i); //啟動(dòng)超聲波測距
- sw[i] = conut(i); //計(jì)算距離
- swbuffer[i][1]= sw[i]%1000/100; //載入buffer
- swbuffer[i][2]= sw[i]%1000%100/10;
- swbuffer[i][3]= sw[i]%1000%10 %10;
- }
- else if(i == 4)
- {
- // swbuffer[i][1]= angle%1000/100; //載入buffer
- swbuffer[i][2]= angle%1000%100/10;
- swbuffer[i][3]= angle%1000%10 %10;
- }
- i++;
- }
- // push_val_left=5; //舵機(jī)向左轉(zhuǎn)90度
- // timer=0;
- // while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
- // StartModule(); //啟動(dòng)超聲波測距
- // Conut(); //計(jì)算距離
- // S2=S;
- // push_val_left=23; //舵機(jī)向右轉(zhuǎn)90度
- // timer=0;
- // while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
- // StartModule(); //啟動(dòng)超聲波測距
- // Conut(); //計(jì)算距離
- // S4=S;
- // push_val_left=13; //舵機(jī)歸中
- // timer=0;
- // while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
- // StartModule(); //啟動(dòng)超聲波測距
- // Conut(); //計(jì)算距離
- // S1=S;
- // if((S2<20)||(S4<20)) //只要左右各有距離小于,20CM小車后退
- // {
- // backrun(); //后退
- // timer=0;
- // while(timer<=4000);
- // }
- // if(S2>S4)
- // {
- // rightrun(); //車的左邊比車的右邊距離小 右轉(zhuǎn)
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
下載:
20.藍(lán)牙控制小車 尋跡 避障整合版.zip
(99.94 KB, 下載次數(shù): 80)
2017-4-12 17:06 上傳
點(diǎn)擊文件名下載附件
單片機(jī)代碼 下載積分: 黑幣 -5
|
|