找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个程序单独循迹好使 单独避障好使 现在弄在一起就不好使 这是问为什么

[复制链接]
跳转到指定楼层
楼主
ID:160768 发表于 2017-2-3 22:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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(20);
                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=0;                  
                EA=1;                          

        while(1)
        {
    csb();
                 if(S>10)
                 {
                         straight();
            
                 }
                 else if(S<=10)
                 {
                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()
{     
              P0_State=P0_State&0x00;
                       switch(P0_State)
                 {
                  
                                                case 0x1b:  pwm1=40;
                                                                                                pwm2=40;                         
                                         straight();     //P0.0|P0.1|P0.2|P0.3|P0.4为11011说明小车正常寻迹下一步小车直行
                                                                                                break;
                                                case 0x1d:                       //P0.0|P0.1|P0.2|P0.3|P0.4为11101说明小车左偏下一步小车右拐                         
                                                    
                                   pwm2=30;
                                   pwm1=30;                                                                                         
                              turn_right();
                                                                                                                                 
                                                                                                                                 
                                                                                                         
                                         break;
                              case 0x17:                                            //10111
                                                                                                             
                                                                                                                        pwm2=35;
                                                                                                                                                pwm1=35;
                                                                                                                                turn_left();
                                                                                                                                       
                                                                                                                               
                                                                                                                                                                                         //P0.0|P0.1|P0.2|P0.3|P0.4为10111说明小车右偏下一步左拐  
                                   break;
            case 0x03:
                                                                                                                        pwm1=50;
                                                                                                                        pwm2=50;
                                                                                                         straight();
                                                                                                                 delay(1);
                                                                                                                                                                   //P1.0|P1.1|P1.2|P1.3|P1.4为00011说明小车遇到左T标置物小车左拐
                                                                                                                                         
                                                                                                                                                pwm1=30;
                                                                                                                                                pwm2=40;
                                                                                                                          turn_left();                       
                                                                                                                                                       
                                                                                                                                                          
                                                                                                                                                          
                                                                                                                                                               
                                                                                                                                         
                                        break;
     case 0x18:  
                                                pwm1=50;
                                                                              pwm2=50;
                                                                           straight();
                             delay(1);                                                                 
                                                                                                                                                               //P0.0|P0.1|P0.2|P0.3|P0.4为11000说明小车遇到右T标志物下一步小车右拐
                                                                                                                                                  
                                                                                                                                                                pwm1=40;
                                                                                                                                                          pwm2=40;
                                                                                                                                         turn_right();
                                                                                                                                                       
                                                                                                                                                                               
                                                                                                                                                  
                    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说明小车遇到十字标志物下一步小车直行
                                                                                                                      
                                                                                                                         
                                                                                                                                            pwm1=40;
                                                                                                                                            pwm2=40;
                                                                                                                                 turn_right();
                                                                                                                                                delay(50);
                                                                                                                                                  
                                                                                                                                                       
                                                                                                                                                         
                                                                                                                                                          
                                                                                                                             
                   break;
                        case 0x1c:      
                                                                                                      //11100
                                                                                                               
                                                                                                                        pwm1=40;
                                                                                                                        pwm2=40;
                                                                                                                       
                                                                                                                         turn_right();
                                                                                                                        if(P0^2==0)
                                                                                                                                break;

                                                                                                               
                                    
                break;
                        case 0x07:      
                                                                       //00111
                                              
                                  pwm1=40;
                                                                                                                            pwm2=40;
                                                                                                                        turn_left();
                                                                                                                delay(100);

                                     
                                                      break;        
      case 0x0b :                              //01011
                                               
                               pwm1=40;
                               pwm2=20;
                              turn_left();

                                break;
                        case 0x1a:                                  //11010
                                                                                                    
                                                                                               
                                                                                                                         pwm1=30;
                                                                                                                         pwm2=40;
                                                                                                        turn_right();
                                                                                                               
                                                                  
                                        
                                    break;
                        case   0x0f:             //01111
                                                                                                     
                                                                                                                                                pwm1=40;
                                                                                                                                                pwm2=40;
                                                                                                                                 turn_left();
                                                                                                                            delay(50);
                                                                                                                         
                                            break;
                        case  0x1e:
                                           
                                                                                                             pwm1=40;
                                                                                                             pwm2=40;
                                                                                                        turn_right();                                                                                //11110
                                                                                                           delay(50);
                                                                                                  
                                break;
                        default:   
                                      break;                                //P.0|P0.1|P0.2|P0.3|P0.4    其他情况不做任何改动
      }

}


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

使用道具 举报

沙发
ID:160768 发表于 2017-2-3 22:30 | 只看该作者
这个是我自己写的   我现在通过测试应该是定时器有问题   但是不知道怎么改   改了很多回还是没改到点上
回复

使用道具 举报

板凳
ID:171033 发表于 2017-3-25 21:48 | 只看该作者
解决没有
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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