|
超聲波避障+藍(lán)牙遙控智能小車
d192dfc28401514fcb0d5f6f0871f0f.png (94.82 KB, 下載次數(shù): 99)
下載附件
2018-5-12 14:57 上傳
單片機(jī)源程序如下:
- #include<reg52.h>
- #include <intrins.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- sbit Sevro_moto_pwm = P2^6; //接舵機(jī)信號(hào)端輸入PWM信號(hào)調(diào)節(jié)速度
- sbit ECHO= P1^1; //超聲波接口定義
- sbit TRIG= P1^0; //超聲波接口定義
- sbit PWM1 = P2^5; //左電機(jī)高電平
- sbit PWM2 = P2^4; //右電機(jī)高電平
- sbit IN1 = P2^3;
- sbit IN2 = P2^2; //左電機(jī)
- sbit IN3 = P2^1;
- sbit IN4 = P2^0; //右電機(jī)
- sbit A1 = P1^4; //左紅外避障模塊
- sbit A2 = P2^7; //右紅外避障模塊
- //sbit A3 = P1^2; //左紅外尋跡模塊
- //sbit A4 = P1^3; //右紅外尋跡模塊
- sbit K1 = P3^2; //功能轉(zhuǎn)換按鍵
- sbit K2 = P3^3; //加速鍵
- sbit K3 = P3^4; //減速鍵
- u8 connt; //調(diào)速周期
- u8 PWM_NO; //高電平時(shí)間
- u8 a=0,c=0; //標(biāo)志位
- u8 COM;
- u8 pwm_val_left = 0;//變量定義
- u8 push_val_left ;//舵機(jī)歸中,產(chǎn)生約,1.5MS 信號(hào)
- u32 S=0; //距離變量定義
- u32 S1=0;
- u32 S2=0;
- u32 S3=0;
- u32 S4=0;
- u16 time=0; //時(shí)間變量
- u16 timer=0; //延時(shí)基準(zhǔn)變量
- u8 non=0,t=0;
- u8 pon=3; //數(shù)碼管顯示
- u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};//顯示0~9的值
-
- /************************************************************************/
- void delay(u16 k) //延時(shí)函數(shù)
- {
- u16 x,y;
- for(x=0;x<k;x++)
- for(y=0;y<2000;y++);
- }
- void delay1(u16 j) //延時(shí)函數(shù)
- {
- u16 x,y;
- for(x=0;x<j;x++)
- for(y=0;y<120;y++);
- }
- /************************************************************************/
- void Display(void) //掃描數(shù)碼管
- {
- P0=smgduan[pon];
- if(K2==0) // 加速
- {
- delay1(10);
- if(K2==0)
- {
- pon++;
- PWM_NO--;
- }
- while(!K2); //松鍵檢測(cè)
- }
- if(K3==0) //減速
- {
- delay1(10);
- if(K3==0)
- {
- pon--;
- PWM_NO++;
- }
- while(!K3);
- }
- }
- void SC() //剎車
- {
- IN1 = 0;
- IN2 = 0;
- IN3 = 0;
- IN4 = 0;
- }
- void QJ() //前進(jìn)
- {
- IN1 = 1;
- IN2 = 0;
- IN3 = 1;
- IN4 = 0;
- }
- void HT() //后退
- {
- IN1 = 0;
- IN2 = 1;
- IN3 = 0;
- IN4 = 1;
- }
- void ZZ1() //左大轉(zhuǎn)
- {
- IN1 = 0;
- IN2 = 1;
- IN3 = 1;
- IN4 = 0;
- }
- void YZ1() //右大轉(zhuǎn)
- {
- IN1 = 1;
- IN2 = 0;
- IN3 = 0;
- IN4 = 1;
- }
- /************************************************************************/
- void StartModule() //啟動(dòng)測(cè)距信號(hào)
- {
- TRIG=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- TRIG=0;
-
- }
- void InitUART(void) //串口中斷初始化函數(shù)
- {
- SCON=0x50; //設(shè)置為工作方式1
- TMOD=0x20; //設(shè)置計(jì)數(shù)器工作方式2
- PCON=0x00; //波特率不加倍
- TH1=0xfd; //計(jì)數(shù)器初始值設(shè)置,注意波特率是9600的
- TL1=0xfd;
- ES=1; //打開接收中斷
- EA=1; //打開總中斷
- TR1=1; //打開計(jì)數(shù)器
-
- }
- /***************************************************/
- void Conut(void) //計(jì)算距離
- {
- while(!ECHO); //當(dāng)RX為零時(shí)等待
- TR1=1; //開啟計(jì)數(shù)
- while(ECHO); //當(dāng)RX為1計(jì)數(shù)并等待
- TR1=0; //關(guān)閉計(jì)數(shù)
- time=TH1*256+TL1; //讀取脈寬長(zhǎng)度
- TH1=0;
- TL1=0;
- S=(time*1.7)/100; //算出來是CM
-
- }
- /************************************************************************/
- void COMM( void )
- {
-
- push_val_left=23; //舵機(jī)向左轉(zhuǎn)90度
- timer=0;
- while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置 4000
- StartModule(); //啟動(dòng)超聲波測(cè)距
- Conut(); //計(jì)算距離
- S2=S;
-
- push_val_left=5; //舵機(jī)向右轉(zhuǎn)90度
- timer=0;
- while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
- StartModule(); //啟動(dòng)超聲波測(cè)距
- Conut(); //計(jì)算距離
- S4=S;
-
- push_val_left=14; //舵機(jī)歸中
- timer=0;
- while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
- StartModule(); //啟動(dòng)超聲波測(cè)距
- Conut(); //計(jì)算距離
- S1=S;
- if((S2<20)||(S4<20)||(S1<20)) //只要左右各有距離小于,20CM小車后退
- {
- HT(); //后退
- timer=0;
- while(timer<=4000);
- }
- if((S2<20)&&(S4<20)&&(S1<20)) //只要左右各有距離小于,20CM小車后退
- {
- HT(); //后退
- timer=0;
- while(timer<=4000);
- }
-
- if(S2>S4)
- {
- ZZ1(); //車的左邊比車的右邊距離小 右轉(zhuǎn)
- timer=0;
- while(timer<=4000);
- }
- else
- {
- YZ1(); //車的左邊比車的右邊距離大 左轉(zhuǎn)
- timer=0;
- while(timer<=4000);
- }
-
-
- }
- /************************************************************************/
- /* PWM調(diào)制舵機(jī)轉(zhuǎn)速 */
- /************************************************************************/
- /* 舵機(jī)調(diào)速 */
- /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比 */
- void pwm_Servomoto(void)
- {
-
- if(pwm_val_left <= push_val_left)
- Sevro_moto_pwm=1;
- else
- Sevro_moto_pwm=0;
- if(pwm_val_left>=100)
- pwm_val_left=0;
-
- }
- void minm() //按鈕控制功能轉(zhuǎn)換
- {
- COM=0;
- if(K1==0)
- {
- delay1(10);
- if(K1==0)
- {
- COM++;
- }
- while(!K1);
- }
- if(COM==4)
- COM=0;
- }
- /***************************************************/
- ///*TIMER1中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/
- void time0()interrupt 1
- {
-
- TH0=(65536-100)/256; //100US定時(shí)
- TL0=(65536-100)%256;
- timer++; //定時(shí)器100US為準(zhǔn)。在這個(gè)基礎(chǔ)上延時(shí)
- pwm_val_left++;
- pwm_Servomoto();
- t++;
- if(t==5) //PWM調(diào)制左右電機(jī)速度
- {
- t=0;
- non++;
- }
- if( non == PWM_NO )
- {
- PWM1 = 1;
- PWM2 = 1;
- }
- if( non == connt )
- {
- non = 0;
- if( PWM_NO != 0)
- {
- PWM1 = 0;
- PWM2 = 0;
- }
- }
- }
- void lin() //避障功能
- {
- if(timer>=1000) //100MS檢測(cè)啟動(dòng)檢測(cè)一次 1000
- {
- timer=0;
- StartModule(); //啟動(dòng)檢測(cè)
- Conut(); //計(jì)算距離
- if(S<=25) //距離小于30CM
- {
- SC(); //小車停止
- COMM(); //方向函數(shù)
- }
- else
- if(S>25) //距離大于,30CM往前走
- QJ();
- if(!A1)
- {
- SC();
- delay1(20);
- HT();
- delay1(300);
- SC();
- COMM();
- }
- if(!A2)
- {
- SC();
- delay1(20);
- HT();
- delay1(300);
- SC();
- COMM();
- }
- }
-
- }
- /***************************************************/
- ///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)*/
- void timer0()interrupt 3
- {
-
- }
- /***************************************************/
- void UARTInterrupt(void) interrupt 4 //串口中斷函數(shù)
- {
- unsigned char com;
- if(a==1) //判斷能否執(zhí)行
- {
- if(RI==1)
- com = SBUF; //暫存接收到的數(shù)據(jù)
- RI=0;
- }
- P0=smgduan[pon];
- switch(com) //接收到字符并要執(zhí)行的功能
- {
- case 0: QJ();break;
- case 1: SC();break;
- case 2: ZZ1();break;
- case 3: YZ1();break;
- case 4: HT();break;
- case 5: pon++;PWM_NO--;break;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
Keil代碼下載:
超聲波避障 藍(lán)牙遙控智能小車.rar
(40.42 KB, 下載次數(shù): 567)
2018-5-12 14:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|