【求助】单片机控制智能小车,串口中断和计时器中断冲突

臭臭123   2015-1-27 10:35 楼主
测试不断电烧写的过程中,用串口通信可以控制电机的启动和停止,但是只要涉及到run函数来调速就会出现问题,请问该如何修改。最后实现可以调速,并且可以通过串口通信控制小车移动。

代码部分粘贴在下面:

        #include                 
        #include                 


//串口初始化函数
void init_uart(void)
{
        TMOD=0X21;
        TH1=0XFD;
        TL1=0XFD;
        TR1=1;
        SCON=0X50;
        EA=1;
        ES=1;       
}
   
//主函数
        void main(void)
{       
       
        unsigned char i;
        unsigned char mode ;
                                                
        init_uart();

        while(1)       
        {
                       
            while(!RI) ;
               
                RI=0 ;
       
                mode = SBUF ;
        
                switch( mode )
                {
                
                        case 'w' : run(15,0);break ;
                        case 'a' : run(0,5); break ;
                        case 'd' : P1_2=0,P1_3=1; break ;
                        case 's' : P1_2=0,P1_3=0; break ;
               
                }

回复评论 (2)

run函数是干嘛的?转弯吗?遇到的问题是什么?
点赞  2015-1-27 12:06
引用: 电子-------- 发表于 2015-1-27 12:06
run函数是干嘛的?转弯吗?遇到的问题是什么?
这是.h的文件,run函数就是用来控制调速的函数,控制减速电机运动的


#ifndef _LED_H_
#define _LED_H_


    //定义小车驱动模块输入IO口
        sbit IN1=P1^2;
        sbit IN2=P1^3;
        sbit IN3=P1^6;
        sbit IN4=P1^7;
        sbit EN1=P1^4;
        sbit EN2=P1^5;
       

        /***蜂鸣器接线定义*****/
    sbit BUZZ=P2^3;

//  #define Left_1_led        P3_3         // 左传感器      
//        #define Right_1_led       P3_2         //右传感器   
            
        #define Left_moto_pwm          P1_5         //PWM信号端
        #define Right_moto_pwm          P1_4          //PWM信号端


        #define Left_moto_go      {P1_2=0,P1_3=1;}  //左电机向前走
        #define Left_moto_back    {P1_2=1,P1_3=0;}         //左边电机向后转
        #define Left_moto_Stop    {P1_5=0;}  //左边电机停转                     
        #define Right_moto_go     {P1_6=1,P1_7=0;}        //右边电机向前走
        #define Right_moto_back   {P1_6=0,P1_7=1;}        //右边电机向后走
        #define Right_moto_Stop   {P1_4=0;}        //右边电机停转  

        unsigned char pwm_val_left  =0;//变量定义
        unsigned char push_val_left =0;// 左电机占空比N/20
        unsigned char pwm_val_right =0;
        unsigned char push_val_right=0;// 右电机占空比N/20
        bit Right_moto_stop=1;
        bit Left_moto_stop =1;
        unsigned  int  time=0;

/************************************************************************/       
//延时函数       
   void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x            for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(int s_left, int s_right )
{
     push_val_left=s_left;         //速度调节变量 0-20(0最小,20最大)
         push_val_right=s_right;
         Left_moto_go ;   //左电机往前走
         Right_moto_go ;  //右电机往前走
}



//左转
     void  leftrun(void)
{         
     push_val_left=7;
         push_val_right=7;
         Right_moto_go ;  //右电机往前走
     Left_moto_Stop ;  //左电机停止
}

//右转
     void  rightrun(void)
{
         push_val_left=7;
         push_val_right=7;
     Left_moto_go  ;   //左电机往前走
         Right_moto_Stop   ;  //右电机往前走       
}
     void  stoprun(void)
{
     Left_moto_stop  ;   //左电机停止
         Right_moto_Stop   ;  //右电机停止       
}


/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
                void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
               {
                     Left_moto_pwm=1;

                   }
        else
               {
                 Left_moto_pwm=0;

                   }
        if(pwm_val_left>=20)
               pwm_val_left=0;
   }
   else   
          {
           Left_moto_pwm=0;

                  }
}
/******************************************************************/
/*                    右电机调速                                  */  
   void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
              {
               Right_moto_pwm=1;

                   }
        else
              {
                   Right_moto_pwm=0;

                  }
        if(pwm_val_right>=20)
               pwm_val_right=0;
   }
   else   
          {
           Right_moto_pwm=0;

              }
}

/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
        void timer0()interrupt 1   using 2
{
     TH0=0XFc;          //1Ms定时
         TL0=0X18;
         time++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}       

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

#endif
点赞  2015-1-27 20:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复