[求助] 跪求大神,,这程序错在哪

也许想你   2014-7-27 21:56 楼主
                              #include                 //器件配置文件
#include
#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                 //器件配置文件
#include
#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)

程序编译没通过还是现象跟你预想的不一样??!!直接说有错,我也不知道你错在哪里?
哈喽,我是卡索KaSuo~~
点赞  2014-7-27 23:00
引用: 季夏木槿 发表于 2014-7-27 23:00
程序编译没通过还是现象跟你预想的不一样??!!直接说有错,我也不知道你错在哪里?

编译没有错,,,是舵机没法按设想的运行,,超声波也无法运行
点赞  2014-7-28 08:30
请楼下的高手来回答!
点赞  2014-7-28 08:55
编译没错就是程序没有错,至于为什么没有实现你要实现什么功能,只能说是逻辑上的错误了。这个只能一步一步的找,别人不知道你要具体做什么,也不知道你电路和你的思路。建议把你的程序的每一个功能单独拿出来测试,都测试的没有问题了再一块一块的综合到一起,这样有问题就比较容易查处了了。
点赞  2014-7-28 15:23
这么一堆程序,无法看出,可以分模块测试。程序需要慢慢测试才能够明白
专业电子方案/zigbee方案设计,毕业设计。QQ:1397905781
点赞  2014-7-29 11:15
楼主正解,分成各个模块,分别检测。你这整一大坨,也不自己搞什么,上来就问哪里有错误,难度系数超大。建议写个程序流程图,再把自己的设计大概讲一下,那么帮你的人才好下手。
点赞  2014-7-31 09:00
引用: jishuaihu 发表于 2014-7-28 15:23
编译没错就是程序没有错,至于为什么没有实现你要实现什么功能,只能说是逻辑上的错误了。这个只能一步一步 ...

这里面包含两个模块,pwm调速和超声波。每个模块单独测试都好好的,但是合在一起就不行了
点赞  2014-8-6 15:41
分成各个模块,首先看看各个模块能不能正常工作达到预期的效果,所有的模块都测试成功了再放到一起联调
好好学习,天天向上
点赞  2014-8-13 20:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复