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

📄 ei10.c

📁 单片机在纺织设备上的应用,单片机控制变频器,通过多段速控制,和不同算法,加工不同的绕线形状.
💻 C
字号:

#include <reg52.h>
#include <absacc.h>
#define Address 0x01 //本地址:
#define uchar unsigned char
#define uint unsigned int
#define BYTE  unsigned char
#define WORD  unsigned int
#define CS	  01

#define   CSTIME   10//超时时间
#define   STOP	0x00//停
#define   UPSTEP0	0x08
#define   UPSTEP1	0x01
#define   UPSTEP2	0x02
#define   UPSTEP3	0x03
#define   UPSTEP4	0x04
#define   UPSTEP5	0x05
#define   UPSTEP6	0x06
#define   UPSTEP7	0x07

#define   DOWNSTEP0	0x88
#define   DOWNSTEP1	0x81
#define   DOWNSTEP2	0x82
#define   DOWNSTEP3	0x83
#define   DOWNSTEP4	0x84
#define   DOWNSTEP5	0x85
#define   DOWNSTEP6	0x86
#define   DOWNSTEP7 0x87
#define	Bsf(bt)		bt = 1;
#define	Bcf(bt)		bt = 0;


#define  	KS_IN		X00//上接近开关
#define  	KZ_IN        	X01//下接近开关
#define  	KX_IN        	X02//中接近开关
#define  	KRUN_IN   	X03//运行开关
#define	TIME0_IN	X04//设定绕度1
#define	TIME1_IN	X05//设定绕度2
#define	TIME2_IN	X06//设定绕度3
#define	TIME3_IN	X07//设定绕度4
#define	TIME4_IN	X10//设定绕度5
#define	TIME5_IN	X11//设定绕度6
#define	TIME6_IN	X12//设定绕度7

#define  	M0_OUT		Y00//正转/停
#define  	M1_OUT		Y01//反转/停
#define  	M2_OUT		Y02//故障清除
#define  	M3_OUT		Y03//多段指令1
#define  	M4_OUT		Y04//多段指令2
#define  	M5_OUT		Y05//多段指令3
#define	BJ_OUT		Y06//
sbit    IN00  =  P2^3;
sbit    IN01  = P3^6;
sbit    IN02  = P3^7;
sbit    IN03  = P3^5;
sbit    IN04  = P3^4;
sbit    IN05  = P3^3;
sbit    IN06  = P3^2;
sbit    IN07  = P1^6;
sbit    IN10  = P1^7;
sbit    IN11  = P1^5;
sbit    IN12  = P1^4;
sbit    OUT00 = P2^4;
sbit    OUT01 = P2^5;
sbit    OUT02 = P2^6;
sbit    OUT03 = P2^7;
sbit    OUT04 = P0^4;
sbit    OUT05 = P0^5;
sbit    OUT06 = P0^3;
sbit    OUT07 = P0^2;
sbit    OUT10 = P0^1;
sbit    OUT11 = P0^0;
sbit    RCK595= P0^7;
sbit    SEG595= P2^0;
sbit    SRCK595=P2^1;
sbit    SC75176= P0^6;
//sbit    SC75176=P2^2;
sbit    WTDCS    = P1^0;
sbit    SOUT  = P1^1;
sbit    SCK   =	P1^2;
sbit    SIN   =	P1^3;

uchar bdata flag;
uchar bdata X0;//
uchar bdata X1;//

uchar bdata Y0;//
uchar bdata Y1;//



