標題: 為什么我的單片機小車程序只能一個輪子動,求大神解惑 [打印本頁]

作者: 990722    時間: 2021-6-28 21:18
標題: 為什么我的單片機小車程序只能一個輪子動,求大神解惑
#include<reg52.h>//包含51單片機頭文件,內(nèi)部有各種寄存器定義

    //定義小車驅(qū)動模塊輸入IO口
   sbit L293D_IN1=P1^2;
   sbit L293D_IN2=P1^3;
   sbit L293D_IN3=P1^4;
   sbit L293D_IN4=P1^5;
   sbit L293D_EN1=P1^6;
   sbit L293D_EN2=P1^7;

   sbit Left_moto_pwm=P1^6;           //PWM信號端
   sbit Right_moto_pwm=P1^7;   //PWM信號端

        sbit Left_1_led =P3^7;           //左傳感器
        sbit zhong_1_led =P3^5;
    sbit Right_1_led = P3^6;         //右傳感器
        /***蜂鳴器接線定義*****/
    sbit BUZZ=P2^3;
         
                                                                   /*        
                                                                        #define Left_moto_go      {P1_2=1,P1_3=0;}  //左電機向前走
                                                                        #define Left_moto_back    {P1_2=0,P1_3=1;}         //左邊電機向后轉(zhuǎn)
                                                                        #define Left_moto_Stop    {P1_2=0,P1_3=0;}         //左邊電機停轉(zhuǎn)                     
                                                                        #define Right_moto_go     {P1_4=1,P1_5=0;}        //右邊電機向前走
                                                                        #define Right_moto_back   {P1_4=0,P1_5=1;}        //右邊電機向后走
                                                                        #define Right_moto_Stop   {P1_4=0,P1_5=0;}              //右邊電機停轉(zhuǎn)   
                                                                           */
        unsigned char pwm_val_left  =0;//變量定義
        unsigned char push_val_left =15;// 左電機占空比N/20
        unsigned char pwm_val_right =0;
        unsigned char push_val_right=15;// 右電機占空比N/20
                                                                        //        bit Right_moto_stop=1;
                                                                        //        bit Left_moto_stop =1;
                                                        
                                                                //unsigned  int  time=0;
                                                                 
                                                        
                                                        /*        unsigned int tt = 0x00;
                                                            unsigned int ii = 0x00;
                                                                unsigned int xx = 0x00;
                                                                        unsigned int i = 0x00;
                                                                unsigned char yy,vv,bb;*/
/************************************************************************/        
//延時函數(shù)        
/*  void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
} */
/************************************************************************/
/*                    PWM調(diào)制電機轉(zhuǎn)速                                   */
/************************************************************************/
/*                    左電機調(diào)速                                        */
/*調(diào)節(jié)push_val_left的值改變電機轉(zhuǎn)速,占空比            */
                void left_moto(void)
{  

    if(pwm_val_left<=push_val_left)           //17
               {
                     Left_moto_pwm=1;
                   }
        else
               {
                 Left_moto_pwm=0;
                   }

                 
}         
/******************************************************************/
/*                    右電機調(diào)速                                  */  
void right_moto(void)
{

    if(pwm_val_right<=push_val_right)
              {
               Right_moto_pwm=1;
                   }
        else
              {
                     Right_moto_pwm=0;
                    }

         
}  
/************************************************************************/
//前速前進
void  run(void)
{
     push_val_left=17;         //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
         push_val_right=17;
         
         L293D_IN1=1,L293D_IN2=0,L293D_IN3=1,L293D_IN4=0;

}

                                        //后退函數(shù)
                                        //     void  backrun(void)
                                        //{
                                        //     push_val_left=12;         //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
                                        //         push_val_right=12;
                                        //         Left_moto_back;   //左電機往后走
                                        //         Right_moto_back;  //右電機往后走
                                        //}

//左轉(zhuǎn)

void  leftrun(void)
{         //vv++;         
     push_val_left=5;
         push_val_right=10;


         L293D_IN1=1; L293D_IN2=0, L293D_IN3=0;  L293D_IN4=1;
        
}

//右轉(zhuǎn)
void  rightrun(void)
{
         //bb++;
         push_val_left=10;
         push_val_right=5;

         L293D_IN1=1;  L293D_IN2=0,L293D_IN3=0; L293D_IN4=1;

         
}







/*********************************************************************/        

                                        //#endif   
                                        //主函數(shù)
                                       
                                        //unsigned int leijia=1;
        void main(void)
{        
        
    P1=0X00;   //關(guān)電機        

                         TMOD=0X01;
                TH0= 0XFc;                  //1ms定時
                 TL0= 0X18;
                   TR0= 1;
                ET0= 1;
                EA = 1;                           //開總中斷


        while(1)        //無限循環(huán)
        {
         
                         //有信號為0 沒有信號為1


         
         
          if(Left_1_led==0&&Right_1_led==0&&zhong_1_led==0)
                        {
                        
                //        run();   //調(diào)用前進函數(shù)
                         }
                                 
                                                
                                    
                else if(Left_1_led==1&&Right_1_led==0&&zhong_1_led==1)            //左邊檢測到黑線
                 {
                                           rightrun();
                                
                                        }
                                         

                           
         else if(Right_1_led==1&&Left_1_led==0&&zhong_1_led==1)                //右邊檢測到黑線
                                     {         
                                       leftrun();
                                          
                                     }
                else if(Right_1_led==1&&Left_1_led==1&&zhong_1_led==0)                //右邊檢測到黑線
                                     {         
                                     run();        
                                         
                                     }

                                 
                else
                                          {    L293D_IN1=0;
                                                   L293D_IN2=0;
                                                    L293D_IN3=0;
                                                    L293D_IN4=0;        }                                                                                                               
                                        }

                        }         
/***************************************************/
///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號*/
         void timer0()interrupt 1   using 2
{
     TH0=0XFc;          //1Ms定時
         TL0=0X18;
         //time++;
         
         pwm_val_right++;
         pwm_val_left++;
         right_moto() ;
        left_moto()          ;

        if(pwm_val_left>=20)
                 { pwm_val_left=0;}
          if(pwm_val_right>=20)
          {pwm_val_right=0; }
}






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1