|
藍牙控制,紅外循跡
- //程序改為5個尋跡模式 程序采用worse來計算的 若兩秒內尋跡對管全部亮 就會自動退出尋跡 程序僅供參考 沒有測試 大家自行修改。
- #include<reg52.h>
- #define LEFT 0
- #define RIGHT 1
- #define NON 2
- #define uchar unsigned char
- #define uint unsigned int
- sbit IN1=P1^0; //控制左電機轉動,IN1=1,IN2=0時正轉,反之,反轉。 相應位置對應L298N的相應位置即可。
- sbit IN2=P1^1;
- sbit IN3=P1^2; //控制右電機轉動,IN3=1,IN4=0時正轉,反之,反轉。
- sbit IN4=P1^3;
- sbit ENA=P2^4; //電機速度pwm控制,ENA控制左電機,ENB控制右電機。
- sbit ENB=P2^5;
- sbit XunJi1=P0^0;//尋跡模塊從左到右依次定義為 1、2、3、4. 尋跡從左到右DO接p0^0 p0^1 p0^2 p0^3
- sbit XunJi2=P0^1;
- sbit XunJi3=P0^2;
- sbit XunJi4=P0^3;
- sbit XunJi5=P0^4;
- uchar count_flag,count_data=0,lanyabiaozhi=1,xunjibiaozhi=0; //count_flag為計數(shù)標志,count_data位計數(shù)數(shù)據(jù),藍牙標志位和尋跡標志位。
- uchar black_lost_dir=NON;
- int error=0,re_error=0,re_re_error=0;
- int worse=0;
- uchar pwm_A,pwm_B,motor_A,motor_B,PWM=100; //pwm_A為左電機pwm,pwm_B為右電機pwm,motor_A為左電機速度,motor_B為右電機速度。
- uchar temp_data;
- uchar flag;
- //---------------------------------初始化函數(shù)-------------------------------------------
- void chushihua()
- {
- P0=0xff;P1=0xff;
- P2=0xff;P3=0xff;
- TMOD=0x21; //定時器0使用16位定時器 定時器2使用8位初值自動重裝定時器
- TH0=(65536-200)/256;
- TL0=(65536-200)%256;
- TH1=0xFd;
- TL1=0xFd;
- SCON=0x50;
- PCON=0x00;
- TR0=1;
- TR1=1;
- ET0=1;
- ES=1;
- EA=1;
- }
- //----------------------------------------延遲函數(shù)---------------------------------
- /*void delay(uint z)
- {
- uint a,b;
- for(a=z;a>0;a--)
- for(b=110;b>0;b--);
- } */
- /*********************尋跡檢測***********************************/ //此段根據(jù)大家車模實際情況修改
- void xunji_1() //第一個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=0;motor_B=55;
- }
- /*void xunji_12() //第一個第二個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=10;motor_B=45;
- }
- */
- void xunji_2() //第二個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=20;motor_B=35;
- }
- /*void xunji_23() //第二三個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=25;motor_B=30;
- }
- */
- void xunji_3() //第三個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=28;motor_B=28;
- }
- /*void xunji_34() //第三四個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=30;motor_B=25;
- }
- */
- void xunji_4() //第四個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=35;motor_B=20;
- }
- /*void xunji_45() //第四wu個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=45;motor_B=10;
- } */
- void xunji_5() //第wu個尋跡檢測到黑線
- {
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- motor_A=55;motor_B=0;
- }
- /**************************************藍牙控制電機*******************************/
- void go() //前進
- {
- motor_A=50;motor_B=50;
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- }
- void back() //后退
- {
- motor_A=50;motor_B=50;
- IN1=0;IN2=1;
- IN3=0;IN4=1;
- }
- void left() //左轉
- {
- motor_A=0;motor_B=50;
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- }
- void right() //右轉
- {
- motor_A=50;motor_B=0;
- IN1=1;IN2=0;
- IN3=1;IN4=0;
- }
- void stop() //停止
- {
- motor_A=0;motor_B=0;
- IN1=0;IN2=0;
- IN3=0;IN4=0;
- }
- /****************************************************************/
- void xunji() //循跡模塊檢測
- {
- switch(P0)
- {
- case 0xd1: xunji_1(); worse/=2; break; //11100001 檢測到管子誤差減半
- // case 0xf3: xunji_12(); break;
- case 0xd2: xunji_2(); worse/=2; break; // 11100010
- // case 0xf6: xunji_23(); black_lost_dir=NON; break;
- case 0xd4: xunji_3(); worse/=2; break;// 11100100
- // case 0xfc: xunji_34(); break;
- case 0xd8: xunji_4(); worse/=2; break; //11101000
- case 0xf0: xunji_5(); worse/=2; break; //11110000
-
- case 0xff: xunjibiaozhi=0; lanyabiaozhi=1; stop(); break; //尋跡管子全部熄滅
- case 0xd0: worse++; break;
-
-
-
- default : break ;
- }
- if(worse>=100) //計算大概兩秒的誤差
- { stop(); }
- }
- void lanya() //藍牙控制
- { /*if(count_flag==1) */
- { switch(temp_data)
- {
- case '2': go(); break; //
- case '8': back(); break; // | 前進
- case '4': left(); break; // 7 8 9
- case '6': right(); break; // 左轉 <- 4 5 6 -> 右轉
- case '5': stop(); break; // 1 2 3
- case '1': lanyabiaozhi=1;xunjibiaozhi=1;stop(); break; // 藍牙控制開啟 尋跡也開啟 尋跡的時候能藍牙控制小車 | 后退
- case '3': xunjibiaozhi=1;lanyabiaozhi=0; break; // 循跡控制開啟,關閉藍牙
- case '7': xunjibiaozhi=0;lanyabiaozhi=1; stop(); break; // 尋跡標志結束 ,藍牙開啟
- default : break ; }/* count_flag=0;*/
- }}
- // 主函數(shù)
- void main()
- {
- chushihua();
- while(1)
- {
- if(lanyabiaozhi==1)
- {lanya();}
- if(xunjibiaozhi==1)
- {xunji();
-
- if (flag==1&&temp_data=='7')
- { lanyabiaozhi=1;xunjibiaozhi=0;stop();
- flag=0; }
- }
- }
- }
- void serial() interrupt 4 //串口中斷
- {
-
-
-
- RI=0;
- temp_data=SBUF;
- count_flag=1;
- flag=1;
-
-
- }
- void Timer_0() interrupt 1 //定時器0中斷
- {
- TH0=(65536-200)/256; //每2ms計數(shù)一次
- TL0=(65536-200)%256;
-
- pwm_A++; //pwm_A計數(shù)累計
- pwm_B++; //pwm_B計數(shù)累計
-
- if(pwm_A<motor_A)
- {ENA=1;}
- else {ENA=0;}
- if(pwm_A>PWM) pwm_A=0;
- if(pwm_B<motor_B)
- {ENB=1;}
- else {ENB=0;}
- if(pwm_B>PWM) pwm_B=0;
- }
復制代碼
|
-
-
藍牙尋跡小車參考程序.zip
2016-5-14 13:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
36.27 KB, 下載次數(shù): 13, 下載積分: 黑幣 -5
評分
-
查看全部評分
|