简单实现51单片机步进电机的驱动

简单实现51单片机步进电机的驱动

说明:本文章主要用代码实现驱动步进电机

驱动步进电机原理和代码都比较简,相信各位都能看懂,但由于我做过这个项目其中有些小坑的地方和大家分享一下
首先是定义引脚我在这定义的是P1.1;P1.2;P1.3;P1.4;大家也可以定义其他的引脚,但定义什么引脚就要用杜邦线连接什么引脚。
下一步需要比较注意的是定时器的使用,在驱动步进电机定时机上可以使用定时器0、定时器1等等,我在这里使用的是定时器1工作方式也为1但需要注意的地方是TMOD设置定时器的模式,如果是仅仅驱动步进电机的话大家不知道如何配置就可以像我一样把定时器0和定时器1都打开TMOD|= 0x11(不推荐);然后分享我入坑的地方我一开始是使用定时器0的然后为以后项目扩展我就把定时器0改为了定时器1,然后我就粗心大意的中断标号还是为interrupt 1导致步进电机直接不工作,所以当大家想使用不同定时器工作的时候一定不要忘了改中断号(定时器1对应的是interrupt 3)
最后我增加了一个外部中断0来停止步进电机工作,外部中断0的触发方式为低电平触发,既当按键按下时触发外部中断0使步进电机停止工作(按键我定义为P3.2)当按键复位外部中断0停止既步进电机继续工作。
项目代码:

#include "reg52.h"
sbit anniu=P3^2;
 //Motor
sbit A = P1^1;	  //定义管脚
sbit b = P1^2;
sbit C = P1^3;
sbit D = P1^4;

 ///////////////////////////////////////
//步进电机驱动
unsigned char MotorStep=0;  //步进马达步序
unsigned int  MotorDelay,Speed=1,TIM,CT;

#define speed  1  // 调整速度 数值不要设的太低 低了会引起震动。

/*****************************************************
*	    初始化马达							         *
******************************************************/
void InitMotor()
{
  A = 1;
  b = 1;
  C = 1;
  D = 1;
}


 
void SetMotor()
{
 

    MotorDelay=Speed;	//调整速度
    switch(MotorStep)
    {
       case 0:
          if(TIM)   // A
          {				    
            A = 0;		    //0xf1  
            b = 1;
			C = 1;
            D = 1;
            MotorStep = 1;
			TIM=0;
          }
       break;

       case 1:		 // AB
         if(TIM)
          {	
            A = 0;		   //0xf3 
            b = 0;
           	C = 1;
            D = 1;
            MotorStep = 2;
			TIM=0;
          }
       break;

       case 2:	   //B
         if(TIM)
          {
           
          	A = 1;
            b = 0;		  //0xf2 
            C = 1;
            D = 1;
           
            MotorStep = 3;
			TIM=0;
          }
       break;


       case 3:		//BC
         if(TIM)
          {	
            A = 1;
            b = 0;		    //0xf6
            C = 0;
            D = 1;
            MotorStep = 4;
			TIM=0;
          }
       break;
     case 4:		 //C
         if(TIM)
          {	
            A = 1;
            b = 1;		    //0xf4
            C = 0;
            D = 1;
            MotorStep = 5;
			TIM=0;
           }
       break;
	case 5:			  //CD
         if(TIM)
          {	
            A = 1;
            b = 1;		    //0xfc
            C = 0;
            D = 0;
            MotorStep = 6;
			TIM=0;
          }
       break;
	case 6:			  //D
         if(TIM)
          {	
            A = 1;
            b = 1;		    //0xf8
            C = 1;
            D = 0;
            MotorStep = 7;
			TIM=0;
          }
       break;
	case 7:			//DA
         if(TIM)
          {	
            A = 0;
            b = 1;		    //0xf9
            C = 1;
            D = 0;
            MotorStep = 0;
			TIM=0;
          }
       break;
	
	}

}


void system_Ini()
{
    TMOD|= 0x11;
    TH1=0xDC;//(65536-46080)/256;//0xDC; //11.0592M
    TL1=0x00;//(65536-46080)%256;//0x00;	
	IE = 0xff;	
    TR1  = 1;
	EX0=1;
	PX0=1;



}

main() 
 { 
  
   system_Ini();
   InitMotor();
    while(1)
	{
	 SetMotor();

	 }



  }

/************************************************
*												*
*	      定时中断延时						    *
************************************************/
  void Tzd(void) interrupt 3
{
   TH1 = 0xfe;    //11.0592
	 TL1 = 0x33;

	if( CT++==speed) 
	  {TIM=1;
	   CT=0;
	  }
 }
 void int0(void) interrupt 0	//interrupt是声明函数为中断服务函数,0是编译器对中断的编号
{							//外部中断0
P1=0X00;							            
while(anniu==0);            //低电频触发
}



本文有错误的地方请大家多多指正

发布了6 篇原创文章 · 获赞 2 · 访问量 242

猜你喜欢

转载自blog.csdn.net/weiweiweiIT/article/details/104303753