typedef struct
{
	uchar	AutoStep;//自动步
  	uint  	RunMsTick;//运行毫秒滴答
  	uchar	RunMsTickFlag;//运行毫秒滴答标志
	uint  	TestMsTick;//测试运行毫秒滴答

  	uint  	SMsTickSave;//保存向上运行毫秒滴答
  	uint  	XMsTickSave;//保存向下运行毫秒滴答
  	uchar 	XStatus;//下限运行到位
  	uchar	SStatus;//上限运行到位
  	uchar	ZStatus;//中限运行到位
	uchar	Speed;//速度
	uchar	OverScecond;//超时
	uchar	OverScecondFlag;//超时标志
	uchar 	Run;//开始运行
	uchar	Worm;//报警
	uint           AddStep;//每步加的时间
        void	(*GetStus)();//得到自动运行状态
        void	(*PutCon)();//输出控制
        uint	(*GetAddStep)();//得到步数细分
}SYS,* PSYS;
SYS  	SysAuto;
PSYS 	PSysAuto;
typedef struct
{
	uchar	Step;//自动步
  	uint  	UpTime;//运行毫秒滴答
  	uchar	UPTimeFlag;//运行毫秒滴答标志
}KEY1,* PKEY1;
KEY1	Key;
PKEY1	PKey;
static unsigned char idata LED[03];//定义X0,X1,RUN ,POWER,STOP,Y0,Y1输出显示
//static unsigned char idata check _at_ 0x80;
sbit     X00     = X0^0;
sbit     X01     = X0^1;
sbit     X02     = X0^2;
sbit     X03     = X0^3;
sbit     X04     = X0^4;
sbit     X05     = X0^5;
sbit     X06     = X0^6;
sbit     X07     = X0^7;
sbit     X10     = X1^0;
sbit     X11     = X1^1;
sbit     X12     = X1^2;
sbit     X13     = X1^3;
sbit     X14     = X1^4;
sbit     X15     = X1^5;
sbit     X16     = X1^6;
sbit     X17     = X1^7;

///////////////////////
sbit     Y00     = Y0^0;
sbit     Y01     = Y0^1;
sbit     Y02     = Y0^2;
sbit     Y03     = Y0^3;
sbit     Y04     = Y0^4;
sbit     Y05     = Y0^5;
sbit     Y06     = Y0^6;
sbit     Y07     = Y0^7;
sbit     Y10     = Y1^0;
sbit     Y11     = Y1^1;
sbit     Y12     = Y1^2;
sbit     Y13     = Y1^3;
sbit     Y14     = Y1^4;
sbit     Y15     = Y1^5;
sbit     Y16     = Y1^6;
sbit     Y17     = Y1^7;
sbit     Y03_LED = ACC^0;
sbit     Y04_LED = ACC^1;
sbit     Y05_LED = ACC^2;
sbit     Y06_LED = ACC^3;
sbit     Y07_LED = ACC^4;
sbit     Y11_LED = ACC^5;
sbit     Y10_LED = ACC^6;
sbit     Y00_LED = ACC^7;
////////////////////////
sbit     POWER_LED=ACC^0;
sbit     RUN_LED = ACC^1;
sbit     STOP_LED =ACC^2;
sbit     Y01_LED = ACC^3;
sbit     Y02_LED = ACC^4;
sbit     X07_LED = ACC^5;
sbit     X06_LED = ACC^6;
sbit     X05_LED = ACC^7;
////////////////////////
sbit     X04_LED = ACC^0;
sbit     X03_LED = ACC^1;
sbit     X12_LED = ACC^2;
sbit     X11_LED = ACC^3;
sbit     X10_LED = ACC^4;
sbit     X00_LED = ACC^5;
sbit     X01_LED = ACC^6;
sbit     X02_LED = ACC^7;


sfr  T2MOD    = 0xC9;


void Init();//主程序初始化
void GetKey();//开关输入
void Out();//输出更新
alien void  WDT_EN();
alien uchar UpDate(uchar tt);//更新595汇编模块中的程序
void		Delay(uchar time);//延时1*Xms
void 	AutoRun();//自动运行
void    	GetStus();//得到自动运行状态
void    	PutCon();//输出控制
uint		GetAddStep();//得到步数细分


void main()
{
	Init();//主程序初始化
//	WDT_EN();//开看门狗
  	Delay(250);//延时250ms
  	WTDCS=~WTDCS;
  	Delay(250);//延时250ms
  	WTDCS=~WTDCS;
  	Delay(250);//延时250ms
  	WTDCS=~WTDCS;
  	Delay(250);//延时250ms
        PSysAuto = &SysAuto;
        PSysAuto->GetStus = GetStus;
	PSysAuto->PutCon = PutCon;
	PSysAuto->GetAddStep = GetAddStep;
	PKey = &Key;
  	while(1)
	{
    		WTDCS=~WTDCS;
    		GetKey();//开关输入
    		AutoRun();//自动运行
    		Out();//输出更新
  	}
}


