跪求大神,,这程序错在哪

2019-03-24 18:13发布

                              #include <reg52.H>                //器件配置文件
#include <intrins.h>
#define  uint unsigned int
#define  uchar unsigned char

   sbit TX1 =P1^0;
   sbit EC1 =P1^1;
   sbit TX2 =P1^2;
   sbit EC2 =P1^3;
                                     
       unsigned int  time1=0,time2=0;
           unsigned long S1,S2;
           bit      flag1 =0;
           bit      flag2 =0;
          
           bit      fl =0;
          
          
          
                                               
        sbit IN1=P0^0;
        sbit IN2=P0^1;
        sbit IN3=P0^2;
        sbit IN4=P0^3;
    sbit IN5=P0^4;
        sbit IN6=P0^5;
        sbit IN7=P0^6;
        sbit IN8=P0^7;
       
         sbit pwm=P2^5;//输出PWM信号   duoji
     uint pwm_value=1500;//初值为1.5ms

     uint value[]={1000,1500,2000,1500,1000};//
       
        void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}               
                                              void  run(void)
{   
     IN1=0;                  
     IN2=1;         
         IN3=0;         
         IN4=1;

         IN5=1;
         IN6=0;
         IN7=1;
         IN8=0;

}

//全速后退函数
     void  backrun(void)
{
     IN1=1;                  
     IN2=0;         
         IN3=1;         
         IN4=0;

         IN5=0;
         IN6=1;
         IN7=0;
         IN8=1;
          

}

//全速左转函数
     void  leftrun(void)
{
     IN1=0;                  
     IN2=1;         
         IN3=0;         
         IN4=0;

         IN5=0;
         IN6=0;
         IN7=1;
         IN8=0;
          

}

//全速右转函数
     void  rightrun(void)
{
     IN1=0;                  
     IN2=0;         
         IN3=0;         
         IN4=1;

         IN5=1;
         IN6=0;
         IN7=0;
         IN8=0;
          

}
            void   InitTimer(void)
    {
        TMOD=0x11;//开定时器0,1
        TH0=0;//定时20MS,20MS为一个周期
        TL0=0;
        TH1=-1500/256;//定时1.5MS,这时舵机处于0度
        TL1=-1500%256;
        EA=1;//开总断
        TR0=1;//开定时器0
        ET0=1;
        TR1=1;//开定时器1
        ET1=1;
     }


//电机停止转动函数
     void  stop(void)
{
     IN1=0;                  
     IN2=0;         
         IN3=0;         
         IN4=0;
         IN5=0;
         IN6=0;
         IN7=0;
         IN8=0;
          

}

/********************************************************/
    void Conut1(void)
        {
         time1=TH0*256+TL0;
         TH0=0;
         TL0=0;
       
         S1=(time1*1.7)/100;     //算出来是CM
         if((S1>=700)||flag1==1) //超出测量范围显示“-”
         {         
          flag1=0;
         }
         else
         {
        }}
    void Conut2(void)
        {
         time2=TH0*256+TL0;
         TH0=0;
         TL0=0;
       
         S2=(time2*1.7)/100;     //算出来是CM
         if((S2>=700)||flag2==1) //超出测量范围显示“-”
         {         
          flag2=0;
         }
         else
         {
        }}
/********************************************************/
     void timer0(void) interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {         
  
   if (fl==0)
           {
                   flag1=1;
               flag2=1;
                   }
        else               
       {
           pwm=1;
           TH0=-20000/256;
           TL0=-20000%256;
           TR1=1;  
          
          
           }               
                                                                 //中断溢出标志
  }
          void timer1(void) interrupt 3//定时器1中断函数
     {
            pwm=0;
            TH1=-pwm_value/256;
             TL1=-pwm_value%256;
            TR1=0;
     }

            void duoji()
        {         
             uchar i;
               for(i=0;i<5;i++)
                              {
                pwm_value=value[i];//通过数组就可以改变舵机的转角度
            delayms(500);                     
                             }
         }

/********************************************************/
     void  StartModule1()                          //启动模块
  {
          TX1=1;                                             //启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX1=0;
  }
   void  StartModule2()                          //启动模块
  {
          TX2=1;                                             //启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX2=0;
  }
/********************************************************/


void chaosheng()
{                   
        
             StartModule1();                       
             while(!EC1);                //当RX为零时等待
             TR0=1;                            //开启计数
             while(EC1);                        //当RX为1计数并等待
             TR0=0;                                //关闭计数
                 Conut1();

                 StartModule2();
                 while(!EC2);                //当RX为零时等待
             TR0=1;                            //开启计数
             while(EC2);                        //当RX为1计数并等待
             TR0=0;               
                 Conut2();
}
void main(void)
{         
      
         InitTimer();
         pwm_value=1500;
        while(1)
          {          
             fl=0;
             chaosheng();
                 if(S1==S2)
                 {
                   leftrun();
                        delayms(50);       
                 }                          
                 else if(S2>S1)
                             {
                                   run();
                                 while(S1<=5)
                                 {
                                 fl=1;
                                 duoji();
                                 delayms(1000);
                                 
                                 break;                               
                      }
                                  fl=0;
                                break;
                            }
                        break;
        }
  }


                              #include <reg52.H>                //器件配置文件
