STC15W408AS单片机按键控制2步进电机

STC15W408AS单片机按键控制2步进电机

  • 主控芯片:STC15W408AS
  • 采用TB6600驱动

主程序代码:

#include
//电机1控制引脚     ******芯片:STC15W408AS*****
sbit CLK  = P1^0;
sbit ENA  = P1^1; 
sbit DIR  = P1^2;
//电机2控制引脚
sbit CLK1  = P1^3;
sbit ENA1  = P1^4; 
sbit DIR1  = P1^5;	
//按键控制端
sbit UP  = P3^2;	       //电机1正转
sbit DWN  = P3^3;		   //电机1反转
sbit LFT = P3^4;         //电机2正转
sbit RHT = P3^5;         //电机2反正
sbit SET  = P3^6;	   //加速
sbit RST = P3^7;     //减速

unsigned int Tspeed[10]={30,40,60,80,100,200,400,600,800,1000};	       //调速等级表
bit CY_status=0;
unsigned int CYCLE=20;
unsigned int cy_count=0;
unsigned PWM_count=0;
void Init_time();
void Key_scan();
void main()
{
	ENA=0;
	CLK=0;
	DIR=0;	
	ENA1=0;
	CLK1=0;
	DIR1=0;		//初始化电机
	Init_time();   //初始化定时器	   
	while(1)
	{
		Key_scan();
	}	
}
void Init_time()				 //初始化定时器
{
	TMOD |= 0x01;
	TH0=(65536-CYCLE)/256; 		 //给time0装初值
	TL0=(65536-CYCLE)%256;
    IE = 0x82;                     //使得time1的优先级高于time0
	TR0=1;				         //打开中断
}
void Enter_Timer0() interrupt 1				//进入定时器中断
{
	TH0=(65536-CYCLE)/256; 
	TL0=(65536-CYCLE)%256;
	CLK=~CLK;
	CLK1=~CLK1;
	PWM_count++;
	if(PWM_count==(2*cy_count)&&CY_status)
	{
		PWM_count=0;
		TR0=0;
		ENA=0;
		ENA1=0;
	}	
}

/************************按键扫描程序************************
   功能:读取各按键值,判断是否按下,再处理相应事件
   
   注:按键控制程序,由于按键中断优先级高,且每个按键都设计
       为弹起有效, 所以长时间按住不放会导致电机减速甚至停
	   止直至放开按键		      
*************************************************************/
void Key_scan()				   	   
{
	static char i=0;
	if(UP==0)					   //电机1正反转切换
	{
		if(UP==0)
		{
		    DIR=1;
			  ENA=1;		  //启动电机
				TR0=1;		  //开启中断产生脉冲信号
			while(!UP);		//按键按下直到放开
				ENA=0;		  //关闭电机
				TR0=0;		  //关闭中断停止脉冲信号
				CY_status=0;  //刷新步进标志位
		}
	}
	if(DWN==0)					   
	{
		if(DWN==0)
		{
 		  	DIR=0;
			  ENA=1;		  //启动电机
				TR0=1;		  //开启中断产生脉冲信号			
			while(!DWN);	//按键按下直到放开
				ENA=0;		  //关闭电机
				TR0=0;		  //关闭中断停止脉冲信号
				CY_status=0;  //刷新步进标志位			
		}
	}
	if(LFT==0)				   //电机2正反转切换
	{	
		if(LFT==0)
	    {
				DIR1=1;
			  ENA1=1;		  //启动电机
				TR0=1;		  //开启中断产生脉冲信号	
			while(!LFT);
				ENA1=0;		  //关闭电机
				TR0=0;		  //关闭中断停止脉冲信号
				CY_status=0;  //刷新步进标志位		
		}
	}
	if(RHT==0)				   
	{
		if(RHT==0)
		{
			 	DIR1=0;
			  ENA1=1;		  //启动电机
				TR0=1;		  //开启中断产生脉冲信号	
			while(!RHT);
				ENA1=0;		  //关闭电机
				TR0=0;		  //关闭中断停止脉冲信号
				CY_status=0;  //刷新步进标志位	
		}
	}
if(SET==0)				   //加速
	{		
		if(SET==0)
	    {
			while(!SET);
			i--;
			if(i<1)
			i=0;
			CYCLE=Tspeed[i];		
		}
	}
	if(RST==0)				   //减速
	{
		if(RST==0)
		{
			while(!RST);
			i++;
			if(i>10)
			i=10;
			CYCLE=Tspeed[i];
		}
	}	
	}
	

你可能感兴趣的:(步进电机,步进电机驱动)