蓝牙控制,红外循迹
- //程序改为5个寻迹模式 程序采用worse来计算的 若两秒内寻迹对管全部亮 就会自动退出寻迹 程序仅供参考 没有测试 大家自行修改。
- #include
- #define LEFT 0
- #define RIGHT 1
- #define NON 2
- #define uchar unsigned char
- #define uint unsigned int
- ***it IN1=P1^0; //控制左电机转动,IN1=1,IN2=0时正转,反之,反转。 相应位置对应L298N的相应位置即可。
- ***it IN2=P1^1;
- ***it IN3=P1^2; //控制右电机转动,IN3=1,IN4=0时正转,反之,反转。
- ***it IN4=P1^3;
- ***it ENA=P2^4; //电机速度pwm控制,ENA控制左电机,ENB控制右电机。
- ***it ENB=P2^5;
- ***it XunJi1=P0^0;//寻迹模块从左到右依次定义为 1、2、3、4. 寻迹从左到右DO接p0^0 p0^1 p0^2 p0^3
- ***it XunJi2=P0^1;
- ***it XunJi3=P0^2;
- ***it XunJi4=P0^3;
- ***it XunJi5=P0^4;
- uchar count_flag,count_data=0,lanyabiaozhi=1,xunjibiaozhi=0; //count_flag为计数标志,count_data位计数数据,蓝牙标志位和寻迹标志位。
- 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;
- //---------------------------------初始化函数-------------------------------------------
- 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;
- }
- //----------------------------------------延迟函数---------------------------------
- /*void delay(uint z)
- {
- uint a,b;
- for(a=z;a>0;a--)
- for(b=110;b>0;b--);
- } */
- /*********************寻迹检测***********************************/ //此段根据大家车模实际情况修改
- 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;*/
- }}
- // 主函数
- 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计数一次
- TL0=(65536-200)%256;
- pwm_A++; //pwm_A计数累计
- pwm_B++; //pwm_B计数累计
- if(pwm_A {ENA=1;}
- else {ENA=0;}
- if(pwm_A>PWM) pwm_A=0;
- if(pwm_B {ENB=1;}
- else {ENB=0;}
- if(pwm_B>PWM) pwm_B=0;
- }
|