www.pudn.com > STC89.rar > STC89.c


/*步进电机驱动器,使单片机输出 CP-,CW-,和FRE-,信号给步进电机驱动, 
  高速从500Hz可以加速10490Hz,低速从102Hz可以加速500Hz,*/ 
 
#include  
 
unsigned char bdata out_word;			 
sbit out_word_2=out_word^2;			//脱机信号FRE- 
sbit out_word_3=out_word^3;			//旋转方向CW-,1为正转,0为反转 
sbit out_word_4=out_word^4;			//步进电机输出信号CP- 
 
bit speed_up_flag;					//=1,加速,=0,减速 
bit speed_flag;						//=1,高速,=0,低速 
bit dir;							//=1,反转,=0,正转 
bit off_line;						//脱机标记 
 
unsigned char data keyword;				//键盘输入的键值 
unsigned int data fx;					//存放步进电机频率计数 
 
unsigned char code frequence_code[]= 
{								//高速定时器时间常数,80MHz工作频率,16位计数器 
0xCB,0xEB,//f=500Hz 
0xCC,0xF1,//f=510Hz 
0xCD,0xEC,//f=520Hz 
0xCE,0xDE,//f=530Hz 
0xCF,0xC7,//f=540Hz 
0xD0,0xA7,//f=550Hz 
0xD1,0x80,//f=560Hz 
0xD2,0x51,//f=570Hz 
0xD3,0x1A,//f=580Hz 
0xD3,0xDD,//f=590Hz 
0xD4,0x99,//f=600Hz 
0xD5,0x50,//f=610Hz 
0xD6,0x00,//f=620Hz 
0xD6,0xAA,//f=630Hz 
0xD7,0x50,//f=640Hz 
0xD7,0xF0,//f=650Hz 
0xD8,0x8B,//f=660Hz 
0xD9,0x22,//f=670Hz 
0xD9,0xB5,//f=680Hz 
0xDA,0x43,//f=690Hz 
0xDA,0xCD,//f=700Hz 
0xDB,0x53,//f=710Hz 
0xDB,0xD5,//f=720Hz 
0xDC,0x54,//f=730Hz 
0xDC,0xCF,//f=740Hz 
0xDD,0x48,//f=750Hz 
0xDD,0xBD,//f=760Hz 
0xDE,0x2E,//f=770Hz 
0xDE,0x9D,//f=780Hz 
0xDF,0x0A,//f=790Hz 
0xDF,0x73,//f=800Hz 
0xDF,0xDA,//f=810Hz 
0xE0,0x3E,//f=820Hz 
0xE0,0xA0,//f=830Hz 
0xE1,0x00,//f=840Hz 
0xE1,0x5D,//f=850Hz 
0xE1,0xB9,//f=860Hz 
0xE2,0x12,//f=870Hz 
0xE2,0x69,//f=880Hz 
0xE2,0xBE,//f=890Hz 
0xE3,0x11,//f=900Hz 
0xE3,0x62,//f=910Hz 
0xE3,0xB2,//f=920Hz 
0xE4,0x00,//f=930Hz 
0xE4,0x4C,//f=940Hz 
0xE4,0x97,//f=950Hz 
0xE4,0xE0,//f=960Hz 
0xE5,0x28,//f=970Hz 
0xE5,0x6E,//f=980Hz 
0xE5,0xB2,//f=990Hz 
0xE5,0xF6,//f=1000Hz 
//…… 
//…… 
0xFD,0x66,//f=10000Hz 
0xFD,0x66,//f=10010Hz 
0xFD,0x67,//f=10020Hz 
0xFD,0x68,//f=10030Hz 
0xFD,0x68,//f=10040Hz 
0xFD,0x69,//f=10050Hz 
0xFD,0x6A,//f=10060Hz 
0xFD,0x6A,//f=10070Hz 
0xFD,0x6B,//f=10080Hz 
0xFD,0x6C,//f=10090Hz 
0xFD,0x6C,//f=10100Hz 
0xFD,0x6D,//f=10110Hz 
0xFD,0x6E,//f=10120Hz 
0xFD,0x6E,//f=10130Hz 
0xFD,0x6F,//f=10140Hz 
0xFD,0x70,//f=10150Hz 
0xFD,0x70,//f=10160Hz 
0xFD,0x71,//f=10170Hz 
0xFD,0x72,//f=10180Hz 
0xFD,0x72,//f=10190Hz 
0xFD,0x73,//f=10200Hz 
0xFD,0x74,//f=10210Hz 
0xFD,0x74,//f=10220Hz 
0xFD,0x75,//f=10230Hz 
0xFD,0x75,//f=10240Hz 
0xFD,0x76,//f=10250Hz 
0xFD,0x77,//f=10260Hz 
0xFD,0x77,//f=10270Hz 
0xFD,0x78,//f=10280Hz 
0xFD,0x79,//f=10290Hz 
0xFD,0x79,//f=10300Hz 
0xFD,0x7A,//f=10310Hz 
0xFD,0x7B,//f=10320Hz 
0xFD,0x7B,//f=10330Hz 
0xFD,0x7C,//f=10340Hz 
0xFD,0x7C,//f=10350Hz 
0xFD,0x7D,//f=10360Hz 
0xFD,0x7E,//f=10370Hz 
0xFD,0x7E,//f=10380Hz 
0xFD,0x7F,//f=10390Hz 
0xFD,0x7F,//f=10400Hz 
0xFD,0x80,//f=10410Hz 
0xFD,0x81,//f=10420Hz 
0xFD,0x81,//f=10430Hz 
0xFD,0x82,//f=10440Hz 
0xFD,0x83,//f=10450Hz 
0xFD,0x83,//f=10460Hz 
0xFD,0x84,//f=10470Hz 
0xFD,0x84,//f=10480Hz 
0xFD,0x85,//f=10490Hz 
}; 
 
