找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2054|回复: 1
打印 上一主题 下一主题
收起左侧

我的无法正常循迹 程序是我自己写的 我想知道哪里出了问题

[复制链接]
跳转到指定楼层
楼主
ID:160768 发表于 2017-2-4 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>               
#define uint unsigned int
#define  uchar unsigned char
#define  P0_State P0

sbit  leftmotor_in1=P2^7;
sbit  leftmotor_in2=P2^6;
sbit  rightmotor_in3=P2^5;
sbit        rightmotor_in4=P2^4;
sbit    Trig=P1^1;
sbit    Echo=P1^2;
sbit en_1=P2^3;
sbit en_2=P2^2;
uint S,time,i,j,pwm1,pwm2;
void stop();
void straight();
void turn_left();
void turn_right();
void Sensor_5_Car_State_Adjustment();
void delay20us(unsigned char t)
{   
        while(--t);
}
/*******延时函数——延时50ms*******/
void delay(uint xms)                //@11.0592MHz
{
       
           unsigned char m, n;
      for(m=xms;m>0;m--)
              for(n=110;n>0;n--);
                               
}

void csb()
        {
                Trig=1;
                delay20us(15);
                Trig=0;
                while(!Echo);               
            TR0=1;       
          while(Echo);               
           TR0=0;                               
          time=TH0*256+TL0;
                S=(time*1.7)/100;
                         
             TH0=0;
         TL0=0;
         
        }
void T0_time()interrupt 1
{

}
void T1_time()interrupt 3
{  
        TR1=0;
        TH1=(65536-100)/256;
        TL1=(65536-100)%256;
        i++;
        j++;
          if(i<pwm1)
                                                {
                                                         en_1=1;
                                                }
            else
                         en_1=0;
           if(j<pwm2)
                                                {
                                                                 en_2=1;
                                                }
      else
                        en_2=0;
                     
        if(i>=100)
                                {
                                         i=0;
                                }
        if(j>=100)
                                {
                                                j=0;
                                }
                TR1=1;
}
void main()

  {  
   TMOD=0x10;
   TH1=(65536-100)/256;
         TL1=(65536-100)%256;
         TH0=0;
         TL0=0;     
                ET1=1;
    ET0=1;
    TR1=1;               
    TR0=1;                  
                EA=1;                          

        while(1)
        {

                 csb();
                 if(S>100)
                 {
                 
                        Sensor_5_Car_State_Adjustment();
                 }
           if(S<=100)
                 {  pwm1=0;
                          pwm2=0;
                    stop();
                         
                 }
                 
}


}  
void straight()      //直走函数
{

        leftmotor_in1=0;
        leftmotor_in2=1;
  rightmotor_in3=0;
        rightmotor_in4=1;
}
void turn_left()    //左转函数
{

        leftmotor_in1=1;
        leftmotor_in2=0;
  rightmotor_in3=0;
        rightmotor_in4=1;
}
void turn_right()   //右转函数
{

        leftmotor_in1=0;
        leftmotor_in2=1;
  rightmotor_in3=1;
        rightmotor_in4=0;
}