//功能:自动运行
void AutoRun()
{
//得到输入信号
	PSysAuto->GetStus();
	PSysAuto->AddStep = PSysAuto->GetAddStep();//得到步数细分
	if(PSysAuto->AutoStep > 6 | PSysAuto->Run == 0 | PSysAuto->Worm == CS)
	{
		PSysAuto->AutoStep = 0;
		if(PSysAuto->Run == 0)
		{
			PSysAuto->Worm = 0;
		}
  	}

  	switch(PSysAuto->AutoStep)
	{
		case 0:
			PSysAuto->Speed = STOP;
			PSysAuto->AutoStep++;
		break;//保护功能
		case 1:
			if(PSysAuto->XStatus)
			{
   				PSysAuto->AutoStep = 2;
			}
			else
			{
				PSysAuto->Speed = DOWNSTEP2;
				PSysAuto->OverScecond = CSTIME;
				Bcf(PSysAuto->OverScecondFlag);
                                PSysAuto->AutoStep++;
			}

    		break;//找初始态Then 系统往下
    		case 2:
			if(PSysAuto->XStatus)
			{
				PSysAuto->Speed = UPSTEP1;
				PSysAuto->TestMsTick = 0;
				PSysAuto->OverScecond = CSTIME;
				Bcf(PSysAuto->OverScecondFlag);
				PSysAuto->AutoStep++;
			}
			if(PSysAuto->OverScecondFlag)
			{
				PSysAuto->Worm = CS;
				PSysAuto->AutoStep = 0;
			}
    		break;//找到初始态Then 系统往上
    		case 3:
			if(PSysAuto->ZStatus)
			{
				PSysAuto->SMsTickSave = PSysAuto->TestMsTick;
				PSysAuto->Speed = DOWNSTEP2;
				PSysAuto->TestMsTick = 0;
				PSysAuto->OverScecond = CSTIME;
				Bcf(PSysAuto->OverScecondFlag);
				PSysAuto->AutoStep++;
			}
			if(PSysAuto->OverScecondFlag)
			{
				PSysAuto->Worm = CS;
				PSysAuto->AutoStep = 0;
			}

    		break;//得到向上时间then 系统向下
    		case 4:
			if(PSysAuto->XStatus)
			{
				PSysAuto->XMsTickSave = PSysAuto->TestMsTick;
				PSysAuto->Speed = UPSTEP1;
				PSysAuto->RunMsTick = PSysAuto->SMsTickSave+PSysAuto->AddStep;
				Bcf(PSysAuto->RunMsTickFlag);

				PSysAuto->OverScecond = CSTIME;
				Bcf(PSysAuto->OverScecondFlag);
				PSysAuto->AutoStep++;
			}
			if(PSysAuto->OverScecondFlag)
			{
				PSysAuto->Worm = CS;
				PSysAuto->AutoStep = 0;
			}

    		break;//得到向下时间then 系统向上即运行开始
    		case 5:
			if(PSysAuto->RunMsTickFlag)
			{
				PSysAuto->Speed = DOWNSTEP2;
				PSysAuto->RunMsTick = PSysAuto->XMsTickSave;
				Bcf(PSysAuto->RunMsTickFlag)
				PSysAuto->OverScecond = CSTIME;
				Bcf(PSysAuto->OverScecondFlag);
				PSysAuto->AutoStep++;
			}
			if(PSysAuto->SStatus)
			{
				PSysAuto->AutoStep = 1;


			}//结束一个周期
			if(PSysAuto->OverScecondFlag)
			{
				PSysAuto->Worm = CS;
				PSysAuto->AutoStep = 0;
			}
		break;//向上运行时间到then 系统向下
		case 6:
			if(PSysAuto->RunMsTickFlag)
			{
				PSysAuto->Speed = UPSTEP1;
				PSysAuto->RunMsTick = PSysAuto->SMsTickSave+PSysAuto->AddStep;
				Bcf(PSysAuto->RunMsTickFlag);
				PSysAuto->AutoStep = 5;
			}
			if(PSysAuto->OverScecondFlag)
			{
				PSysAuto->Worm = CS;
				PSysAuto->AutoStep = 0;
			}

		break;//向上运行时间到then 系统向下

	}
	PSysAuto-> PutCon();

}