#include <intrins.h>
#define  uint unsigned int
#define  uchar unsigned char

   sbit TX1 =P1^0;
   sbit EC1 =P1^1;
   sbit TX2 =P1^2;
   sbit EC2 =P1^3;
                                     
       unsigned int  time1=0,time2=0;
           unsigned long S1,S2;
           bit      flag1 =0;
           bit      flag2 =0;
          
           bit      fl =0;
          
          
          
                                               
        sbit IN1=P0^0;
        sbit IN2=P0^1;
        sbit IN3=P0^2;
        sbit IN4=P0^3;
    sbit IN5=P0^4;
        sbit IN6=P0^5;
        sbit IN7=P0^6;
        sbit IN8=P0^7;
       
         sbit pwm=P2^5;//输出PWM信号   duoji
     uint pwm_value=1500;//初值为1.5ms

     uint value[]={1000,1500,2000,1500,1000};//
       
        void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}               
                                              void  run(void)
{   
     IN1=0;                  
     IN2=1;         
         IN3=0;         
         IN4=1;

         IN5=1;
         IN6=0;
         IN7=1;
         IN8=0;

}

//全速后退函数
     void  backrun(void)
{
     IN1=1;                  
     IN2=0;         
         IN3=1;         
         IN4=0;

         IN5=0;
         IN6=1;
         IN7=0;
         IN8=1;
          

}

//全速左转函数
     void  leftrun(void)
{
     IN1=0;                  
     IN2=1;         
         IN3=0;         
         IN4=0;

         IN5=0;
         IN6=0;
         IN7=1;
         IN8=0;
          

}

//全速右转函数
     void  rightrun(void)
{
     IN1=0;                  
     IN2=0;         
         IN3=0;         
         IN4=1;

         IN5=1;
         IN6=0;
         IN7=0;
         IN8=0;
          

}
            void   InitTimer(void)
    {
        TMOD=0x11;//开定时器0,1
        TH0=0;//定时20MS,20MS为一个周期
        TL0=0;
        TH1=-1500/256;//定时1.5MS,这时舵机处于0度
        TL1=-1500%256;
        EA=1;//开总断
        TR0=1;//开定时器0
        ET0=1;
        TR1=1;//开定时器1
        ET1=1;
     }


//电机停止转动函数
     void  stop(void)
{
     IN1=0;                  
     IN2=0;         
         IN3=0;         
         IN4=0;
         IN5=0;
         IN6=0;
         IN7=0;
         IN8=0;
          

}

/********************************************************/
    void Conut1(void)
        {
         time1=TH0*256+TL0;
         TH0=0;
         TL0=0;
       
         S1=(time1*1.7)/100;     //算出来是CM
         if((S1>=700)||flag1==1) //超出测量范围显示“-”
         {         
          flag1=0;
         }
         else
         {
        }}
    void Conut2(void)
        {
         time2=TH0*256+TL0;
         TH0=0;
         TL0=0;
       
         S2=(time2*1.7)/100;     //算出来是CM
         if((S2>=700)||flag2==1) //超出测量范围显示“-”
         {         
          flag2=0;
         }
         else
         {
        }}
/********************************************************/
     void timer0(void) interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {         
  
   if (fl==0)
           {
                   flag1=1;
               flag2=1;
                   }
        else               
       {
           pwm=1;
           TH0=-20000/256;
           TL0=-20000%256;
           TR1=1;  
          
          
           }               
                                                                 //中断溢出标志
  }
          void timer1(void) interrupt 3//定时器1中断函数
     {
            pwm=0;
            TH1=-pwm_value/256;
             TL1=-pwm_value%256;
            TR1=0;
     }

            void duoji()
        {         
             uchar i;
               for(i=0;i<5;i++)
                              {
                pwm_value=value[i];//通过数组就可以改变舵机的转角度
            delayms(500);                     
                             }
         }

/********************************************************/
     void  StartModule1()                          //启动模块
  {
          TX1=1;                                             //启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX1=0;
  }
   void  StartModule2()                          //启动模块
  {
          TX2=1;                                             //启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX2=0;
  }
/********************************************************/


void chaosheng()
{                   
        
             StartModule1();                       
             while(!EC1);                //当RX为零时等待
             TR0=1;                            //开启计数
             while(EC1);                        //当RX为1计数并等待
             TR0=0;                                //关闭计数
                 Conut1();

                 StartModule2();
                 while(!EC2);                //当RX为零时等待
             TR0=1;                            //开启计数
             while(EC2);                        //当RX为1计数并等待
             TR0=0;               
                 Conut2();
}
void main(void)
{         
      
         InitTimer();
         pwm_value=1500;
        while(1)
          {          
             fl=0;
             chaosheng();
                 if(S1==S2)
                 {
                   leftrun();
                        delayms(50);       
                 }                          
                 else if(S2>S1)
                             {
                                   run();
                                 while(S1<=5)
                                 {
                                 fl=1;
                                 duoji();
                                 delayms(1000);
                                 
                                 break;                               
                      }
                                  fl=0;
                                break;
                            }
                        break;
        }
  }


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
也许想你
1楼-- · 2019-03-25 17:05
jishuaihu 发表于 2014-7-28 15:23
编译没错就是程序没有错,至于为什么没有实现你要实现什么功能,只能说是逻辑上的错误了。这个只能一步一步 ...

这里面包含两个模块,pwm调速和超声波。每个模块单独测试都好好的,但是合在一起就不行了
霹雳之火
2楼-- · 2019-03-25 18:15
分成各个模块,首先看看各个模块能不能正常工作达到预期的效果,所有的模块都测试成功了再放到一起联调

一周热门 更多>