找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么我的单片机小车程序只能一个轮子动,求大神解惑

[复制链接]
跳转到指定楼层
楼主
ID:945628 发表于 2021-6-28 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>//包含51单片机头文件,内部有各种寄存器定义

    //定义小车驱动模块输入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;}         //左边电机向后转
                                                                        #define Left_moto_Stop    {P1_2=0,P1_3=0;}         //左边电机停转                     
                                                                        #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;}              //右边电机停转   
                                                                           */
        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;*/
/************************************************************************/        
//延时函数        
/*  void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
} */
/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
                void left_moto(void)
{  

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

                 
}         
/******************************************************************/
/*                    右电机调速                                  */  
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;         //速度调节变量 0-20。。。0最小,20最大
         push_val_right=17;
         
         L293D_IN1=1,L293D_IN2=0,L293D_IN3=1,L293D_IN4=0;

}

                                        //后退函数
                                        //     void  backrun(void)
                                        //{
                                        //     push_val_left=12;         //速度调节变量 0-20。。。0最小,20最大
                                        //         push_val_right=12;
                                        //         Left_moto_back;   //左电机往后走
                                        //         Right_moto_back;  //右电机往后走
                                        //}

//左转

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


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

//右转
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   
                                        //主函数
                                       
                                        //unsigned int leijia=1;
        void main(void)
{        
        
    P1=0X00;   //关电机        

                         TMOD=0X01;
                TH0= 0XFc;                  //1ms定时
                 TL0= 0X18;
                   TR0= 1;
                ET0= 1;
                EA = 1;                           //开总中断


        while(1)        //无限循环
        {
         
                         //有信号为0 没有信号为1


         
         
          if(Left_1_led==0&&Right_1_led==0&&zhong_1_led==0)
                        {
                        
                //        run();   //调用前进函数
                         }
                                 
                                                
                                    
                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中断服务子函数产生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; }
}

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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