unsigned char code frequence_code1[]= 
{					//低速定时器时间常数,80MHz工作频率,16位计数器 
0x00,0xB0,//f=102Hz 
0x07,0xFB,//f=105Hz 
0x13,0x42,//f=110Hz 
0x1D,0x8D,//f=115Hz 
0x26,0xFD,//f=120Hz 
0x2F,0xAB,//f=125Hz 
0x37,0xAE,//f=130Hz 
0x3F,0x1A,//f=135Hz 
0x45,0xFD,//f=140Hz 
0x4C,0x67,//f=145Hz 
0x52,0x64,//f=150Hz 
0x57,0xFE,//f=155Hz 
0x5D,0x3E,//f=160Hz 
0x62,0x2C,//f=165Hz 
0x66,0xD1,//f=170Hz 
0x6B,0x31,//f=175Hz 
0x6F,0x53,//f=180Hz 
0x73,0x3C,//f=185Hz 
0x76,0xF1,//f=190Hz 
0x7A,0x74,//f=195Hz 
0x7D,0xCB,//f=200Hz 
0x80,0xF8,//f=205Hz 
0x83,0xFE,//f=210Hz 
0x86,0xE1,//f=215Hz 
0x89,0xA1,//f=220Hz 
0x8C,0x43,//f=225Hz 
0x8E,0xC7,//f=230Hz 
0x91,0x30,//f=235Hz 
0x93,0x7F,//f=240Hz 
0x95,0xB6,//f=245Hz 
0x97,0xD6,//f=250Hz 
0x99,0xE1,//f=255Hz 
0x9B,0xD7,//f=260Hz 
0x9D,0xBB,//f=265Hz 
0x9F,0x8D,//f=270Hz 
0xA1,0x4E,//f=275Hz 
0xA2,0xFF,//f=280Hz 
0xA4,0xA1,//f=285Hz 
0xA6,0x34,//f=290Hz 
0xA7,0xBA,//f=295Hz 
0xA9,0x32,//f=300Hz 
0xAA,0x9F,//f=305Hz 
0xAB,0xFF,//f=310Hz 
0xAD,0x54,//f=315Hz 
0xAE,0x9F,//f=320Hz 
0xAF,0xE0,//f=325Hz 
0xB1,0x16,//f=330Hz 
0xB2,0x44,//f=335Hz 
0xB3,0x69,//f=340Hz 
0xB4,0x85,//f=345Hz 
0xB5,0x99,//f=350Hz 
0xB6,0xA5,//f=355Hz 
0xB7,0xAA,//f=360Hz 
0xB8,0xA8,//f=365Hz 
0xB9,0x9E,//f=370Hz 
0xBA,0x8F,//f=375Hz 
0xBB,0x79,//f=380Hz 
0xBC,0x5C,//f=385Hz 
0xBD,0x3A,//f=390Hz 
0xBE,0x13,//f=395Hz 
0xBE,0xE6,//f=400Hz 
0xBF,0xB4,//f=405Hz 
0xC0,0x7C,//f=410Hz 
0xC1,0x40,//f=415Hz 
0xC1,0xFF,//f=420Hz 
0xC2,0xBA,//f=425Hz 
0xC3,0x71,//f=430Hz 
0xC4,0x23,//f=435Hz 
0xC4,0xD1,//f=440Hz 
0xC5,0x7B,//f=445Hz 
0xC6,0x22,//f=450Hz 
0xC6,0xC4,//f=455Hz 
0xC7,0x64,//f=460Hz 
0xC8,0x00,//f=465Hz 
0xC8,0x98,//f=470Hz 
0xC9,0x2D,//f=475Hz 
0xC9,0xC0,//f=480Hz 
0xCA,0x4F,//f=485Hz 
0xCA,0xDB,//f=490Hz 
0xCB,0x64,//f=495Hz 
0xCB,0xEB,//f=500Hz 
}; 
 
