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

📄 mocontrol.c

📁 一个步进电机的驱动C程序
💻 C
字号:
// 目标器件: STC12C4052AD
// 系统频率: 外部时钟,12M.

#include <STC12C2052AD.H>
#include <intrins.h>
#define 	uint 	unsigned int
#define 	uchar 	unsigned char


#define 	DogReset() 			WDT_CONTR=0x36

#define		vBtnVal_Null		0x00	// ceeback/20070316
#define		vBtnVal_StartUp		0x01	//起停
#define		vBtnVal_HiSpeed		0x02	//高速
#define		vBtnVal_MiSpeed		0x04	//中速
#define		vBtnVal_LoSpeed		0x08	//低速

#define		vBtnAct_Null		0
#define		vBtnAct_Push		1
#define		vBtnAct_Pop			2
#define		vBtnAct_Keep		3

#define		vT0HVal				0xff
#define		vT0LVal				0x9c

#define		vBaudTime			0xfa

// T0 定时 0.1ms.作为系统计时用,
#define		vT01ms				10
#define		vT10ms				10
#define		vT100ms				10
#define		vT01S				10		// 1 s = 10 ms * 100


#define		WaitSpeed			0
#define		LoSpeed				1
#define		MiSpeed				2
#define		HiSpeed				3


#define 	STOP 		0
#define		WORK		1

#define 	Forward 		1
#define		Backward			0

#define		vSetNum		30000

uchar	idata	KeyNum;
uchar	idata	cBtnVal;			// 按钮取值
uchar	idata	SpeedType;

// 定时器延时
uchar	idata	cT01ms;
uchar	idata	cT10ms;
uchar	idata	cT100ms;
uchar	idata	cT01s;

uchar	idata	Time_01ms;

uchar	idata	cDY_Clock;			// 时钟计时

//正转
uchar	idata	StepTab1[6]={0x01,0x02,0x04};			//三相单三拍
uchar	idata	StepTab2[6]={0x03,0x05,0x06};			//三相双三拍
uchar	idata	StepTab3[12]={0x01,0x03,0x02,0x05,0x04,0x06};		//三相六拍

//反转
uchar	idata	StepTabRev1[6]={0x02,0x01,0x04};		//三相单三拍
uchar	idata	StepTabRev2[6]={0x05,0x03,0x06};		//三相双三拍
uchar	idata	StepTabRev3[12]={0x02,0x05,0x01,0x03,0x04,0x06};	//三相六拍

uchar cTime;
uint SetNum;
uint TurnNum;

bit			b_Power;				// 电机起停标志
bit			SpeedFlag;

//-----------------------------------------------------------------------------
// 函数声明
//-----------------------------------------------------------------------------

void Para_initial(void);


/**************************************************************************
*    函数原型: void delay_1us(uint Count)
*    功    能: 延时Count个1us
**************************************************************************/
void delay_1us(register uint Count){

	for(;Count>0;Count--){
//		_nop_();
//		DogReset();
		}
}

/**************************************************************************
*    函数原型: void delay_ms(uint Count)
*    功    能: 延时Count个ms
**************************************************************************/
void delay_ms(register uint Count){
	register uchar T;

	for(;Count>0;Count--){
		for(T=0;T<80;T++){
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
			_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
		}
		DogReset();
	}
}


/**************************************************************************
*    函数原型: uchar ButtonScan(void);
*    功    能: 对按钮进行扫描,返回按钮值
**************************************************************************/
uchar key_scan(void){

	uchar ikey;
	ikey=~(P3&0x0f)&0x0f;
	return(ikey&0x0f);
}

/**************************************************************************
*    函数原型: uchar ButtonScan(void);
*    功    能: 对按钮进行扫描,返回按钮值
**************************************************************************/
uchar ButtonAction(void){
	uchar cButton;

	cButton=key_scan();
	if(cButton==cBtnVal){
		if(cButton==vBtnVal_Null)	// 无按键
			return(vBtnAct_Null);

		else	// 按键保持
			return(vBtnAct_Keep);
	}
	else{
		delay_ms(20);
		if(key_scan()==cButton){
			cBtnVal=cButton;

			if(cButton==vBtnVal_Null){	// 按键弹起
				return(vBtnAct_Pop);
			}
			else{						// 按键按下
				return(vBtnAct_Push);
			}
		}
	}
}

