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

📄 dc1.c

📁 基于485的51单片机多机通讯程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{	
	TMOD=0x22;			//定时器1,方式2;
	TL1=0XFD;			//波特率9600
	TH1=0XFD;
	TR1=1;				//启动定时器
	PCON=0X00;			//SMOD=0
	TMOD=0x23;			//定时器0,方式3,两个8位定时器;
	TR1=0;
	TF1=0;
	S0CON=0XF8;			//串口方式3,SM2=0,REN=1,TB8=1,RB8=0,TI=0,RI=0
	IP0=0X98;			//S0=1,T1=1
	ES0=1;				//开串口中断
	ET0=1;
	ET1=1;
	ES1=1;				//I2C
	EAD=1;				//AD中断允许
 	EA=1;				//中断总允许
 	start_t2();

	urgent_stop=0;
	rw_err=0;
	err_ok=0;
	err=0;

BEGIN:	if(urgent_stop==1)
	{
		urgent_stop=0;
		err_ok=0;
		EX1=1;
		EX0=1;
	}
	IEN1=0X00;
	work=0;
	send_enable=1;				//关发送使能
	start=0;
	start_rot=0;
	start_wire=0;
	stop_wire=0;
	decrease=0;
	need_para=0;
	nonce_sec=0;
	in_sector=0;
	new_sector=0;
	noans_ok=1;
	S_ANSW=0;
//	R_ANSW=0;
	POINTER0=0;
	SSUM=0;
	POINTER1=0;
	RSUM=0;
	r_byte_nums=4;
	send=0;
	overtime=0;
	receive_p_out=0;
	receive_p_in=0;
	demand=0;
	resend=0;
	ans=0;
	p_b=0;				//基值
	temp_pulse_num=0;
	temp_pulse_num1=0;
	FINISH=0;
	temp_FINISH=0;
	rot_front=0;
	rot_reverse=0;
	rot_ok=0;
	rot_stop=0;
	rot_stop_ok=0;
	wire_add=0;
	wire_dec=0;
	wire_ok=0;
	r_slope_ok=1;
	w_slope_ok=1;
	motor_stop=0;
	retract=0;
	c_cm0=0;
	c_cm1=0;
	k_r_p_add=0;
	k_r_b_add=0;
	k_r_p_dec=0;
	k_r_b_dec=0;
	temp_rot_vp=0;
	temp_rot_vb=0;
	temp_wire_vp=0;
	temp_wire_vb=0;
	retract_ok=0;
	auto_return=0;
	return_ok=0;
	ask_return_ok=0;
	to_begin=0;
	c_cm2=0;
	common=0;

        PWMP=3;				//23.5K      
	CTCON=CTCON|0X02;		//CT0捕捉下降沿
	tooth_num=10;
	EX1=1;
	EX0=1;
	
	while(start==0)
	{
		if(called==1)
		{
			ini_sbuf(M_main,infor,com_calling,S_ANSW,0,0);
			s_byte_nums=get_byte_nums(infor);
			TR_noans();
			called=0;
		}

		if(receive_p_out==1)
		{
			point=&pp.k2;
			for(p_sec=0;p_sec<24;p_sec++)
				*(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
			pp.k1=rbuffer[50];

			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			demand=0;
			receive_p_out=0;
		}

		if(receive_p_in==1)
		{
			point=&pp.x[nonce_sec][0];
			for(p_sec=0;p_sec<10;p_sec++)
				*(point+p_sec)=rbuffer[p_sec*2+3]*256+rbuffer[p_sec*2+4];

			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			demand=0;
			receive_p_in=0;
		}

		if(rot_front==1)
		{
			rot_right=1;
			rot_left=0;
			PWM0=55;
			rot_front=0;
			r_w=0;
			c_cm2=0;
			CML2=TML2+0X50;
			if(CML2>TML2)
				CMH2=TMH2+1+0XC3;
			else
				CMH2=TMH2+0XC3;
			IEN1=IEN1|0X40;			//CM2
		}

		if(rot_reverse==1)
		{
			rot_right=0;
			rot_left=1;
			PWM0=55;
			rot_reverse=0;
			r_w=0;
			c_cm2=0;
			CML2=TML2+0X50;
			if(CML2>TML2)
				CMH2=TMH2+1+0XC3;
			else
				CMH2=TMH2+0XC3;
			IEN1=IEN1|0X40;			//CM2
		}

		if(wire_add==1)
		{
			wire_back=0;
			wire_front=1;
			PWM1=55;
			wire_add=0;
			r_w=1;
			c_cm2=0;
			CML2=TML2+0X50;
			if(CML2>TML2)
				CMH2=TMH2+1+0XC3;
			else
				CMH2=TMH2+0XC3;
			IEN1=IEN1|0X40;			//CM2
		}

		if(wire_dec==1)
		{
			wire_back=1;
			wire_front=0;
			PWM1=55;
			wire_dec=0;
			r_w=1;
			c_cm2=0;
			CML2=TML2+0X50;
			if(CML2>TML2)
				CMH2=TMH2+1+0XC3;
			else
				CMH2=TMH2+0XC3;
			IEN1=IEN1|0X40;			//CM2
		}

		if(motor_stop==1)
		{
			PWM0=0;
			PWM1=0;
			wire_back=1;
			wire_front=1;
			rot_right=1;
			rot_left=1;
			rot_front=0;
			rot_reverse=0;
			wire_add=0;
			wire_dec=0;
			motor_stop=0;
		}

		if(resend==1)
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			resend=0;
		}

		if(urgent_stop==1)
			goto BEGIN;
	}

	get_v_r();
	if(r%10>=5)
		pulse_num=r/10+1;
	else
		pulse_num=r/10;
	pulse_num=pulse_num/2;
	pulse_num1=r/2;
	if(pp.k1==0)
		K21=OFF;
	else
		K21=pp.k21;
	if(common!=1)
	{
		const0=(float)(motor_v)*3.14;
	        const0=const0/decrease_rate;		//motor_v*3.14*pp.d/减速比
	}
	temp_data0=const0*pp.d/10;	
	temp_data00=(float)(pp.dv21)/temp_data0;
	delt_rot=255*temp_data00;
	temp_data00=(float)(pp.v21_p)/temp_data0;
	rot_vp=255*temp_data00;
	if(rot_vp<13)
		rot_vp=13;
	else if(rot_vp>255)
		rot_vp=255;
	temp_rot_vp=13;					//05-12-29
	if(K21==ON)
	{
		temp_data00=(float)(pp.v21_b)/temp_data0;
		rot_vb=255*temp_data00;
		if(rot_vb<13)
			rot_vb=13;
		temp_rot_vb=13;
		if(rot_vp>13&&rot_vb>13)
		{
			if(rot_vp>=rot_vb)
				n_cm1=pp.t21*250/(rot_vp-13);
			else
				n_cm1=pp.t21*250/(rot_vb-13);
		}
		else if(rot_vp>13&&rot_vb==13)
			n_cm1=pp.t21*250/(rot_vp-13);
		else if(rot_vp==13&&rot_vb>13)
			n_cm1=pp.t21*250/(rot_vb-13);
		else if(rot_vp==13&&rot_vb==13)
			n_cm1=0;	
	}
	else
	{
		if(rot_vp>13)
			n_cm1=pp.t21*250/(rot_vp-13);
		else
			n_cm1=0;
	}

	K3=pp.k3;
	if(pp.k1==0)
		K31=OFF;
	else
		K31=pp.k31;
	
	const1=1799.72;				//6600*10*165*314
	temp_data00=(float)(pp.dv31)/const1;
	delt_wire=255*temp_data00;
	temp_data00=(float)(pp.v31_p)/const1;
	wire_vp=255*temp_data00;
	if(wire_vp<13)
		wire_vp=13;
	else if(wire_vp>255)
		wire_vp=255;
	temp_wire_vp=13;
	if(K31==ON)
	{
		temp_data00=(float)(pp.v31_b)/const1;
		wire_vb=255*temp_data00;
		if(wire_vb<13)
			wire_vb=13;
		temp_wire_vb=13;
		{
			if(wire_vp>13&&wire_vb>13)
			{
				if(wire_vp>=wire_vb)
					n_cm0=pp.t32*250/(wire_vp-13);
				else
					n_cm0=pp.t32*250/(wire_vb-13);
			}
			else if(wire_vp>13&&wire_vb==13)
				n_cm0=pp.t32*250/(wire_vp-13);
			else if(wire_vp==13&&wire_vb>13)
				n_cm0=pp.t32*250/(wire_vb-13);
			else if(wire_vp==13&&wire_vb==13)
				n_cm0=0;
		}
				
	}
	else
	{
		if(wire_vp>13)
			n_cm0=pp.t32*250/(wire_vp-13);
		else
			n_cm0=0;
	}
	work=3;
	if(WIRE==ON)
		kk=1;
	else
		kk=0;
	nonce_sec=0;
/*
	if(K31==ON||K21==ON)
		IEN1=IEN1|0X08;			//允许CT3,电流脉冲
*/
	do
	{
		if(urgent_stop==1)			//急停后返回
			goto BEGIN;

		if(rot_ok==0&&start_rot==1)	//开始旋转
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			if(pp.k2==CW)
			{
				rot_right=0;
				rot_left=1;
			}
			else
			{
				rot_right=1;
				rot_left=0;
			}
			rot_ok=1;							//05-12-31
			if(K21==ON)
			{
				CTCON=CTCON|0x40;
				IEN1=IEN1|0x08;		//CT3
			}
			if(n_cm1>0)
			{
				CML1=TML2+0XC8;
				if(CML1<TML2)			//CM1,400us,旋转速度变化时间
					CMH1=TMH2+1+0X00;
				else
					CMH1=TMH2+0X00;
				IEN1=IEN1|0X20;			//允许CM1
			}
			else
			{
				PWM0=13;
				r_slope_ok=1;
			}
			IEN1=IEN1|0x01;			//允许CT0
			start_rot=0;
		}

		if(pp.k3==ON&&wire_ok==0&&start_wire==1)//开始送丝
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			wire_back=0;
			wire_front=1;
			wire_ok=1;
			if(K31==ON)
			{
				CTCON=CTCON|0x40;
				IEN1=IEN1|0x08;		//CT3
			}
			if(n_cm0>0)
			{
				CML0=TML2+0xC8;			//CM0,400us,送丝速度变化时间
				if(CML0<TML2)
					CMH0=TMH2+1+0X00;
				else
					CMH0=TMH2+0X00;
				IEN1=IEN1|0X10;			//CM0
			}
			else
			{
				PWM1=13;
				w_slope_ok=1;
			}
			start_wire=0;
		}

		if(need_para==1)			//显示焊接角度
		{
			ini_sbuf(M_main,parameter1,0,0,0,0);
			sbuffer[2]=FINISH/256;
			sbuffer[3]=FINISH%256;
			s_byte_nums=5;
			TR_noans();
			need_para=0;
		}

		if(urgent_stop==1)
				goto BEGIN;
		if(rot_ok==1&&rot_front==1&&r_slope_ok==1)	//旋转速度加
		{

			if(delt_state==0||delt_state==1||K21!=ON)
			{
				if(temp_rot_vp+delt_rot>=255)
					temp_rot_vp=255;
				else
					temp_rot_vp=temp_rot_vp+delt_rot;		//rot_vp=rot_vp-255*pp.dv21/1250
			}
			if(K21==ON)
			{
				if(delt_state==1||delt_state==2)
				{
					if(temp_rot_vb+delt_rot>=255)
						temp_rot_vb=255;
					else
						temp_rot_vb=temp_rot_vb+delt_rot;		//rot_vb=rot_vb-255*pp.dv21/1250

				}
			}
			else
				PWM0=get_PWM(temp_rot_vp);
			rot_front=0;
		}

		if(rot_ok==1&&rot_reverse==1&&r_slope_ok==1)	//旋转速度减
		{
			if(delt_state==0||delt_state==1||K21!=ON)
			{
				if(temp_rot_vp<=delt_rot+13||temp_rot_vp<=13)
					temp_rot_vp=13;
				else
					temp_rot_vp=temp_rot_vp-delt_rot;		//rot_vp=rot_vp+255*pp.dv21/1250
			}
			if(K21==ON)
			{
				if(delt_state==1||delt_state==2)
				{
					if(temp_rot_vb<=delt_rot+13||temp_rot_vb<=13)
						temp_rot_vb=13;
					else
						temp_rot_vb=temp_rot_vb-delt_rot;		//rot_vb=rot_vb+255*pp.dv21/1250

				}
			}
			else
				PWM0=get_PWM(temp_rot_vp);
			rot_reverse=0;
		}

		if(urgent_stop==1)
				goto BEGIN;
		if(K3==ON&&WIRE==ON&&wire_ok==1&&wire_add==1&&w_slope_ok==1)//送丝速度加
		{
			if(delt_state==0||delt_state==1||K31!=ON)
			{
				if(temp_wire_vp+delt_wire>=255)
					temp_wire_vp=255;
				else
					temp_wire_vp=temp_wire_vp+delt_wire;		//wire_vp=wire_vp-255*pp.dv31/2500
			}

			if(K31==ON)
			{
				if(delt_state==1||delt_state==2)
				{
					if(temp_wire_vb+delt_wire>=255)
						temp_wire_vb=255;
					else
						temp_wire_vb=temp_wire_vb+delt_wire;	//wire_vb=wire_vb-255*pp.dv31/2500
				}
			}
			else
				PWM1=get_PWM(temp_wire_vp);
			wire_add=0;
		}

		if(K3==ON&&WIRE==ON&&wire_ok==1&&wire_dec==1&&w_slope_ok==1)//送丝速度减
		{
			if(delt_state==0||delt_state==1||K31!=ON)
			{
				if(temp_wire_vp<=delt_wire+13||temp_wire_vp<=13)
					temp_wire_vp=13;
				else
					temp_wire_vp=temp_wire_vp-delt_wire;		//wire_vp=wire_vp+255*pp.dv31/2500
			}
			if(K31==ON)
			{
				if(delt_state==1||delt_state==2)
				{
					if(temp_wire_vb<=delt_wire+13||temp_wire_vb<=13)
						temp_wire_vb=13;
					else
						temp_wire_vb=temp_wire_vb-delt_wire;		//wire_vb=wire_vb+255*pp.dv31/2500
				}
			}
			else
				PWM1=get_PWM(temp_wire_vp);
			wire_dec=0;
		}

		if(urgent_stop==1)
				goto BEGIN;
		if(wire_ok==1&&WIRE==OFF)		//手动关丝
		{
			PWM1=0;
			wire_back=1;
			wire_front=1;
			kk=0;
		}

		if(wire_ok==1&&kk==0&&WIRE==ON)	//手动开丝
		{
			wire_back=0;
			wire_front=1;
			if(K3==ON)
			{
				if(K31==OFF)
					PWM1=get_PWM(temp_wire_vp);
				else
					IEN1=IEN1|0X08;		//CT3
			}
			kk=1;
		}

		if(decrease==1&&rot_ok==1&&K21==ON)
		{
			CTCON=CTCON&0x3F;
			IEN1=IEN1&0xF7;			//CT3
			PWM0=get_PWM(temp_rot_vp);
			K21=OFF;
		}

		if(urgent_stop==1)
			goto BEGIN;
		if(in_sector==1&&new_sector==1)		//进入区间
		{
//			K21=pp.x[nonce_sec][1];		//05-12-31
			K3=pp.x[nonce_sec][5];
			if(K3==ON)			//05-12-31
			{
				if(pp.k31==ON)
					K31=ON;
			}
			else
			{
				PWM1=0;
				temp_wire_vp=0;
				temp_wire_vb=0;
				K31=OFF;
			}
			if(K21==ON||K3==ON&&K31==ON&&kk==1)
			{
				if(p_b==0)
					CTCON=CTCON|0x40;
				else
					CTCON=CTCON|0x80;
				IEN1=IEN1|0x08;		//CT3
			}
			else
				IEN1=IEN1&0XF7;
			temp_data0=const0*pp.x[nonce_sec][0]/10;
			temp_data00=(float)(pp.x[nonce_sec][2])/temp_data0;
			rot_vp=255*temp_data00;
			if(K21==ON)					//脉动旋转开关
			{
				temp_data00=(float)(pp.x[nonce_sec][3])/temp_data0;
				rot_vb=255*temp_data00;
			}
			r_slope_ok=0;
			if(rot_vp!=temp_rot_vp)
			{
				c_cm1=0;
				if(rot_vp>temp_rot_vp)
					rot_slope_delt=rot_vp-temp_rot_vp;
				else
					rot_slope_delt=temp_rot_vp-rot_vp;
				n_cm1=pp.x[nonce_sec][4]*250/rot_slope_delt;
				IEN1=IEN1|0X20;			//CM1
			}


			if(K3==ON)
			{
				wire_ok=1;
				if(temp_wire_vp==0)
					temp_wire_vp=13;
				temp_data00=(float)(pp.x[nonce_sec][8])/const1;
				wire_vp=255*temp_data00;
				if(K31==ON)
				{
					if(temp_wire_vb==0)
						temp_wire_vb=13;
					temp_data00=(float)(pp.x[nonce_sec][9])/const1;
					wire_vb=255*temp_data00;
				}
				w_slope_ok=0;
				if(wire_vp!=temp_wire_vp)
				{
					c_cm0=0;
					if(wire_vp>temp_wire_vp)
						wire_slope_delt=wire_vp-temp_wire_vp;
					else
						wire_slope_delt=temp_wire_vp-wire_vp;
					n_cm0=pp.x[nonce_sec][7]*250/wire_slope_delt;
					IEN1=IEN1|0X10;		//CM0
				}

			}
			new_sector=0;
		}

		if(K3==ON&&WIRE==ON&&wire_ok==1&&stop_wire==1)		//停止送丝
		{

			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			PWM1=0;
			wire_back=1;
			wire_front=1;
			wire_ok=0;			//抽丝时没有脉动
			delay(2);				//79um
			if(pp.t34>0)
			{

				retract=1;			//抽丝标志
				wire_back=1;
				wire_front=0;
				CML0=TML2+0X50;			//100ms
				if(CML0<TML2)
					CMH0=TMH2+1+0XC3;
				else
					CMH0=TMH2+0XC3;
				n_cm0=pp.t34;
				c_cm0=0;
				temp_data00=(float)(pp.v32)/const1;
				temp_data00=temp_data00*255;
				PWM1=get_PWM(temp_data00);
				IEN1=IEN1|0X10;			//允许CM0,抽丝
			}
			stop_wire=0;
		}

		if(decrease==1&&K3==ON&&WIRE==ON&&wire_ok==1)
		{
			PWM1=0;
			wire_back=1;
			wire_front=1;
			wire_ok=0;			//抽丝时没有脉动
			delay(2);				//79um
			if(pp.t34>0)
			{
				retract=1;			//抽丝标志
				wire_back=1;
				wire_front=0;
				CML0=TML2+0X50;
				if(CML0>TML2)
					CMH0=TMH2+1+0XC3;
				else
					CMH0=TMH2+0XC3;				//100ms
				n_cm0=pp.t34;
				c_cm0=0;
				temp_data00=(float)(pp.v32)/const1;
				temp_data00=temp_data00*255;
				PWM1=get_PWM(temp_data00);			
				IEN1=IEN1|0X10;			//允许CM0,抽丝				
			}
		}
		if(urgent_stop==1)
			goto BEGIN;
		if(rot_stop==1)			//停止旋转
		{
			PWM0=0;
			rot_right=1;
			rot_left=1;
			IEN1=IEN1&0XF7;		//禁止CT3,电流脉冲
			IEN1=IEN1&0XFE;		//禁止CT0,焊接角度

			if(wire_ok==1&&WIRE==ON)
			{
				PWM1=0;
				wire_back=1;
				wire_front=1;
				wire_ok=0;			//抽丝时没有脉动
				delay(2);				//79us
				if(pp.t34>0)
				{
					retract=1;			//抽丝标志
					wire_back=1;
					wire_front=0;
					CML0=TML2+0X50;			//100ms
					if(CML0<TML2)
						CMH0=TMH2+1+0XC3;
					else
						CMH0=TMH2+0XC3;
					n_cm0=pp.t34;
					c_cm0=0;
					temp_data00=(float)(pp.v32)/const1;
					temp_data00=temp_data00*255;
					PWM1=get_PWM(temp_data00);
					IEN1=IEN1|0X10;			//允许CM0,抽丝
				}
			}

			rot_stop_ok=1;
		}
		if(urgent_stop==1)
				goto BEGIN;

	}while(rot_stop_ok==0);

	while(need_para==0)
	{
		if(urgent_stop==1)
				goto BEGIN;
	}
	ini_sbuf(M_main,parameter1,0,0,0,0);
	sbuffer[2]=FINISH/256;
	sbuffer[3]=FINISH%256;
	s_byte_nums=5;
	TR_noans();
	need_para=0;
	if(pp.b==ON)
	{
		while(auto_return==0)
		{
			if(urgent_stop==1)
				goto BEGIN;
		}
		ini_sbuf(M_main,answer,S_ANSW,0,0,0);
		s_byte_nums=4;
		TR_noans();
		if(pp.k2==CW)
		{
			rot_right=1;
			rot_left=0;
		}
		else
		{
			rot_right=0;
			rot_left=1;
		}
		PWM0=255;
		IEN1=IEN1|0X01;				//允许CT0,焊接角度

		while(return_ok==0)
		{
			if(urgent_stop==1)
				goto BEGIN;
			if(need_para==1)
			{
				sbuffer[0]=M_main;
				sbuffer[1]=parameter1;
				sbuffer[2]=FINISH/256;
				sbuffer[3]=FINISH%256;
				sbuffer[4]=0;
				s_byte_nums=5;
				TR_noans();
				need_para=0;
			}
		}
		ini_sbuf(M_main,answer,S_ANSW,0,0,0);
		s_byte_nums=4;
		TR_noans();
	}

	while(to_begin==0)
	{
		if(urgent_stop==1)
			goto BEGIN;
	}
	goto BEGIN;
}

⌨️ 快捷键说明

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