/*
	得到步数细分
*/
uint	GetAddStep()
{
	uint		temp;
	temp = 0;
	if(TIME0_IN)	temp |= (0x01<<0);
	if(TIME1_IN)	temp |= (0x01<<1);
	if(TIME2_IN)	temp |= (0x01<<2);
	if(TIME3_IN)	temp |= (0x01<<3);
	if(TIME4_IN)	temp |= (0x01<<4);
	if(TIME5_IN)	temp |= (0x01<<5);
	if(TIME6_IN)	temp |= (0x01<<6);
	return	(temp+1);
}
//输出控制
void PutCon()
{
	M0_OUT = 0;
	M1_OUT = 0;
	M2_OUT = 0;
	M3_OUT = 0;
	M4_OUT = 0;
	M5_OUT = 0;
	if(PSysAuto->Worm)
	{
		BJ_OUT = 1;
	}
	else
	{
		BJ_OUT = 0;
	}
	if(PSysAuto->Speed == 0)
	{
		return;
	}
	if(PSysAuto->Speed &0x80)
	{
		M0_OUT = 1;
	}
	else
	{
		M1_OUT = 1;
	}
	if(PSysAuto->Speed &0X01)
	{
		M3_OUT = 1;
	}
	else
	{
		M3_OUT = 0;
	}
	if(PSysAuto->Speed &0X02)
	{
		M4_OUT = 1;
	}
	else
	{
		M4_OUT = 0;
	}
	if(PSysAuto->Speed &0X04)
	{
		M5_OUT = 1;
	}
	else
	{
		M5_OUT = 0;
	}
}
//功能:得到自动运行状态
void GetStus()
{
	if(KS_IN)
	{
		PSysAuto->XStatus = 1;
	}
	else
	{
		PSysAuto->XStatus = 0;
	}
	if(KX_IN)
	{
		PSysAuto->SStatus = 1;
	}
	else
	{
		PSysAuto->SStatus = 0;
	}
	if(KZ_IN)
	{
		PSysAuto->ZStatus = 1;
	}
	else
	{
		PSysAuto->ZStatus = 0;
	}
	if(KRUN_IN)
	{
		PSysAuto->Run = 1;
	}
	else
	{
		PSysAuto->Run = 0;
	}
}


/*
功能:主程序初始化
输入参数:NC
输出参数:NC
作者:徐益武
2006/1/15
修改次数:0
*/
void Init()
{
 	TMOD = 0x21;
  	TR0 = 1;
  	ET0 = 1;
  	EA = 1;
	TH0 = 0;
	TL0 = 0;
  	Delay(1);
}

void GetKey()
{
 	static uchar Temp1,Temp2,Tempp1,Tempp2;
  	uchar  Temp,Tempp;
	if(PKey->UPTimeFlag)
	{
		PKey->UpTime = 0;
		Bcf(PKey->UPTimeFlag);
  		Temp=0; Tempp=0;
  		IN00=1;IN01=1;IN02=1;IN03=1;IN04=1;IN05=1;IN06=1;IN07=1;
  		IN10=1;IN11=1;IN12=1;
  		if(IN00)     Temp=Temp&0xfe;
  		else         Temp=Temp|0x01;
  		if(IN01)     Temp=Temp&0xfd;
  		else         Temp=Temp|0x02;
  		if(IN02)     Temp=Temp&0xfb;
  		else         Temp=Temp|0x04;
  		if(IN03)     Temp=Temp&0xf7;
  		else         Temp=Temp|0x08;
  		if(IN04)     Temp=Temp&0xef;
  		else         Temp=Temp|0x10;
  		if(IN05)     Temp=Temp&0xdf;
  		else         Temp=Temp|0x20;
  		if(IN06)     Temp=Temp&0xbf;
  		else         Temp=Temp|0x40;
  		if(IN07)     Temp=Temp&0x7f;
 		else         Temp=Temp|0x80;
  		if(IN10)     Tempp=Tempp&0xfe;
  		else         Tempp=Tempp|0x01;
  		if(IN11)     Tempp=Tempp&0xfd;
  		else         Tempp=Tempp|0x02;
  		if(IN12)     Tempp=Tempp&0xfb;
  		else         Tempp=Tempp|0x04;
  		switch(PKey->Step & 0x1)
		{
   			 case 0:
      				if(Temp!=Temp1||Tempp!=Tempp1)
					{
        					PKey->Step = 1;
        					Temp2=Temp; Tempp2=Tempp;
      					}
    			break;
   		 	case 1:
      				if(Temp==Temp2&&Tempp==Tempp2)
        				{
        					Temp1=Temp;Tempp1=Tempp;
        					X0=Temp;X1=Tempp;
      					}
      				PKey->Step = 0;
    			break;
  		}
	}
}

