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

📄 jcdj01.c

📁 多款电脑绣花机电机驱动控制程序
💻 C
字号:
/***********************************
	42锯齿电机控制程序
**********************************/
#include "REG52.h"
#include <intrins.h>	
#include <math.h>

unsigned int code acctime[11][11]={68,68,68,68,68,68,68,68,68,68,68,	//100/0.33
							114,94,80,70,62,56,51,46,43,40,37,	//150/0.6
							75,66,59,53,48,44,41,38,36,33,31,	//200/0.7??
							75,60,51,43,38,34,31,28,25,23,22,	//250/1
							45,40,36,32,30,27,25,24,22,21,20,	//300/1.1
							45,38,33,30,27,24,22,20,19,18,16,	//350/1.3
							45,36,31,26,23,21,19,17,15,14,13,	//400/1.6
							45,35,29,25,21,19,17,15,14,13,12,	//450/1.8
							45,34,27,23,20,17,15,14,12,11,10,	//500/2
							45,32,25,21,18,14,13,12,11,10,9,		//550/2.3
							45,31,24,20,16,14,12,11,10,9,8		//600/2.5
							};

//**************************************
int data dataen;			//数据选通
int direction;				//正反转

unsigned int revcmd;
unsigned int speed;
unsigned int spd;
unsigned int LorR;
//**************************************
//功能选通信号
sbit address0=P3^6;
sbit address1=P3^7;	
sbit strobe=P3^1;
//锯齿电机驱动信号**************
sbit step=P0^2;
sbit dir=P0^1;
sbit en=P0^0;
//上位机输入信号******************
sbit ad0=P1^0;            //AD8
sbit ad1=P1^1;            //AD9
sbit ad2=P1^2;            //AD10
sbit ad3=P1^3;            //AD11
sbit ad4=P1^4;
sbit ad5=P1^5;            //AD13
sbit ad6=P1^6;
sbit ad7=P1^7;

sbit ad8=P1^0;
sbit ad9=P1^1;
sbit ad10=P1^2;
sbit ad11=P1^3;
sbit ad13=P1^5;
sbit ad12=P3^2;		//C1板数据选通信号INT0
//**************************************
sbit lamp=P0^7;
//**************************************
void	ex44us(void)
{
	int	i=2;
	while(i--);
}
void delay44us(unsigned int nums)
{
	do
	{
	   	ex44us();
		nums--;
	}while(nums!=0);
}
void Ex10us()
{
	data unsigned char t=3;
	while(--t);
}
void Delay10us(unsigned int nums)
{
	do{
	   	Ex10us();
		nums--;
		}while(nums!=0);
}
/**********************************************
		 信号选通
		 address1		address0
		 	0					0			选通AD0-AD7
		 	0					1			选通AD8-AD13、JPOS0、JPOS1
		 	1					0			选通state0~4、err
		 	1					1			选通拨码开关、IN0、IN1、JPOS2	
IN:signal	0~3
***********************************************/
void PitchON(int signal)
{
	switch(signal)
	{
		case 0:
			address0=0;
			address1=0;
		break;
		case 1:
			address0=1;
			address1=0;
		break;
		case 2:
			address0=0;
			address1=1;
		break;
		case 3:
			address0=1;
			address1=1;
		break;
	}
}
/*************************************
	区分命令
	IN:ad8~ad11
	OUT:	1:速度	5:锯齿动作	13:初始化
*************************************/
unsigned int RevCommand()
{
	unsigned int cmd=0;
	PitchON(1);
	Delay10us(10);
	cmd=(unsigned int)ad13;
	cmd=(cmd<<1)|(unsigned int)ad11;
	cmd=(cmd<<1)|(unsigned int)ad10;
	cmd=(cmd<<1)|(unsigned int)ad9;
	cmd=(cmd<<1)|(unsigned int)ad8;
	return (cmd);
}

