(1)、手機APP控制,無線藍牙控制 (2)、自動避障,遇到障礙物自動躲避 (3)、帶剎車燈,轉向燈,和倒車蜂鳴器提示 (4) 、帶兩個自由度的機械手
制作出來的實物圖如下:
IMG_20180824_115936.jpg (4.3 MB, 下載次數: 22)
下載附件
小車正面
2019-2-20 16:35 上傳
IMG_20180824_115941.jpg (4.83 MB, 下載次數: 30)
下載附件
小車前面
2019-2-20 16:35 上傳
IMG_20180824_115947.jpg (4.79 MB, 下載次數: 27)
下載附件
小車后面
2019-2-20 16:35 上傳
單片機代碼: #include <reg52.h>
sbit Servo=P0^0;
sbit IN1=P1^2; sbit IN2=P1^3; sbit IN3=P1^4; sbit IN4=P1^5;
sbit LLED=P2^0; sbit RLED=P2^1; sbit SLED=P2^4; sbit BUZZER=P2^5; sbit PWM1=P2^6; sbit PWM2=P2^7;
sbit INT_0=P3^2; sbit INT_1=P3^3;
#define Left_led { LLED=0;} //左轉向燈 #define Right_led { RLED=0;} //右轉向燈 #define Stop_led { SLED=0;} //剎車燈
#define SLeft_led { LLED=1;} //停左轉向燈 #define SRight_led { RLED=1;} //停右轉向燈 #define SStop_led { SLED=1;} //停剎車燈
#define Left_moto_go {IN1=0,IN2=1;} //左邊兩個電機向前走 #define Left_moto_back {IN1=1,IN2=0;} //左邊兩個電機向后轉 #define Left_moto_Stop {IN1=0,IN2=0;} //左邊兩個電機停轉 #define Right_moto_go {IN3=1,IN4=0;} //右邊兩個電機向前走 #define Right_moto_back {IN3=0,IN4=1;} //右邊兩個電機向后走 #define Right_moto_Stop {IN3=0,IN4=0;} //右邊兩個電機停轉 #define SBUZZER {BUZZER=0;} //蜂鳴器響 #define SSBUZZER {BUZZER=1;} //蜂鳴器不響
#define uchar unsigned char #define unit unsigned int
bit bdata gbFlag;
unsigned char i=0; unsigned char dat; unsigned char time1; unsigned char time2; char num1=0,dis1=1; char num2=0,dis2=1; void delay(unsigned int z); void delay_us(unsigned int aa);
/************************************************************************/ /*--延時函數--*/ void delay(unsigned int k) { unsigned int x,y; for(x=0;x<k;x++) for(y=0;y<2000;y++); }
/************************************************************************/ /*--功能定義函數--*/
//剎車 void stoprun(void) {
Left_moto_Stop ; //左電機STOP Right_moto_Stop ; //右電機STOP } //剎車燈 void stopled(void) {
Stop_led; delay(10); SStop_led; }
//前進 void run(void) {
Left_moto_go ; //左電機往前走 Right_moto_go ; //右電機往前走 delay(20); stoprun();
}
//后退 void backrun(void) {
Left_moto_back ; //左電機往后退 Right_moto_back ; //右電機往后退 SBUZZER; Stop_led; delay(20); SSBUZZER; SStop_led; stoprun(); }
//左轉 void leftrun(void) {
Left_moto_back ; //左電機往后走 Right_moto_go ; //右電機往前走 delay(10); stoprun(); } //左轉向燈 void leftled(void) {
Left_led ; //左轉向燈開 delay(5); SLeft_led; //左轉向燈關 delay(5); }
//右轉 void rightrun(void) {
Left_moto_go ; //左電機往前走 Right_moto_back ; //右電機往后走 delay(10); stoprun(); } //右轉向燈 void rightled(void) {
Right_led ; //右轉向燈開 delay(5); SRight_led; //右轉向燈關 delay(5); } /*********************************************************************/ /*--scan1函數--*/ void scan1() //如果收到01,則X舵機加 { if(gbFlag) //如果為1,則PWM+ { //num1++; if(num1>=60) num1=60; else num1++; dis1=num1; leftled(); } else //否則PWM- { //num1--; if(num1<=0) num1=0; else num1--; dis1=num1; rightled(); } }
/*********************************************************************/ /*--scan2函數--*/ //void scan2() //{ //if(gbFlag) //如果收到07,則Y舵機加 // { // num2++; // if(num2>=60) // num2=60; // dis2=num2; // } // else // { num2--; // if(num2<=0) // num2=0; // dis2=num2; // } //} void scan2() //如果收到03,則Y舵機加 { if(gbFlag) //如果為1,則PWM+ { //num1++; if(num2>=60) num2=60; else num2++; dis2=num2; leftled(); } else //否則PWM- { //num1--; if(num2<=0) num2=0; else num2--; dis2=num2; rightled(); } }
/*********************************************************************/ /*--choose1函數--*/ void choose1(void) {
Servo=0; //舵機關
} /*********************************************************************/ /*--choose2函數--*/ void choose2(void) {
Servo=1; //舵機開
}
/*********************************************************************/ /*--主函數--*/ void main() {
PS=1; //中斷優先級T0,T2低 PX0=1; PX1=1; PT0=0; PT2=0;
TMOD=0x21; //設置定時器1為方式2,定時器0工作方式1 TH0=(65536-50)/256; //0xff; //(65536-1000)/256; //賦初值定時 TL0=(65536-50)%256; //0xf7; //(65536-1000)%256; //0.01ms TH1=0xfd; //11.0592M晶振,9600波特率 TL1=0xfd; //裝初值 RCAP2H=(65536-50)/256; //0xff; //(65536-10)/256;//賦初值定時 RCAP2L=(65536-50)%256; //0xf7; //(65536-10)%256;//0.01ms TH2=RCAP2H; // TL2=RCAP2L; //賦初值定時
TR1=1; //啟動定時器 REN=1; //使能接收 SM0=0; SM1=1; //設置串口為工作方式1 EA=1; //打開總中斷開關 ES=1; //打開串口中斷開關 ET0=1; //開定時器0中斷 ET2=1; //開定時器2中斷 TR0=1; //啟動定時器0 TR2=1; //啟動定時器2
EX0=1; //允許INT0中斷 EX1=1; //允許INT1中斷 IT0=1; //外中斷0邊沿觸發 IT1=1; //外中斷1邊沿觸發 while(1) ; //等待中斷
} /*********************************************************************/ /*--返回數據函數--*/ //void putchar (unsigned char c) //{ // SBUF=c; // while(TI==0); //等待發送完成 // TI=0; //清除TI標志準備下一次發送
//} // void main() // { // init(); // while(1) // { // if(R_sign) // { // putchar(dat); //將接受到的字符發回 // R_sign=0; // }
// } // // } //
/*********************************************************************/ /*--避障函數--*/ void int0(void) interrupt 0 using 1 //外中斷0服務子函數 { backrun(); //后退 while(INT_0==0) //還在障礙物范圍內繼續后退 backrun();
} void int1(void) interrupt 2 using 1 //外中斷1服務子函數 {
run(); //后退 while(INT_1==0) //還在障礙物范圍內繼續后退 run();
} /*********************************************************************/ /*--PWM1函數--*/ void timer0()interrupt 1 using 2 { TR0=1; //打開定時器0 TH0=(65536-50)/256; //0xff; //(65536-1000)/256;//賦初值定時 TL0=(65536-50)%256; //0xf7; //(65536-1000)%256;//0.05ms
TR0=0; //關閉定時器0 TR2=1; //打開定時器2 time1++; if(time1>=100)time1=0;//5KHZ if(time1<=dis1)PWM1=1;//占空比0~60% else PWM1=0;
} /*********************************************************************/ /*--PWM2函數--*/ void timer2()interrupt 5 using 2 {
TR2=1; //開定時器2 TF2=0; //中斷時軟清 RCAP2H=(65536-50)/256; //0xff; //(65536-50)/256;//賦初值定時 RCAP2L=(65536-50)%256; //0xf7; //(65536-50)%256;//0.05ms TH2=RCAP2H; // TL2=RCAP2L; //賦初值定時 TR2=0; //關定時器2 TR0=1; //開定時器0
time2++; if(time2>=100)time2=0; //5KHZ if(time2<=dis2)PWM2=1; //占空比0~60% else PWM2=0;
} /*********************************************************************/ /*--通訊函數--*/
void ser() interrupt 4 using 3 { ES=0; RI=0; //將接受中斷標志位清零 dat=SBUF; // 將接受到的數據賦值給dat
switch(dat) { case 0x02: // 前進 choose1(); run(); break;
case 0x08: // 后退 choose1(); backrun(); break;
case 0x06: // 左轉 choose1(); leftrun(); leftled(); break;
case 0x04: // 右轉 choose1(); rightrun(); rightled(); break;
case 0x05: // 功能鍵 gbFlag=~gbFlag; //狀態取反 stopled(); break;
case 0x01: //X舵機加(減) choose2(); //舵機開 scan1(); break;
case 0x03: //Y舵機加(減) choose2(); scan2(); break;
default : break;
}
ES=1;
}
|