|
六路循跡小車,紅外模塊作循跡部分,主控芯片用STC89C52RC,lcd1602顯示小車行駛時間,小車通過設(shè)定標(biāo)志位來通過復(fù)雜的賽道,小車賽道如圖:
白色區(qū)域是上坡,兩個凹槽是障礙物
對賽道解析:中間白色,兩邊黑色的是橋,藍(lán)色的區(qū)域是一個坡,中間的凹槽是障礙物.
程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit En_L=P1^4;
- sbit En_R=P1^5; //定義使能端
- sbit l2 = P2^0;
- sbit ml = P2^1;
- sbit r2 = P2^2;
- sbit mr = P2^3;
- sbit l1 = P1^6;
- sbit r1 = P1^7; //定義傳感器位置: (l1) (l2) (ml) (mr) (r2) (r1)
-
- sbit IN1 = P1^0;
- sbit IN2 = P1^1;
- sbit IN3 = P1^2;
- sbit IN4 = P1^3; //定義驅(qū)動IO口
- uchar count,num;
- uchar bz=0; //定義標(biāo)志位
- #define PWM_CHUZHI 100
- #define S_CIRCLE 100
- uchar Speed_L_Now;
- uchar Speed_R_Now; //左右輪實(shí)時速度
- #define Data P0 //lcd數(shù)據(jù)端口
- sbit RS = P2^7; //lcd的rs口
- sbit RW = P2^6; //lcd的rw口
- sbit E = P2^5; //lcd的e口
- int sec=0,min=0;
- uchar FirstLine[]=" Time:00min00s";
- /********功能函數(shù)********/
- /***延時函數(shù)***/
- void DelayMs(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /******液晶寫命令******/
- void lcd_write_com(uchar c)
- {
- DelayMs(5); //操作前短暫延時,保證信號穩(wěn)定
- E=0;
- RS=0;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- }
- /*****寫數(shù)據(jù)*****/
- void lcd_write_dat(uchar c)
- {
- DelayMs(5);// 操作前短暫延時,保證信號穩(wěn)定
- E=0;
- RS=1;
- RW=0;
- _nop_();
- E=1;
- Data=c;
- E=0;
- RS=0;
- }
- /*******LCD初始化****/
- void lcd_init()
- {
- DelayMs(15);
- lcd_write_com(0x38);
- DelayMs(10);
- lcd_write_com(0x38);
- DelayMs(10);
- lcd_write_com(0x38);
- DelayMs(10);
- lcd_write_com(0x06);
- DelayMs(10); //顯示光標(biāo)移動位置
- lcd_write_com(0x0c);
- DelayMs(10); //顯示開及光標(biāo)設(shè)置
- lcd_write_com(0x01);
- DelayMs(10); //顯示清屏
- for(num=0;num<15;num++)
- {
- lcd_write_dat(FirstLine[num]); //將“Time:”寫入LCD
- DelayMs(5);
- }
- }
-
- /****定時器T1:液晶實(shí)時顯示***/
- void timer1()interrupt 3
- {
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- count++;
- }
- /******定時器0用于輸出PWM控制電機(jī)速度*******/
- void motor_pwm_out()interrupt 1
- {
- static uchar count;
- TH0=(65536-PWM_CHUZHI)/256;
- TL0=(65536-PWM_CHUZHI)%256;
- count++;
- if(count>=Speed_L_Now)
- {
- En_L=0;
- }
- if(count>=Speed_R_Now)
- {
- En_R=0;
- }
- if(count==S_CIRCLE)
- {
- En_L=1;
- En_R=1;
- count=0;
- }
- }
- void write_fm(uchar add,uchar date) //將分秒寫進(jìn)lcd的函數(shù)
- {
- uint shi,ge;
- lcd_write_com(0x80+add);
- shi=date/10;
- ge =date%10;
- lcd_write_dat(0x30+shi);
- lcd_write_dat(0x30+ge);
- }
- void ahead() //前進(jìn)函數(shù)
- {
- IN1=1;
- IN2=0;
- IN3=1;
- IN4=0;
- Speed_L_Now=46;
- Speed_R_Now=43;
- }
- void poahead() //上坡后的前進(jìn)函數(shù)
- {
- IN1=1;
- IN2=0;
- IN3=1;
- IN4=0;
- Speed_L_Now=43;
- Speed_R_Now=40;
- }
- void turn_left() //左轉(zhuǎn)函數(shù)
- {
- IN1=0;
- IN2=1;
- IN3=1;
- IN4=0;
- Speed_L_Now=44;
- Speed_R_Now=42;
- }
- void turn_right() //右轉(zhuǎn)函數(shù)
- {
- IN1=1;
- IN2=0;
- IN3=0;
- IN4=1;
- Speed_L_Now=44;
- Speed_R_Now=42;
- }
- void big_turn() //上坡后大轉(zhuǎn)彎函數(shù)
- {
- IN1=1;
- IN2=0;
- IN3=0;
- IN4=1;
- Speed_L_Now=43;
- Speed_R_Now=20;
- }
- void stop() //停止函數(shù)
- {
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- }
- void xunji1() //循跡控制函數(shù)
- {
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //六個都沒檢測到黑線
- ahead();
- if(l1==1&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //l1檢測到
- turn_left();
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==1&&r2==0) //l2檢測到
- turn_left();
- if(l1==1&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l1,l2,ml檢測到
- ahead();
- if(l1==0&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l2,ml檢測到
- turn_left();
- if(l1==0&&ml==0&&r1==1&&mr==0&&l2==0&&r2==1) //r1,r2檢測到
- turn_right();
- if(l1==0&&ml==0&&r1==0&&mr==1&&l2==0&&r2==1) //mr,r2檢測到
- turn_right();
- if(l1==0&&ml==1&&r1==0&&mr==0&&l2==0&&r2==0) //ml檢測到
- turn_left();
- if(l1==0&&ml==1&&mr==1&&r1==0&&l2==0&&r2==0) //ml,mr檢測到
- poahead();
- if(l1==0&&ml==0&&mr==1&&r1==0&&l2==0&&r2==0) //mr檢測到
- turn_right();
- if(l1==0&&ml==0&&mr==0&&r1==1&&l2==0&&r2==0) //r1檢測到
- turn_right();
- if(l1==0&&ml==0&&mr==1&&r1==0&&l2==0&&r2==1) //mr,r2檢測到
- turn_right();
- if(l1==0&&ml==0&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr檢測到
- ahead();
- if(l1==0&&ml==1&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr,ml檢測到
- ahead();
- if(l1==1&&ml==1&&mr==1&&r1==0&&l2==1&&r2==0) //l1,l2,mr,ml檢測到
- ahead();
- if(l1==0&&ml==1&&mr==1&&r1==0&&l2==1&&r2==1) //l2,r2,ml,mr檢測到
- ahead();
- if(l1==1&&ml==1&&mr==1&&r1==1&&l2==1&&r2==1) //六個都檢測到
- ahead();
- }
- void xunji2()
- {
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //六個都沒檢測到黑線
- ahead();
- if(l1==1&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //l1檢測到
- turn_right();
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==1&&r2==0) //l2檢測到
- turn_right();
- if(l1==1&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l1,l2,ml檢測到
- ahead();
- if(l1==0&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l2,ml檢測到
- turn_right();
- if(l1==0&&ml==0&&r1==1&&mr==0&&l2==0&&r2==1) //r1,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&r1==0&&mr==1&&l2==0&&r2==1) //mr,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==0&&r1==1&&l2==0&&r2==0) //r1檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==1&&r1==0&&l2==0&&r2==1) //mr,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr檢測到
- ahead();
- if(l1==1&&ml==1&&mr==1&&r1==0&&l2==1&&r2==0) //l1,l2,mr,ml檢測到
- big_turn();
- if(l1==0&&ml==1&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr,ml檢測到
- turn_right();
- if(l1==1&&ml==1&&mr==1&&r1==1&&l2==1&&r2==1) //六個都檢測到
- big_turn();
- bz++;
- }
- void xunji3()
- {
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //六個都沒檢測到黑線
- poahead();
- if(l1==1&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //l1檢測到
- turn_right();
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==1&&r2==0) //l2檢測到
- turn_right();
- if(l1==1&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l1,l2,ml檢測到
- turn_right();
- if(l1==0&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l2,ml檢測到
- turn_right();
- if(l1==0&&ml==0&&r1==1&&mr==0&&l2==0&&r2==1) //r1,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&r1==0&&mr==1&&l2==0&&r2==1) //mr,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==0&&r1==1&&l2==0&&r2==0) //r1檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==1&&r1==0&&l2==0&&r2==1) //mr,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr檢測到
- turn_left();
- if(l1==0&&ml==1&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr,ml檢測到
- turn_right();
- if(l1==1&&ml==1&&mr==1&&r1==1&&l2==1&&r2==1) //六個都檢測到
- poahead();
- bz++;
- }
- void xunji4()
- {
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //六個都沒檢測到黑線
- poahead();
- if(l1==1&&ml==0&&r1==0&&mr==0&&l2==0&&r2==0) //l1檢測到
- turn_right();
- if(l1==0&&ml==0&&r1==0&&mr==0&&l2==1&&r2==0) //l2檢測到
- turn_right();
- if(l1==1&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l1,l2,ml檢測到
- poahead();
- if(l1==0&&ml==1&&r1==0&&mr==0&&l2==1&&r2==0) //l2,ml檢測到
- turn_right();
- if(l1==0&&ml==0&&r1==1&&mr==0&&l2==0&&r2==1) //r1,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&r1==0&&mr==1&&l2==0&&r2==1) //mr,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==0&&r1==1&&l2==0&&r2==0) //r1檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==1&&r1==0&&l2==0&&r2==1) //mr,r2檢測到
- turn_left();
- if(l1==0&&ml==0&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr檢測到
- poahead();
- if(l1==1&&ml==1&&mr==1&&r1==0&&l2==1&&r2==0) //l1,l2,mr,ml檢測到
- poahead();
- if(l1==0&&ml==1&&mr==1&&r1==1&&l2==0&&r2==1) //r1,r2,mr,ml檢測到
- poahead();
- if(l1==1&&ml==1&&mr==1&&r1==1&&l2==1&&r2==1) //六個都檢測到
- stop();
- }
- /******mcu初始化*******/
- void mcu_init()
- {
- TMOD=0x11; // 設(shè)置定時器0和為工作方式1(0001 0001)
- TH0=(65536-PWM_CHUZHI)/256; //裝初值
- TL0=(65536-PWM_CHUZHI)%256;
- TH1=(65536-50000)/256; //裝初值(50ms溢出一次)
- TL1=(65536-50000)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- ET1=1; //開定時器1中斷
- TR0=1; //啟動定時器0
- TR1=1; //啟動定時器1
-
- IT0=1;
- IT1=1;
- EX0=1;
- EX1=1;
- En_L=1;
- En_R=1;
- ahead();
- }
- /*********main********/
- void main()
- {
- lcd_init(); //液晶初始化
- DelayMs(20);
- mcu_init(); //mcu初始化
- while(1)
- {
- switch(bz)
- {
- case 0: xunji1();break;
- case 1: xunji1();break;
- case 2: xunji1();break;
- case 3: xunji2();break;
- case 4: xunji2();break;
- case 5: xunji3();break;
- case 6: xunji4();break;
- default: xunji4();
- }
- if(count==20) //將分和秒的數(shù)值寫進(jìn)lcd
- {
- count=0;
- sec++;
- if(sec==60)
- {
- sec=0;
- min++;
- }
- write_fm(12,sec);
- write_fm(7,min);
- }
- }
- }
復(fù)制代碼
注:小車選擇上坡和過橋,不繞過障礙物
|
-
-
循跡小車.zip
2016-6-11 23:02 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
36.3 KB, 下載次數(shù): 27, 下載積分: 黑幣 -5
循跡小車程序
評分
-
查看全部評分
|