void stop()        //停止函数
{
  leftmotor_in1=0;
        leftmotor_in2=0;
  rightmotor_in3=0;
        rightmotor_in4=0;
}
void Sensor_5_Car_State_Adjustment(void)
{     
              P0_State=P0_State&0x00;
                       switch(P0_State)
                 {
                        
                             
                         
                              case 0x1f:
                                                case 0x1b:  pwm1=40;
                                                                                                pwm2=40;                         straight();     //P0.0|P0.1|P0.2|P0.3|P0.4为11011说明小车正常寻迹下一步小车直行
                                                                                                break;
                                                case 0x1d:      while(1)                 //P0.0|P0.1|P0.2|P0.3|P0.4为11101说明小车左偏下一步小车右拐                         
                                                   {  
                                   pwm2=35;
                                   pwm1=35;                                                                                         
                              turn_right();
                                                                                                                                 
                                                                                                                                if(P0^2==0)
                                                                                                                                        break;
                                                                                                         }
                                         break;
                              case 0x17:       while(1)                                       //10111
                                                                                                        {      
                                                                                                                        pwm2=35;
                                                                                                                                                pwm1=35;
                                                                                                                                turn_left();
                                                                                                                                        if(P0^2==0)
                                   break;                                                                                                                                               
                                                                                                        }                                                                                 //P0.0|P0.1|P0.2|P0.3|P0.4为10111说明小车右偏下一步左拐  
                                   break;
            case 0x03:
                                                                                                                        pwm1=50;
                                                                                                                        pwm2=50;
                                                                                                         straight();
                                                                                                                 delay(1);
                                                                                                                                        while(1)                           //P1.0|P1.1|P1.2|P1.3|P1.4为00011说明小车遇到左T标置物小车左拐
                                                                                                                                        {
                                                                                                                                                pwm1=30;
                                                                                                                                                pwm2=40;
                                                                                                                          turn_left();                       
                                                                                                                                                        if(P0^2==0)
                                                                                                                                                          {
                                                                                                                                                             break;
                                                                                                                                                                }
                                                                                                                                         }
                                        break;
     case 0x18:  
                                                pwm1=50;
                                                                              pwm2=50;
                                                                           straight();
                             delay(1);                                                                 
                                                                                                                                         while(1)                       //P0.0|P0.1|P0.2|P0.3|P0.4为11000说明小车遇到右T标志物下一步小车右拐
                                                                                                                                                {   
                                                                                                                                                                pwm1=40;
                                                                                                                                                          pwm2=30;
                                                                                                                                         turn_right();
                                                                                                                                                                if(P0^2==0)
                                                                                                                                                                {
                                                                                                                                                                         break;
                                                                                                                                                                }
                                                                                                                                                                               
                                                                                                                                                }  
                    break;

               
      case 0x11:                          //P0.0|P0.1|P0.2|P0.3|P0.4为00001说明小车遇到十字标志物下一步直行
                  case 0x10:                         //P0.0|P0.1|P0.2|P0.3|P0.4为10001说明小车遇到十字标志物体下一步小车直行
                  case 0x01:                        //P0.0|P0.1|P0.2|P0.3|P0.4为10000说明小车遇到十字标志物下一步直行
      case 0x00:                       //P0.0|P0.1|P0.2|P0.3|P0.4为00000说明小车遇到十字标志物下一步小车直行
                                                                        while(1)                     
                                                                                                                         {
                                                                                                                                            pwm1=40;
                                                                                                                                            pwm2=40;
                                                                                                                                 turn_right();
                                                                                                                                                 if(P0^2==0)
                                                                                                                                                 {
                                                                                                                                                                break;
                                                                                                                                                         
                                                                                                                                                 }         
                                                                                                                         }     
                   break;
                        case 0x1c:      
                                                                                                 while(1)                //11100
                                                                                                                {
                                                                                                                        pwm1=50;
                                                                                                                        pwm2=50;
                                                                                                                       
                                                                                                                         turn_right();
                                                                                                                        if(P0^2==0)
                                                                                                                                break;

                                                                                                                }
                                    
                break;
                        case 0x07:      
                                                 while(1)                                      //00111
                                              {
                                  pwm1=50;
                                                                                                                            pwm2=50;
                                                                                                                        turn_left();
                                                                                                                        if(P0^2==0)
                                                                                                                                   break;
                            }
                                     
                                                      break;        
      case 0x0b :              while(1)                  //01011
                                               {
                               pwm1=40;
                               pwm2=30;
                              turn_left();
                      if(P0^2==0)
                                                                                                   {
                                     break;
                                 }                                                                                               
                             }
                                break;
                        case 0x1a:                                  //11010
                                                                                while(1)                     
                                                                                                {
                                                                                                                         pwm1=30;
                                                                                                                         pwm2=40;
                                                                                                        turn_right();
                                                                                                                        if(P0^2==0)
                                                                                                                        {
                                                                                                                               
                                                                                                                                 break;
                                                                                                                        }
                                                                                                }
                                                                  
                                        
                                    break;
                        case   0x0f:  while(1)             //01111
                                                                                                 {     
                                                                                                                                                pwm1=50;
                                                                                                                                                pwm2=50;
                                                                                                                                 turn_left();
                                                                                                                          
                                                                                                                         if(P0^2==0)
                                                                                                                                         {  
                                                                                                                                                                break;


                                                                                                                                         }
                                                                 
                                                                                                 }
                                            break;
                        case  0x1e:
                                              while(1)
                                                                                                {
                                                                                                             pwm1=50;
                                                                                                             pwm2=50;
                                                                                                        turn_right();                                                                                //11110
                                                                                                          
                                                                                                    if(P0^2==0)
                                                                                                             break;
                                                                                                 
                                                                                                 }
                                break;
                        default:   
                                      break;                                //P.0|P0.1|P0.2|P0.3|P0.4    其他情况不做任何改动
      }

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:162229 发表于 2017-2-5 13:28 | 只看该作者
这是我以前做的一个循迹小车的测试时的程序,比较简单,你看一下,可能会有帮助。

  1. /**************************************************
  2. /*STC89C52控制的智能红外循迹小车
  3. ****************************************************/

  4. #include<reg52.h>
  5. #define uint unsigned int
  6. /**************************************************
  7. /*定义引脚
  8. ***************************************************/
  9. //sbit zuoh1=P3^1;
  10. sbit zuoh2=P3^2;                 //定义左侧探头,用外部中断0
  11. sbit youh2=P3^3;                 //定义右侧探头,用外部中断1
  12. //sbit zuoh1=P3^4;

  13. sbit en1=P2^0;                        //定义右轮使能
  14. sbit you=P2^1;                        //定义右轮前转
  15. sbit zuo=P2^2;                        //定义右轮前转
  16. sbit en2=P2^3;                        //定义左轮使能

  17. uint m,i;
  18. /**************************************************
  19. /*开启定时器1,设置pwm调速
  20. ***************************************************/                                                                       
  21. void Time1()               
  22. {
  23.         TMOD=0x20;
  24.         EA=1;
  25.         ET1=1;
  26.         TH1=0xfe;
  27.         TL1=0xfe;
  28.         TR1=1;
  29. }
  30. /**************************************************
  31. /*pwm调速函数,占空比为w%
  32. ***************************************************/
  33. void run(uint w)               
  34. {
  35.         if(m<w)  en1=en2=1;
  36.         else  en1=en2=0;
  37. }
  38. /**************************************************
  39. /*中断开启函数
  40. ***************************************************/
  41. void inter()                               
  42. {
  43.         EX0=1;
  44.         EX1=1;
  45.         IT0=0;
  46.         IT1=0;
  47. }

  48. /**************************************************
  49. /*        //主函数
  50. ***************************************************/                                                                                                       
  51. void main()                                                                                 
  52. {
  53.         Time1();
  54.         inter();
  55.         while(1)
  56.         {       
  57.                 run(25);                                       
  58.         }
  59. }
  60. /**************************************************
  61. /*//定时器服务函数,pwm
  62. ***************************************************/

  63. void Time() interrupt 3                  
  64. {
  65.         m++;
  66.         if(m>=100)  m=0;
  67. }
  68. /**************************************************
  69. /*//右侧探头服务函数
  70. ***************************************************/
  71. void inter0() interrupt 0                       
  72. {
  73.         en1=en2=1;                  
  74.          while(zuoh2==0)
  75.          {
  76.                  zuo=1;
  77.                  you=0;
  78.          }
  79.          zuo=you=1;         
  80. }
  81. /**************************************************
  82. /*//左侧探头服务函数
  83. ***************************************************/
  84. void inter1() interrupt 2                       
  85. {
  86.         en1=en2=1;
  87.          while(youh2==0)
  88.          {
  89.                  you=1;
  90.                  zuo=0;
  91.          }
  92.          zuo=you=1;
  93. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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