微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > pwm调速和超声波避障的程序,每个模块单独都很好但是合...

pwm调速和超声波避障的程序,每个模块单独都很好但是合...

时间:10-02 整理:3721RD 点击:
                              #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;//通过数组就可以改变舵机的转角度
            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;
        }
  }


               
              

你想求点啥呢说说看

小编你这是要什么东西呢?跪求求什么呢?

这是一个pwm调速和超声波避障的程序,每个模块单独都很好但是合在一起就不行了,而且编译没错误,,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top