/*************************************
	IN:ad7~ad0		cmdtype=1:转速	5:锯齿动作	13:初始化
	OUT:档位/运转否
*************************************/
 unsigned int DealCmdData(int cmdtype)
 {
 	unsigned int cmd=0;
 	unsigned int cmdsir[8];
 	int i;
 	
 	PitchON(0);
	Delay10us(10);
 	if(cmdtype==1)	//转速0~60
 	{
 		cmd=ad5;
		cmd=(cmd<<1)|(unsigned int)ad4;
		cmd=(cmd<<1)|(unsigned int)ad3;
		cmd=(cmd<<1)|(unsigned int)ad2;
		cmd=(cmd<<1)|(unsigned int)ad1;
		cmd=(cmd<<1)|(unsigned int)ad0;
	}
	else if(cmdtype==5)		//0:锯齿左/1:锯齿右
 	{
 		cmd=ad0;
	}
	else if(cmdtype==13)
	{
		cmdsir[0]=ad0;
		cmdsir[1]=ad1;
		cmdsir[2]=ad2;
		cmdsir[3]=ad3;
		cmdsir[4]=ad4;
		cmdsir[5]=ad5;
		cmdsir[6]=ad6;
		cmdsir[7]=ad7;
		for(i=0;i<8;i++)
		{
			if(cmdsir[0]!=cmdsir[i])
				return(1);				//通讯不过
		}
		return(0);
	}
 	return (cmd);
}

 /*************************************
	发送一个脉冲(f=1k),驱动电机
*************************************/
void	SendPulse(unsigned int ttime)
{
	if(direction==0)
	{
		step=1;
		dir=1;
	}
	else
	{
		dir=1;
		step=1;
	}
	ex44us();
	
	if(direction==0)
		step=0;
	else
		dir=0;
	delay44us(ttime);
}

void External0(void) interrupt 0 using 2
{
	EA=0;
	dataen=0;
	EA=1;
}
		 		
void main()
{
	unsigned char  i;
	//int checkcom=1;		//开机检查通讯线全低		=1有错误   =0正常
	//int checkcom2=1;		//开机检查通讯线全高		=1有错误   =0正常
	
	for(i=0;i<3;i++)
	{
		lamp=0;
		delay44us(3000);
		lamp=1;
		delay44us(3000);
	}
		
	IT0=1;
	EX0=1;
	TR0=0;
	ET0=0;
	IE0=0;
	EA=1;
  	
  	dataen=1;

	en=1;	//锯齿电机禁止
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	
	/*while(checkcom==1)
	{
		_nop_();
		locklamp=1;		//有错误,熄灯
		mendlamp=1;
		if(dataen==0)
		{
			revcmd=RevCommand();
			dataen=1;
		}
		if(revcmd==13)	
			checkcom=DealCmdData(13);
		if(checkcom==0)
			riseerr=1;
	}
	
	while(checkcom2==1)
	{
		_nop_();
		locklamp=1;		//有错误,熄灯
		mendlamp=1;
		riseerr=0;
		if(dataen==0)
		{
			revcmd=RevCommand();
			dataen=1;
		}
		if(revcmd==13)
			checkcom2=DealCmdData(13);
		if(checkcom2==0)
			riseerr=1;
	}*/
	/*while(run==0)
	{
		speed=40;
		ToUp(speed);
		delay44us(10000);
		ToDown();
		delay44us(20000);
	}*/
	
	while(1)
	{
		revcmd=15;
		
		if(dataen==0)
		{
			revcmd=RevCommand();
			dataen=1;
		}
		switch(revcmd)
		{
			case 15:			//无效
			break;
			case 1:
				speed=DealCmdData(1);
				if(speed>60)
					speed=60;
				if(speed<0)
					speed=0;
				
				if(speed==0)
				{
					TR1=0;
					ET1=0;
					TH1=0;
					TL1=0;	
					step=1;
					dir=1;
					spd=0;
				}
			break;
			case 5://锯齿摆动
				LorR=DealCmdData(5);
				
				if(LorR>1)
					LorR=1;
				if(LorR<0)
					LorR=0;
				
				spd=speed/5;
				spd--;
				spd--;
				if(spd<0)
					spd=0;
				else if(spd>10)
					spd=10;
				
				if(LorR==0)//左
				{
					direction=0;			//电机正转(左摆)
					
					en=0;
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					for(i=0;i<11;i++)
						SendPulse(acctime[spd][i]);
					for(i=0;i<88;i++)
						SendPulse(acctime[spd][10]);
					for(i=0;i<11;i++)
						SendPulse(acctime[spd][10-i]);
					en=1;
				}
				else
				{
					direction=1;			//电机反转(右摆)
					
					en=0;
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					_nop_();
					for(i=0;i<11;i++)
						SendPulse(acctime[spd][i]);
					for(i=0;i<88;i++)
						SendPulse(acctime[spd][10]);
					for(i=0;i<11;i++)
						SendPulse(acctime[spd][10-i]);
					en=1;
				}
			break;
			default:
			break;
		}
	}
}

⌨️ 快捷键说明

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