/*
功能:输出更新
输入参数:NC
输出参数:NC
作者:徐益武
2006/1/15
修改次数:0
*/
void Out()
{
/*
;Y03_LED    BIT     ACC.0
;Y04_LED    BIT     ACC.1
;Y05_LED    BIT     ACC.2
;Y06_LED    BIT     ACC.3
;Y07_LED    BIT     ACC.4
;Y11_LED    BIT     ACC.5
;Y10_LED    BIT     ACC.6
;Y00_LED    BIT     ACC.7
*/

Y03_LED = Y03;
Y04_LED = Y04;
Y05_LED = Y05;
Y06_LED = Y06;
Y07_LED = Y07;
Y11_LED = Y11;
Y10_LED = Y10;
Y00_LED = Y00;
LED[2] = ACC;//送显示缓冲LED2
/*
;POWER_LED  BIT     ACC.0
;RUN_LED    BIT     ACC.1
;STOP_LED   BIT     ACC.2
;Y01_LED    BIT     ACC.3
;Y02_LED    BIT     ACC.4
;X07_LED    BIT     ACC.5
;X06_LED    BIT     ACC.6
;X05_LED    BIT     ACC.7
*/
POWER_LED=1;
RUN_LED=1;
STOP_LED=0;
Y01_LED = Y01;
Y02_LED = Y02;
X07_LED = X07;
X06_LED = X06;
X05_LED = X05;
LED[1] = ACC;//送显示缓冲LED1
/*
;X04_LED    BIT     ACC.0
;X03_LED    BIT     ACC.1
;X12_LED    BIT     ACC.2
;X11_LED    BIT     ACC.3
;X10_LED    BIT     ACC.4
;X00_LED    BIT     ACC.5
;X01_LED    BIT     ACC.6
;X02_LED    BIT     ACC.7
*/
X04_LED = X04;
X03_LED = X03;
X12_LED = X12;
X11_LED = X11;
X10_LED = X10;
X00_LED = X00;
X01_LED = X01;
X02_LED = X02;
LED[0] = ACC;//送显示缓冲LED0
UpDate(&LED);//更新595
OUT00 = ~Y00;
OUT01 = ~Y01;
OUT02 = ~Y02;
OUT03 = ~Y03;
OUT04 = ~Y04;
OUT05 = ~Y05;
OUT06 = ~Y06;
OUT07 = ~Y07;
OUT10 = ~Y10;
OUT11 = ~Y11; //更新Y
}




/*
功能:延时程序
输入参数:time
输出参数:NC
作者:徐益武
2006/3/2
修改次数:0
*/

void Delay(uchar time)
{
 uint i;
 for(;time>0;time--){
   for(i=0;i<76;i++);
 }

}



/*
功能:定时程序
输入参数:NC
输出参数:NC
作者:徐益武
2006/1/15
修改次数:0
*/
void TMER0() interrupt 1 using 2
{
	static uchar i;

        TH0 = ((unsigned int)(~10000))/256;
        TL0 = ((unsigned int)(~10000))%256;
        Bsf(PKey->UPTimeFlag);//10ms
	PSysAuto->TestMsTick++;//测试
	if(--PSysAuto->RunMsTick == 0)
	{
			Bsf(PSysAuto->RunMsTickFlag);
   	}// 10Ms
   	if(++i==100)
	{
		i = 0;
		if(--PSysAuto->OverScecond == 0)
		{
		//	Bsf(PSysAuto->OverScecondFlag);
		}
   	}// 1s
}

⌨️ 快捷键说明

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