单片机学习小组
直播中

任娇

7年用户 177经验值
私信 关注

蓝牙控制和红外循迹参考程序下载

蓝牙控制,红外循迹
  

  • //程序改为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;
  •         }




        蓝牙寻迹小车参考程序.zip
  2016-5-14 13:58 上传
点击文件名下载附件



36.27 KB, 下载次数: 6

更多回帖

发帖
×
20
完善资料,
赚取积分