找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7304|回复: 6
收起左侧

我的智能小车左侧避障传感器,一上电就有规律的闪烁(发光二极管),请问是什么原因?

[复制链接]
ID:202991 发表于 2017-5-20 22:17 | 显示全部楼层 |阅读模式
我的智能小车左侧避障传感器,一上电就有规律的闪烁(发光二极管),请问是什么原因?
0.png
回复

使用道具 举报

ID:202991 发表于 2017-5-20 22:19 | 显示全部楼层
这个是小车的原理图

1.主板原理图.pdf

105.15 KB, 下载次数: 7

2.传感器底板.pdf

67.53 KB, 下载次数: 7

回复

使用道具 举报

ID:202991 发表于 2017-5-20 22:24 | 显示全部楼层
  1. /**********************ZYWIFI0939C-WIFI机器人实验板例程************************
  2. *  平台:ZYWIFI0939C-WIFI机器人 + Keil U4 + STC89C52
  3. *  名称:ZY-1智能小车参考程序
  4. *  公司:湖南智宇科教设备有限公司   
  5. *  编写:智宇公司研发一部
  6. *  日期:2015-1-15
  7. *  交流:智能车QQ:261339276
  8. *  晶振:11.0592MHZ
  9. *  说明:免费开源,不提供源代码分析
  10. *  硬件设置:要有自己动手能力,才能完成实验
  11. *  使用说明:根据下面IO口自己用杜邦线连接各种模块,可以自己修改各种模块IO口
  12. *  视频教程:本小车配套学习C语言详细视频教程,资料统一网盘下载
  13.    重点提示:本程序只做参考,不提供技术支持,请自己研究吸收。
  14.    
  15. ******************************************************************/  
  16.     #include<AT89x51.H>
  17.     #include <intrins.h>
  18.         #include<HJ-4WD_PWM.H>                  //包含HL-1蓝牙智能小车驱动IO口定义等函数
  19.     #define Left_1_led        P3_7         //左循迹传感器   
  20.         
  21.     #define Right_1_led       P3_6         //右循迹传感器
  22.         
  23.     #define LeftIRBZ          P3_5         //左避障传感器         
  24.         
  25.         #define RightIRBZ         P3_4         //右避障传感器            

  26. sbit SB1=P2^3;                            //定义蜂鸣器端口
  27. sbit IRIN=P3^3;                                       //定义红外接收端口

  28. unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定义数码管显示数据
  29.                                    0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
  30. unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};
  31. unsigned char IRCOM[7];

  32. #define ShowPort P0                                   //定义数码管显示端口
  33. unsigned char temp = 1;

  34. void Delay1ms(unsigned int i)
  35. {
  36. unsigned char j,k;
  37. do{
  38.   j = 10;
  39.   do{
  40.    k = 50;
  41.    do{
  42.     _nop_();
  43.    }while(--k);     
  44.   }while(--j);
  45. }while(--i);

  46. }

  47. void delay_nus(unsigned int i)  //延时:i>=12 ,i的最小延时单12 us
  48. {
  49.   i=i/10;
  50.   while(--i);
  51. }   
  52. void delay_nms(unsigned int n)  //延时n ms
  53. {
  54.   n=n+1;
  55.   while(--n)  
  56.   delay_nus(900);         //延时 1ms,同时进行补偿
  57.   
  58. }  

  59. void delayms(unsigned char x)                         //0.14mS延时程序
  60. {
  61.   unsigned char i;                                    //定义临时变量
  62.   while(x--)                                          //延时时间循环
  63.   {
  64.     for (i = 0; i<13; i++) {}                         //14mS延时
  65.   }
  66. }

  67. void Delay()                                          //定义延时子程序
  68. {
  69.   unsigned int DelayTime=30000;                       //定义延时时间变量
  70.   while(DelayTime--);                                 //开始进行延时循环
  71.   return;                                             //子程序返回
  72. }

  73. void ControlCar_yaokong(unsigned char ConType)    //定义电机控制子程序        (红外遥控单独设置一个 switch  case  语句  )
  74. {

  75.   stop();
  76. switch(ConType)                          //判断用户设定电机形式
  77. {
  78.   case 1:  //前进                         //判断用户是否选择形式1
  79.   {
  80.     stop();                                                      //进入前进之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
  81.         Delay1ms(150);
  82. //        LeftLed = 0 ;
  83.         run();
  84.     break;
  85.   }
  86.   case 2: //后退                          //判断用户是否选择形式2
  87.   {
  88.     stop();                                                                      //进入后退之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
  89.     Delay1ms(150);
  90.   //  LeftLed = 1 ;         
  91.         back();                                 //M2电机反转
  92.     break;
  93.   }
  94.   case 3: //右转                          //判断用户是否选择形式3
  95.   {
  96.      stop();                                                                  //进入左转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
  97.          Delay1ms(150);
  98.          rightrun();                                //M2电机正转
  99.          break;
  100.   }
  101.   case 4: //左转                          //判断用户是否选择形式4
  102.   {
  103.      stop();                                                                  //进入右转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
  104.          Delay1ms(150);
  105.      leftrun();                                  //M1电机正转  //M2电机反转
  106.           break;
  107.   }
  108.   case 8: //停止                          //判断用户是否选择形式8
  109.   {
  110.     stop();
  111.         break;                                //退出当前选择
  112.   }
  113. }
  114. }
  115. void Robot_Avoidance()                   //机器人避障子程序
  116. {
  117.             
  118.               if(LeftIRBZ==1&&RightIRBZ ==1)          //LeftIRBZ RightIRBZ

  119.                     {         
  120.                       run();
  121.               delay_nms (10);
  122.                            SB1=1;
  123.                           }
  124.                           else
  125.                          {                          
  126.                                       if(LeftIRBZ==1&&RightIRBZ ==0)            //右边检测到红外信号
  127.                                   {
  128.                                           rightrun();                            //右转
  129.                      delay_nms (1000);                                           //停止300MS   防止电机反相电压冲击  导致系统复位

  130.                              }
  131.                            
  132.                                            if(RightIRBZ ==1&&LeftIRBZ==0)                //左边检测到红外信号
  133.                                   {         
  134.                                       
  135.                                           leftrun();                        //左转
  136.                      delay_nms (1000);                                           //停止300MS   防止电机反相电压冲击  导致系统复位

  137.                                   }
  138.                                   if(RightIRBZ==0&&LeftIRBZ==0)                //两边传感器同时检测到红外
  139.                                   {         
  140.                                      SB1=0;
  141.                                          stop();                     //停止
  142.                      delay_nms (1000);                        //停止300MS   防止电机反相电压冲击  导致系统复位
  143.                                          back();                         //调用电机后退函数
  144.                                          delay_nms (1000);                //后退50毫秒
  145.                                          rightrun();                     //调用电机右转函数
  146.                                         delay_nms (1000);
  147.                                   }
  148.                         }
  149.         
  150.                         run();
  151.                   
  152. }
  153. //机器人循迹子程序
  154. void Robot_Traction()                     //机器人循迹子程序
  155. {
  156.   
  157.    //SB1=1;
  158.    if(Left_1_led  == 0 && Right_1_led == 0)    //三个红外检测到黑线,就前进         Left_1_led           Right_1_led
  159.    {
  160.       run();                     //左侧没有信号时,开始向右转一定的角度
  161.       delay_nms (10);
  162.           SB1=0;
  163.    }
  164.    
  165.    else if(Left_1_led  == 0 && Right_1_led == 1)
  166.    {
  167.       rightrun();                       //右侧检测到黑线,开始向右转一定的角度
  168.       delay_nms (10);
  169.    }

  170.    else if(Left_1_led  == 1 &&  Right_1_led == 0)
  171.    {
  172.       leftrun();                         //左侧检测到黑线,开始向左转一定的角度
  173.          
  174.       delay_nms (10);
  175.    }
  176.    else if(Left_1_led  == 1 &&  Right_1_led == 1)
  177.    {
  178.       SB1=1;
  179.           stop();                         //左侧检测到黑线,开始向左转一定的角度
  180.          
  181.       delay_nms (10);
  182.    }
  183.      
  184. }

  185. //----------红外遥控-------------------------------------------------------------
  186. void IR_IN() interrupt 2 using 0                      //定义INT2外部中断函数
  187. {
  188.   unsigned char j,k,N=0;                              //定义临时接收变量
  189.   
  190.   EX1 = 0;                                            //关闭外部中断,防止再有信号到达   
  191.   delayms(15);                                        //延时时间,进行红外消抖
  192.   if (IRIN==1)                                        //判断红外信号是否消失
  193.   {  
  194.      EX1 =1;                                          //外部中断开
  195.          return;                                          //返回
  196.   }
  197.                            
  198.   while (!IRIN)                                       //等IR变为高电平,跳过9ms的前导低电平信号。
  199.   {
  200.       delayms(1);                                     //延时等待
  201.   }

  202.   for (j=0;j<4;j++)                                   //采集红外遥控器数据
  203.   {
  204.     for (k=0;k<8;k++)                                 //分次采集8位数据
  205.     {
  206.        while (IRIN)                                   //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  207.        {
  208.          delayms(1);                                  //延时等待
  209.        }
  210.       
  211.        while (!IRIN)                                  //等 IR 变为高电平
  212.        {
  213.          delayms(1);                                  //延时等待
  214.        }
  215.    
  216.        while (IRIN)                                   //计算IR高电平时长
  217.        {
  218.          delayms(1);                                  //延时等待
  219.          N++;                                         //计数器加加
  220.          if (N>=30)                                   //判断计数器累加值
  221.              {
  222.            EX1=1;                                     //打开外部中断功能
  223.                return;                                    //返回
  224.          }                  
  225.        }
  226.                                        
  227.       IRCOM[j]=IRCOM[j] >> 1;                         //进行数据位移操作并自动补零
  228.      
  229.       if (N>=8)                                       //判断数据长度
  230.       {
  231.          IRCOM[j] = IRCOM[j] | 0x80;                  //数据最高位补1
  232.       }
  233.       N=0;                                            //清零位数计录器
  234.     }
  235.   }
  236.    
  237.   if (IRCOM[2]!=~IRCOM[3])                            //判断地址码是否相同
  238.   {
  239.      EX1=1;                                           //打开外部中断
  240.      return;                                          //返回
  241.   }

  242.   for(j=0;j<10;j++)                                   //循环进行键码解析
  243.    {
  244.       if(IRCOM[2]==RecvData[j])                       //进行键位对应
  245.       {
  246.        // ControlCar(j);
  247.                 ControlCar_yaokong(j);                               //数码管显示相应数码
  248.       }
  249.    }
  250.    EX1 = 1;                                           //外部中断开
  251. }
  252. //-------------------------------------------------------------------------------------------------------
  253. void main()                               //主程序入口
  254. {
  255.   TMOD=0X01;
  256.         TL0 = 0x66;                //设置定时初值
  257.         TH0 = 0xFC;                //设置定时初值
  258.   TR0= 1;
  259.   ET0= 1;
  260.   EA = 1;                           //开总中断
  261.   //EX1=1;                                               //同意开启外部中断1
  262.   IT1=1;                                               //设定外部中断1为低边缘触发类型

  263. //void Timer0Init(void)                //1毫秒@11.0592MHz
  264. //{
  265. //        AUXR &= 0x7F;                //定时器时钟12T模式
  266. //        TMOD &= 0xF0;                //设置定时器模式
  267. //        TMOD |= 0x01;                //设置定时器模式
  268. //        TL0 = 0x66;                //设置定时初值
  269. //        TH0 = 0xFC;                //设置定时初值
  270. //        TF0 = 0;                //清除TF0标志
  271. //        TR0 = 1;                //定时器0开始计时
  272. //}


  273.   while(1)                                //程序主循环
  274.   {
  275.           if(P3_2 == 0)
  276.           {
  277.            delay_nms(10);
  278.            if(P3_2 == 0)
  279.            {
  280.                   temp++;
  281.                   while(!P3_2);
  282.            }
  283.           }
  284.           if(temp > 3)
  285.           {
  286.           temp = 1;
  287.           }

  288.           switch(temp)
  289.           {
  290.                    case 1:        ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break;
  291.                 case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break;
  292.                 case 3: ShowPort = LedShowData[3];SB1 = 1; EX1 = 1;break;
  293.           }

  294.          
  295.   }
  296. }