void output(void);				//步进电机输出 
void speed_up(void);				//加速 
void speed_down(void);			//减速 
void stop(void);					//步进电机停止进给 
input(void);					//键盘输入 
 
main() 
{ 
	TMOD=0x11;			//定时器0为方式1,定时器1为方式1 
	IP=0x0B;				//定时器0中断、定时器1中断和外部中断0为高优先级 
	IE=0xA1;				//开放显示中断和外部中断0 
	P1_6=0;				//联机 
	fast_feed=0;			//连续快进 
	speed_flag=0;			//低速 
	off_line=0;				//与控制系统联线 
	fx=0; 
	do 
	{ 
		input();					//键输入 
		switch(keyword) 
		{ 
		case	0:	off_line=~off_line;	//与控制系统联线/断线 
				fx=0; 
				if (off_line==0) 
					{ 
					out_word_2=0;	//输出脱机信号FRE- 
					} 
				break; 
		case	1:	if (off_line!=0) 
					break;		//返回命令状态 
		case	2:	outcmd();break;		//快进输出,正向 
		case	3:	outcmd();break;		//快进输出,反向 
		case	4:	if (off_line!=0) 
					{			//高低速切换 
					speed_flag=~speed_flag; 
					fx=0; 
					} 
				break; 
		default:	break; 
		} 
	output();						//控制步进电机输出 
	} 
while(1); 
} 
 
void outcmd(void)					//快进输出命令 
{ 
	unsigned char key; 
	fx=0; 
	do 
		{ 
		if (off_line==0) return;			//与控制系统联线时不能快进 
		key=key_word; 
		if ((key&0x0F)==2)			//按下"2"键 
			{ 
			out_word&=0xE7;		//X正向输出 
			goto out1; 
			} 
		else 
			{ 
			if ((key&0x0F)==3)		//按下"3"键 
				{ 
				out_word_3=1;		// CW+,反向 
				out_word_4=0;		//发CP-信号 
out1:			x_speed_up_flag=1;		//加速 
				ET0=1;			//允许定时器0中断 
				TR0=1; 
				goto out3; 
				} 
			else 
				speed_up_flag=0;	//减速 
			} 
		} 
out3:	while (key!=0xFF); 
} 
 
void speed_up(void)					//步进电机加速 
{ 
	if (speed_flag!=0)				//高速 
		{ 
		TH0=frequence_code[fx]; 
		TL0=frequence_code[fx+1]; 
		if (fx<1998) fx=fx+2; 
		} 
	else 
		{						//低速 
		TH0=frequence_code1[fx]; 
		TL0=frequence_code1[fx+1]; 
		if (fx<81) fx=fx+2; 
		} 
} 
 
void speed_down(void)				//步进电机减速 
{ 
	if (speed_flag!=0)				//高速 
		{ 
		if (fx>0) 
			{ 
			fx=fx-2; 
			TH0=frequence_code[fx]; 
			TL0=frequence_code[fx+1]; 
			} 
		else 
			stop();				//步进电机停止进给 
		} 
	else							//低速 
		stop();					//步进电机停止进给 
} 
 
void stop(void)						//步进电机停止进给 
{ 
	out_word_4=1;					//停发信号 
	TR0=0;						//速度太低,关定时器0,步进电机停止 
	ET0=0;						//禁止定时器0中断 
} 
 
void output(void) 
{ 
	P1=out_word; 
} 
 
void time0_int(void) interrupt 1			 //定时器0中断服务程序,X快进 
{ 
	if (speed_up_flag!=0) 
speed_up();					//加速或恒速 
	else 
speed_down();				//减速 
output(); 
}