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

📄 stc89.c

📁 步进电机驱动器
💻 C
字号:
/*步进电机驱动器,使单片机输出 CP-,CW-,和FRE-,信号给步进电机驱动,
  高速从500Hz可以加速10490Hz,低速从102Hz可以加速500Hz,*/

#include <at89x52.h>

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();
}

⌨️ 快捷键说明

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