复制代码
回复

使用道具 举报

ID:202991 发表于 2017-5-20 22:24 | 显示全部楼层

#ifndef _LED_H_
#define _LED_H_


    //定义小车驱动模块输入IO口
        sbit IN1=P1^2;
        sbit IN2=P1^3;
        sbit IN3=P1^4;
        sbit IN4=P1^5;
        sbit EN1=P1^6;
        sbit EN2=P1^7;
       

        /***蜂鸣器接线定义*****/
    sbit BUZZ=P2^3;

    //#define Left_1_led        P3_3         // 左传感器      
        //#define Right_1_led       P3_2         //右传感器   
            
        #define Left_moto_pwm          P1_6         //PWM信号端
        #define Right_moto_pwm          P1_7          //PWM信号端


    #define Left_moto_go      {P1_2=1,P1_3=0;}  //左电机向前走
        #define Left_moto_back    {P1_2=0,P1_3=1;}         //左边电机向后转
        #define Left_moto_Stop    {P1_2=0,P1_3=0;}         //左边电机停转                     
        #define Right_moto_go     {P1_4=1,P1_5=0;}        //右边电机向前走
        #define Right_moto_back   {P1_4=0,P1_5=1;}        //右边电机向后走
        #define Right_moto_Stop   {P1_4=0,P1_5=0;}              //右边电机停转   

        unsigned char pwm_val_left  =0;//变量定义
        unsigned char push_val_left =0;// 左电机占空比N/20
        unsigned char pwm_val_right =0;
        unsigned char push_val_right=0;// 右电机占空比N/20
        bit Right_moto_stop=1;
        bit Left_moto_stop =1;
        unsigned  int  time3=0;
   