/**************************************************************************
*    函数原型: void ButtonHandle(void);
*    功    能: 处理按钮输入
**************************************************************************/
void ButtonHandle(void){

	uchar cBtnType;
	DogReset();
	cBtnType=ButtonAction();
	if(cBtnType==vBtnAct_Push){

		switch(cBtnVal){

			case vBtnVal_StartUp:
				if(++KeyNum>3){
					KeyNum=0;
				}
				switch(KeyNum){
					case WaitSpeed:
						b_Power=STOP;
						break;

					case LoSpeed:
						SetNum = 0;
						b_Power = WORK;
						cTime = 10;
						break;

					case MiSpeed:
						SetNum = 0;
						b_Power = WORK;
						cTime = 6;
						break;

					case HiSpeed:
						SetNum = 0;
						b_Power = WORK;
						cTime = 2;
						break;

					default:
						break;
					}
			default:
				break;
		}
	DogReset();
	}
}
/**************************************************************************
*    函数原型: void SpeedControl(bit Drt, uint TurnNum);
*    功    能: 处理速度变化(ctemp采用范围控制,Pre_Pulse 脉冲采用精确控制)
**************************************************************************/
void SpeedControl(bit Drt){
	uchar i;
	if(b_Power){
		if(Drt){
			P1&=0xf8;
			P1|=StepTab1[i++];
			delay_1us(10);
			P1&=0xf8;
		}
		else{
			P1&=0xf8;
			P1|=StepTabRev1[i++];
			delay_1us(10);
			P1&=0xf8;
		}
		if(i>2){
			i=0;
			if(++SetNum >= vSetNum){
//				b_Power = STOP;
			}
		}
	}
}

/**************************************************************************
*    函数原型: void SpeedControl(bit Drt, uint TurnNum);
*    功    能: 处理速度变化(ctemp采用范围控制,Pre_Pulse 脉冲采用精确控制)
**************************************************************************/
/*
void SpeedControl(bit Drt){
	uchar i;
	if(b_Power){
		if(Drt){
			P1&=0xf8;
			P1|=StepTab1[i++];
		}
		else{
			P1&=0xf8;
			P1|=StepTabRev1[i++];
		}
		if(i>5){
			i=0;
			if(++SetNum >= vSetNum){
//				b_Power = STOP;
			}
		}
	}
}

/**************************************************************************
*    函数原型: void Para_initial(void);
*    功    能: 参数初始化
**************************************************************************/
void Para_initial(void){

	b_Power 	= 	STOP;
	SpeedType	=	WaitSpeed;
	cDY_Clock	= 	0xff;
	KeyNum=0;

	cT01ms		=	vT01ms;
	cT10ms		=	vT10ms;
	cT100ms		= 	vT100ms;
	cT01s		= 	vT01S;

	Time_01ms	=	0;


}


/**************************************************************************
*    函数原型: void system_initial(void);
*    功    能: 系统初始化
**************************************************************************/
void system_initial(void){

	IE=0;

	DogReset(); 				// 已针对 STC89C58RD+ 作修改.06-04-06
	Para_initial();

	TCON 	=0x50; 				// TR0=1
	SCON	=0x50;
	TMOD	=0x21; 				// T0:Time 16bit;	T1:8位自动重装载.

	TH0 =vT0HVal;				// T0:系统计时.
	TL0 =vT0LVal;
	ET0 =1;
	TR0 =1;						// 启动波特率发生器


	TH1 = vBaudTime;			// 波特率目前为9600Hz
	PCON&=0x7f;					// 串口通信速率倍数为1

	ET1 =1;
	TR1 =0;						// 启动波特率发生器
	ES  =1;						// 允许串口中断

	IP	=0x02; 				// T0 优先级高
	IPH =0x12;					//PT2H=1,PT0H=1

	EA  =1;


}

/**************************************************************************
*    函数原型: void main(void);
*    功    能: 主程序
**************************************************************************/
void main(void){

	system_initial();

	while(1){

		DogReset();

		ButtonHandle();

//		if(b_Power){
//			SpeedControl(Forward);
//		}

	}
}

/**************************************************************************
*    函数原型: void T0_INT(void) interrupt 1 using 1;
*    功    能: 全局定时
**************************************************************************/
void T0_INT(void) interrupt 1 using 0{

	TH0	=	vT0HVal;				// 时基0.1ms
	TL0	=	vT0LVal;

/*
	if(Time_01ms++>12){
		Time_01ms=0;
	}
*/

	if(!(--cT01ms)){				//1ms
		cT01ms=vT01ms;


		if(!(--cT10ms)){			//10ms
			cT10ms=vT10ms;

			SpeedControl(Forward);

			if(!(--cT100ms)){		//100ms

				cT100ms=vT100ms;

				if(!(--cT01s)){		//1s
					cT01s=vT01S;

				}
			}
		}
	}
}

/**************************************************************************
*   END
*   END
**************************************************************************/

⌨️ 快捷键说明

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