天天看點

STC15W408AS單片機五向按鍵子產品控制TB6600驅動步進電機源程式

STC15W408AS單片機6按鍵控制2步進電機采用TB6600驅動源程式

程式源碼來源于:51黑電子論壇

  • 程式設計環境keil,自行建立項目,添加main.c,将代碼拷貝進去即可
  • *主要晶片:

    STC15W408AS

  • 程式源碼:
#include<reg52.h>
//電機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];
		}
	}	
	}
	
           

繼續閱讀