/************************************************************************/       
//延时函数       
   void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(void)
{
     push_val_left=6;         //速度调节变量 0-20。。。0最小,20最大
         push_val_right=6;
         Left_moto_go ;   //左电机往前走
         Right_moto_go ;  //右电机往前走
}
//前速后退
     void  back(void)//后退
{
     push_val_left=13;         //速度调节变量 0-20。。。0最小,20最大
         push_val_right=13;
         Left_moto_back ;   //左电机往前走
         Right_moto_back ;  //右电机往前走
}


//左转
     void  leftrun(void)
{         
     push_val_left=6;
         push_val_right=14;
         Right_moto_go ;  //右电机往前走
     Left_moto_back   ;  //左电机后走
}

//右转
     void  rightrun(void)
{
         push_val_left=14;
         push_val_right=6;
     Left_moto_go  ;   //左电机往前走
         Right_moto_back    ;  //右电机往后走       
}
//停止
     void  stop(void)
{
         P1_2 = 0;
         P1_3 = 0;
         P1_4 = 0;
         P1_5 = 0;
                
}

/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
                void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
               {
                     Left_moto_pwm=1;

                   }
        else
               {
                 Left_moto_pwm=0;

                   }
        if(pwm_val_left>=20)
               pwm_val_left=0;
   }
   else   
          {
           Left_moto_pwm=0;

                  }
}
/******************************************************************/
/*                    右电机调速                                  */  
   void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
              {
               Right_moto_pwm=1;

                   }
        else
              {
                   Right_moto_pwm=0;

                  }
        if(pwm_val_right>=20)
               pwm_val_right=0;
   }
   else   
          {
           Right_moto_pwm=0;

              }
}
      
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
        void timer0()interrupt 1   using 2
{
        TL0 = 0x66;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
         time3++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}       

/*********************************************************************/       

#endif
回复

使用道具 举报

ID:202991 发表于 2017-5-20 22:27 | 显示全部楼层
有大神能帮助解决吗?????
回复

使用道具 举报

ID:170693 发表于 2017-5-21 13:11 | 显示全部楼层
是图中的D3闪吗?。 调整W1电位器改变左避障灵敏度。也可试一试有障碍时,V3收到V1的反射光,LM393的1脚电位低D3亮,用易拉罐皮卷一个6MM的小管套在V3上,不让它接受到光线这时LM393的1脚电位高D3不亮。
回复

使用道具 举报

ID:202991 发表于 2017-5-21 21:32 | 显示全部楼层
zhangsm 发表于 2017-5-21 13:11
是图中的D3闪吗?。 调整W1电位器改变左避障灵敏度。也可试一试有障碍时,V3收到V1的反射光,LM393的1脚电 ...

谢谢回复,这里边有3个模式,模式1为寻迹,模式2为避障,模式3为遥控,我估计是程序之间有干扰,我只想用模式2,我把模式1和3都屏蔽掉了,只用模式2,D3闪烁频次减轻了很多,小车可以正常运行。

另外,我不想调低避障的灵敏度,这样小车老是撞墙后才传感器才反应。

谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表