⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 51单片机驱动2相步进电机程序。 keil 开发软件。
💻 C
字号:
//QQ:228939191.
//两相5、6线步进电机,分为四拍和八拍,这里介绍输出八拍方式:A-AC-C-CB-B-BD-D-DA
//四拍:A-C-B-D,因此在八拍的基础上减去中间的就可以了,不过步距角要大一倍
//#include <reg51.h>
#include "STC89C52.H"
#include <intrins.h> 
//定义两相电机的四组线, 
sbit LA1=P0^0; 	  //为 A相
sbit LB1=P0^1;	  //为 B相
sbit LA2=P0^2;	  //为/A相
sbit LB2=P0^3; 	  //为/B相
#define uchar unsigned char 
  
void mDelay(unsigned int DelayTime);  //延时函数


//2相4拍
/************************************************************************************/
//两个参数代表步进步数和转速 
void Right1(unsigned int BuShu,unsigned int SuDu)
{
	 //步进节拍:A-AC-C-CB-B-BD-D-DA
	while(1)
		{ 
	  		LA1=0;LB1=1;LA2=1;LB2=1;  
	  		mDelay(SuDu);			//这里的延时就可控制转速
	  		if(!BuShu--)break;		//判断步进量走完没?以下都是,每走一步,判断一次
	   
	  		LA1=0;LB1=0;LA2=1;LB2=1; 
	 		mDelay(SuDu);
	  		if(!BuShu--)break;
	   
	  		LA1=1;LB1=0;LA2=1;LB2=1; 
	  		mDelay(SuDu);
	  		if(!BuShu--)break;
	   
	  		LA1=1;LB1=0;LA2=0;LB2=1; 
	  		mDelay(SuDu);
	  		if(!BuShu--)break;
	   
	  		LA1=1;LB1=1;LA2=0;LB2=1; 
	  		mDelay(SuDu);
	  		if(!BuShu--)break;
	   
	  		LA1=1;LB1=1;LA2=0;LB2=0; 
	  		mDelay(SuDu);
	  		if(!BuShu--)break;
	   		
	  		LA1=1;LB1=1;LA2=1;LB2=0; 
	  		mDelay(SuDu);
	  		if(!BuShu--)break;
	   
	  		LA1=0;LB1=1;LA2=1;LB2=0; 
	  		mDelay(SuDu);
			if(!BuShu--)break; 
 	}
 //	P0=0xFF;
}
//2相4拍
/************************************************************************************/
void Right2(unsigned int BuShu,unsigned int SuDu)
{
	 //步进节拍:A1B1-B1A2-A2B2-B2A1 
	while(1)
		{ 
	  		LA1=0;LB1=0;LA2=1;LB2=1; 
	  		mDelay(SuDu);//这里的延时就可控制转速
	  		if(!BuShu--)break;
	   
	  		LA1=1;LB1=0;LA2=0;LB2=1; 
	 		mDelay(SuDu);
	  		if(!BuShu--)break;
	   
	  		LA1=1;LB1=1;LA2=0;LB2=0; 
	  		mDelay(SuDu);
	  		if(!BuShu--)break;
	   
	  		LA1=0;LB1=1;LA2=1;LB2=0; 
	  		mDelay(SuDu);
	  		if(!BuShu--)break; 
 	}
 	
}  
/************************************************************************************/
void mDelay(unsigned int DelayTime)  //延时函数
{   
	unsigned char j=0;
	while(DelayTime--)
	 	{
   			for(j=0;j<20;j++){}
  		}
} 
/************************************************************************************/
void main()
{ 
 
 	while(1)
		{
  		 	
			//如果控制方式为2相4拍,一圈是200个脉冲。那一个脉冲是1.8度。
			//如果电机连接机械运行一圈是100mm,那一个脉冲是0.5mm。
			//如果你要电机运行248mm,知道给几个脉冲了吧?如果不知道安就撞墙了。
			if(P1_0==0)Right2(800,12); //P1_0按下,电机运行800个脉冲。12是延时,数越大速度就越慢。
				else P0=0x0F;//停止后将四个脚输出置高
 		} 
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -