- //每次的轉向角度可以通過延時的時間來控制
- #include<reg51.h>
- sbit cgl=P1^2;//左傳感器
- sbit cgr=P1^1;//右傳感器
- sbit l1=P0^1;//左邊輪子
- sbit l2=P0^2;
- sbit r3=P0^3;//右邊輪子
- sbit r4=P0^4;
- unsigned int m;
- void delay(unsigned int t)//延時tms
- {
- unsigned i,j;
- for(i=0;i<t;i++)
- for(j=0;j<120;j++);
- }
- void left() //左邊有障礙物,往右拐
- {
- l1=0;l2=0;r3=0;r4=0;delay(300);//保護電機,急停然而改變轉向
- l1=0;l2=1; //后退
- r3=0;r4=1;
- delay(400);//拐彎的延時控制拐彎的幅度
- l1=0;l2=0;r3=0;r4=0;delay(300);
- l1=1;l2=0;//向右拐
- r3=0;r4=1;
- delay(600);
- l1=0;l2=0;r3=0;r4=0;delay(300);
- }
- void right() //右邊有障礙物,往左拐
- {
- l1=0;l2=0;r3=0;r4=0;delay(300);
- l1=0;l2=1; //后退
- r3=0;r4=1;
- delay(400);
- l1=0;l2=0;r3=0;r4=0;delay(300);
- l1=0;l2=1;//向左拐
- r3=1;r4=0;
- delay(600);
- l1=0;l2=0;r3=0;r4=0;delay(300);
- }
- void cg()interrupt 0 //與門輸出控制中斷
- {
- if (cgl==0)m=1;
- if (cgr==0)m=2;
- }
- void main()
- {
- //P1=0xff;//初始化P1
- EA=1;
- EX0=1;
- IT0=1;
- while(1)
- {
- l1=1;l2=0; //前進
- r3=1;r4=0;
- switch(m)
- {
- case(1):left(); m=0;break;//右拐
- case(2):right();m=0;break;//左拐
- default:l1=1;l2=0; //前進
- r3=1;r4=0; break;
- }
- }
- }
復制代碼
|