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

📄 driver0425.c.bak

📁 基于485的51单片机多机通讯程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
			{
					out1=out1+pp.dc41*10;
					judge_ok=1;
					center_excursion=0;
			}
		}
		else if(judge_ok==1)
		{
			out1=out1-pp.dc41*10;
			judge_ok=0;
		}
		out2=2*out1;
		COM=0X76;
		COUNT1=out1%256;
		COUNT1=out1/256;
		COM=0XB6;
		COUNT2=out2%256;
		COUNT2=out2/256;
		P4_2=0;				//开横摆使能
		IEN1=IEN1|0X10;			//允许CM0,边缘停留时间
	}
	
}

void CT2_int (void) interrupt 8			//电压采样保持脉冲/弧长脉冲
{
	CTI2=0;
	if(decrease==0)
	{
		if(sample_avc==0)			//采样
		{
			CTCON=CTCON&0xCF;
			IEN1=IEN1&0XFB;			//禁止CT2
			ad_finish=0;			//AD转换及处理过程
			ADCON=0X08;			//启动AD采样
		}
		else
		{
			c_avc++;
			if(SENS>10&&c_avc==3)
				PWMP=v51;
			if(c_avc==SENS)			//灵敏度
			{
				PWM0=0;			//关弧长脉冲
				CTCON=CTCON&0xCF;
				IEN1=IEN1&0XFB;		//禁止CT2
				if(pp.k5==ON)
				{
					sample_avc=0;
					if(pp.k1==DC||pp.k1==PDC&&(pp.avc_type==SP&&pulse_base==1||pp.avc_type==SPB||pp.avc_type==SB&&pulse_base==0))
					{
						PWMP=12;
						PWM1=127;
						CTCON=CTCON|0x20;
						IEN1=IEN1|0X04;		//允许CT2
					}
				}
			}
		}
	}
	else				//衰减过程
	{
		if(lift==1)
		{
			c_avc++;
			if(c_avc==c_lift)	//焊枪提升结束
			{
				P4_4=1;			//关弧长使能
				PWM0=0;			//关弧长脉冲
				IEN1=IEN1&0XFB;		//禁止CT2
				c_avc=0;		//清弧长脉冲个数
				lift_complete=1;
			}
		}
	}
}

void CT3_int (void) interrupt 9		//电流脉冲
{
	CTI3=0;
	pulse_base=~pulse_base;
	CTCON=CTCON&0X3F;
	if(pulse_base==1)			//峰值
	{
		if(pp.avc_type==SPB||pp.avc_type==SB)
			CTCON=CTCON|0X80;	//CT3下降沿
	}
	else					//基值
	{
		if(pp.avc_type==SP||pp.avc_type==SPB)
			CTCON=CTCON|0X40;	//CT3上升沿
	}

	if(pp.avc_type==SPB)
	{
		PWM0=0;
		IEN1=IEN1&0XFB;		//禁止CT2
		c_avc=0;
		sample_avc=0;

		new_circle=1;
		if(pulse_base==1)
		{
			vc5=vc1;
			vc6=vc2;
		}
		else
		{
			vc5=vc3;
			vc6=vc4;
		}
	}
	if(avc_ok==0)			//开始弧长
	{
		avc_ok=1;
		PWMP=12;		//23-1k  12-2k
		PWM0=0;
		PWM1=127;
		CTCON=CTCON|0x20;	//CT2下降沿
		IEN1=IEN1|0X04;		//允许CT2,采样保持脉冲
	}
}

void ADC_int (void) interrupt 10
{
	ADCON=ADCON&0xEF;			//清ADC中断标志
	c_sample++;							//2005-3-3
	adh=ADCH;
	adl=ADCON&0xC0;
	adh=adh<<2;
	adl=adl>>6;
	ad=adh+adl;
	da=ad;
	AD5=(da*5000)/0x3FF;
	if(new_circle==1)
	{
		new_circle=0;
		AD1=AD5;
		AD2=AD5;
		AD3=AD5;
                AD4=AD5;
        }
	else
	{
		AD5=(AD5+AD1+AD2+AD3+AD4)/5;
		AD1=AD2;
		AD2=AD3;
		AD3=AD4;
		AD4=AD5;
	}
	AD5=AD5*6/100;				//AD5*30/5

	if(c_sample%5==0)
	{
		PWM1=0;
		c_sample=0;				//2005-3-3
		sample_avc=1;			//等待弧长调整
//		CTCON=CTCON&0X3F;
		CTCON=CTCON|0X10;	//CT2上升沿
		PWMP=start_v51;
		PWM0=127;
		if(AD5>vc5)
			P4_5=0;
		if(AD5<vc6)
			P4_5=1;			//弧长方向——上
		c_avc=0;
		P4_4=0;
		IEN1=IEN1|0X04;		//允许CT2,弧长脉冲
	}
	else
	{
		if(pp.k1==DC||(pp.k1==PDC&&pp.avc_type==SP&&pulse_base==1))//(pp.avc_type==SP&&pulse_base==1||pp.avc_type==SPB||pp.avc_type==SB&&pulse_base==0)))
		{
			PWMP=12;
			PWM1=127;
			CTCON=CTCON|0x20;
			IEN1=IEN1|0X04;		//允许CT2
		}
	}
	ad_finish=1;				//AD转换及处理完成
}

void CM0_int (void) interrupt 11		//边缘停留时间
{
	CMI0=0;
	c_t42++;
	if(decreased==0)
	{
		if(t_edge==0&&c_t42==c_t42_l||t_edge==1&&c_t42==c_t42_r)				//左边缘
		{
			IEN1=IEN1&0XEF;		//禁止CM0
			CTCON=CTCON|0x02;
			IEN1=IEN1|0X01;
			P4_1=1;
			TR0=1;
			P4_6=~P4_6;		//边缘停留时间结束
			c_t42=0;
		}
	}

	else
	{
		if(t_edge==0&&c_t42==c_t42_l||t_edge==1&&c_t42==c_t42_r)				//左边缘
		{
			IEN1=IEN1&0XEF;			//禁止CM0
			CTCON=CTCON|0x02;
			IEN1=IEN1|0X01;
			P4_1=1;
			P4_6=~P4_6;				//边缘停留时间结束
			c_t42=0;
		}
	}

	CML0=TML2+0X20;
	if(CML0<TML2)
		CMH0=TMH2+1+0X4E;
	else
		CMH0=TMH2+0X4E;
}

main()
{
	TMOD=0x22;				//定时器1,方式2;定时器0,方式3,两个8位定时器;
	TL1=0XFD;				//波特率19200
	TH1=0XFD;
	TR1=1;					//启动定时器
	PCON=0X00;				//SMOD=1
	TMOD=0x23;				//定时器0,方式3,两个8位定时器;
	TR1=0;
	TF1=0;
	S0CON=0XF8;				//串口方式3,SM2=1,REN=1,TB8=1,RB8=0,TI=0,RI=0
	IP1=0X03;				//CT0、CT1高优先级
	IP0=0X98;				//S0=1,T1=1
	ES0=1;					//开串口中断
	ET0=1;
	ET1=1;
 	EAD=1;					//AD中断允许
 	ES1=1;					//I2C
 	EA=1;					//中断总允许
	start_t2();

 	P1_5=0;					//关发送使能
 	PWMP=20;				//弧长脉冲,1K
 	PWM0=0;
 	PWM1=0;

BEGIN:	CTCON=0X00;
	IEN1=0x00;
	P4_1=0;					//out1、out2门控信号
	P4_2=1;					//关横摆使能
	P4_3=1;						//横摆方向,左
	P4_6=1;						//横摆使能输出
	P4_5=1;						//弧长方向
	P4_4=1;
	work=0;
	start=0;
	called=0;
	ergent_stop=0;
	need_para=0;
	pgj=0;
	POINTER0=0;
	SSUM=0;
	S_ANSW=0;
	POINTER1=0;
	RSUM=0;
	ans=0;
//	R_ANSW=0;
	send=0;
	resend=0;
	byte_nums=4;
	AD1=0;
	AD2=0;
	AD3=0;
	AD4=0;
	AD5=0;
	U51=0;
	c_sample=0;
	ad_finish=1;					//AD转换及处理完成标志
	pulse_base=1;					//峰、基值标志 0-基值、1-峰值
	sector=0;
	stop_osc=0;					//进入区间标志
	in_sector=0;						//关弧长使能						//8574门控信号
	motor_stop=0;
	osc=0;
	osc_l=0;
	osc_r=0;
	osc_ok=0;					//启动横摆标志
	osc_change=0;
	judge_ok=0;
	new_circle=1;
	sample_avc=0;					//采样or弧长标志0-采样 1-弧长
	start_avc=0;
	avc=0;
	avc_up=0;
	avc_down=0;
	avc_ok=0;
	stop_avc=0;					//启动弧长标志
	c_avc=0;					//弧长脉冲计数
	c_t0=0;
	c_t42=0;
	center_excursion=0;				//横摆中心偏移标志(DC41)
	first_center=1;
	start_osc=0;
	osc_add=0;					//摆宽增加次数
	osc_dec=0;					//摆宽减小次数
	osc_adjudge=0;
	last_out1=0;
	t_edge=1;					//0-左边缘 1-右边缘
	decrease=0;
	decreased=0;					//衰减标志
	decrease_ok=0;
	temp_c=0;
	share=0;
	lift=0;
	c_lift=0;
	lift_complete=0;
	ask_lift_ok=0;
	lift_ok=0;
	demand=0;
	to_begin=0;
	edge_start=0;
	receive_p_out=0;
	receive_p_in=0;

//	cross_type();					//检测十字滑架型号

	COM=0X36;
	COUNT0=0XA0;
	COUNT0=0X0F;					//启动横摆脉冲 1K

	CML0=TML2+0X20;
	if(CML0<TML2)
		CMH0=TMH2+1+0X4E;
	else
		CMH0=TMH2+0X4E;				//20ms

	while(start==0)					//等待过程中,接受点名和参数
	{
		if(called==1)
		{
			ini_sbuf(M_main,infor,com_calling,S_ANSW,0,0);
			byte_nums=get_byte_nums(infor);
			TR_noans();
			called=0;
		}

		if(receive_p_out==1)
		{
			point=&pp.k4;
			for(p_sec=0;p_sec<25;p_sec++)
				*(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
			pp.t17=rbuffer[52]*256+rbuffer[53];
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			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);
			byte_nums=4;
			TR_noans();
			demand=0;
			receive_p_in=0;
		}

		if(osc_l==1)
		{
			P4_1=1;			//开8254门控信号
			P4_3=1;			//左
			P4_2=0;			//使能
			osc_l=0;
		}
		if(osc_r==1)
		{
			P4_1=1;			//开8254门控信号
			P4_3=0;			//右
			P4_2=0;			//使能
			osc_r=0;
		}
		if(avc_up==1)
		{
			PWM0=127;
			P4_5=1;		//方向——上
			P4_4=0;		//使能
			avc_up=0;
		}
		if(avc_down==1)
		{
			PWM0=127;
			P4_5=0;		//方向——下
			P4_4=0;
			avc_down=0;
		}
		if(motor_stop==1)
		{
			P4_1=0;			//关8254门控信号
  			P4_2=1;			//关横摆使能
  			PWM0=0;
  			P4_4=1;			//关弧长使能
  			motor_stop=0;
  		}
		if(ergent_stop==1)
			goto BEGIN;
	}

	const0=pp.a41*60+pp.v41*(pp.t42_l+pp.t42_r)/2;
	const1=(unsigned long)(pp.v41)*(unsigned long)(pp.t17);
	out0=2400000/pp.v41;				//横摆脉冲, 时钟4M,4*60*0.01*1000000
	out1=10*pp.a41;					//横摆半宽脉冲,时钟1K,(A41/10)/(v41/60)*1000
	out2=2*out1;					//横摆整宽脉冲

	c_t42_l=pp.t42_l*5;				//pp.t42_l/10*1000/50
	c_t42_r=pp.t42_r*5;
	get_vc();
	if(pp.k5==ON)
		get_SENS();
	else
		SENS=5;

	work=3;						//关8254门控信号
	if(pp.k1==DC)
	{
		pp.avc_type=SP;
		pulse_base=1;
	}
	COM=0X36;
	COUNT0=out0%256;
	COUNT0=out0/256;
	COM=0X76;
	COUNT1=out1%256;
	COUNT1=out1/256;				//半个摆宽
	COM=0XB6;
	COUNT2=out1%256;
	COUNT2=out1/256;				//整个摆宽
	do
	{
		if(start_avc==1)			//开始弧长
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			byte_nums=4;
			TR_noans();

			c_sample=0;
			CTCON=CTCON&0X3F;
			if(pp.k1==PDC)
			{
				if(pp.avc_type==SP||pp.avc_type==SPB)
				{
					pulse_base=0;
					CTCON=CTCON|0X40;	//CT3上升沿
				}
				else
				{
					pulse_base=1;
					CTCON=CTCON|0X80;	//CT3下降沿
				}
				IEN1=IEN1|0X08;			//允许CT3
			}
			if(pp.k1==DC)
			{
				avc_ok=1;
				PWMP=12;		//23-1k  12-2k
				PWM0=0;
				PWM1=127;
				CTCON=CTCON|0x20;	//CT2下降沿
				IEN1=IEN1|0X04;		//允许CT2,采样保持脉冲
			}

			start_avc=0;
		}

		if(avc_ok==1&&ad_finish==1)		//允许采样
		{
			if(pp.avc_type==SP&&pulse_base==1||pp.avc_type==SB&&pulse_base==0||pp.avc_type==SPB)
			{
				PWMP=12;		//采样保持脉冲,2K
				PWM1=127;
				IEN1=IEN1|0X04;		//允许CT2,采样保持脉冲
			}
		}

		if(avc_ok==1&&need_para==1)		//显示弧压
		{
			U51=AD5;
			ini_sbuf(M_main,parameter1,0,0,0,0);
			sbuffer[2]=U51/256;
			sbuffer[3]=U51%256;
			byte_nums=5;
			TR_noans();
			need_para=0;
		}

		if(start_osc==1)			//开始横摆
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			byte_nums=4;
			TR_noans();
			P4_3=1;				//方向——左
			P4_2=0;				//开横摆使能
			CTCON=CTCON|0x08;
			IEN1=IEN1|0X02;			//允许CT1
			P4_1=1;
			P4_6=1;
			TR0=1;
			start_osc=0;
		}

		if(avc_up==1)
		{
			if(pp.k5==OFF)
			{
				sample_avc=1;
				c_avc=0;
				CTCON=CTCON|0X10;
				PWM0=127;
				P4_5=1;		//方向——上
				P4_4=0;		//使能
				IEN1=IEN1|0X04;
			}
			else
			{
				if(in_sector==1)
					vc1=vc1+pp.x[nonce_sector][28]*100;
				else
					vc1=vc1+pp.du51*100;
				if(pp.avc_type==SB||pp.avc_type==SPB)
					vc2=vc1+200;

			}
			avc_up=0;
		}

		if(avc_down==1)
		{
			if(pp.k5==OFF)
			{
				sample_avc=1;
				c_avc=0;
				CTCON=CTCON|0X10;
				PWM0=127;
				P4_5=0;		//方向——下
				P4_4=0;
				IEN1=IEN1|0X04;
			}
			else
			{
				if(in_sector==1)
					vc1=vc1-pp.x[nonce_sector][28]*100;
				else
					vc1=vc1-pp.du51*100;
				if(pp.avc_type==SB||pp.avc_type==SPB)
					vc2=vc1+200;
			}
			avc_down=0;
		}

		if(pp.k4==OFF&&center_excursion==1)
		{
			if(excursion_dir==0)
				P4_3=1;			//左
			else
				P4_3=0;
			CTCON=CTCON|0X02;
			COM=0X76;
			COUNT1=10;
			COUNT1=0;
			IEN1=IEN1|0X01;
			P4_1=1;			//开8254门控信号
			P4_2=0;
			center_excursion=0;					//半个摆宽
		}

		if(sector==1)				//进入新区间
		{
			if(avc_ok==1)
			{
				SENS=pp.x[nonce_sector][27];
				if(pp.avc_type==SP||pp.avc_type==SPB&&pulse_base==1)
					vc1=pp.x[nonce_sector][25]*100-100;
				else
				{
					if(pp.avc_type==SB||pp.avc_type==SPB&&pulse_base==0)
						vc1=pp.x[nonce_sector][26]*100-100;
				}
				vc2=vc1+200;
			}
			if(osc_ok==1)
			{
				K4=pp.x[nonce_sector][19];
				if(K4==1)
				{
				}
				else
				{
					stop_osc=1;
				}
			}
			sector=0;
		}

		if(avc_ok==1&&stop_avc==1)
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			byte_nums=4;
			TR_noans();
			PWM0=0;
  			IEN1=IEN1&0XFB;		//禁止CT2
  			IEN1=IEN1&0XF7;		//禁止CT3
  			avc=0;
  			avc_ok=0;
  			c_avc=0;
  			stop_avc=0;
  		}

		if(resend==1)
		{
			POINTER1=0;
			RSUM=0;
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			byte_nums=get_byte_nums(answer);
		}
	}while(decrease==0);
/*
	while(decrease_ok==0)
	{
		if(ergent_stop==1)
			goto BEGIN;
	}
*/
	if(avc_ok==1)
	{
/*
		while(stop_avc==0)
		{
			if(ergent_stop==1)
				goto BEGIN;
		}
		ini_sbuf(M_main,answer,S_ANSW,0,0,0);
		byte_nums=4;
		TR_noans();
*/
		PWM0=0;
		PWM1=0;
		CTCON=CTCON&0x0F;
  		IEN1=IEN1&0XFB;		//禁止CT2
  		IEN1=IEN1&0XF7;		//禁止CT3
  		avc=0;
  		avc_ok=0;
  		c_avc=0;
	}
	
	if(pp.h52>0)
	{
		while(lift==0)
		{
			if(ergent_stop==1)
				goto BEGIN;
		}

		ini_sbuf(M_main,answer,S_ANSW,0,0,0);	//焊枪提升
		byte_nums=4;
		TR_noans();
		c_avc=0;
		c_lift=pp.h52/0.0375;
		CTCON=CTCON&0X3F;
		CTCON=CTCON|0X10;	//CT2上升沿
		PWM0=127;
		P4_5=1;					//弧长方向——上
		P4_4=0;					//开弧长使能
		IEN1=IEN1|0X04;				//允许CT2,弧长脉冲
		while(lift_ok==0)
		{
			if(ergent_stop==1)
				goto BEGIN;
			if(ask_lift_ok==1)
			{
				if(lift_complete==1)
				{
					ini_sbuf(M_main,command,com_lift_ok,0,0,0);
					byte_nums=4;
					TR_noans();
				}
				else
				{
					ini_sbuf(M_main,answer,S_ANSW,0,0,0);
					byte_nums=4;
					TR_noans();
				}
				ask_lift_ok=0;
			}
		}
		ini_sbuf(M_main,answer,S_ANSW,0,0,0);
		byte_nums=4;
		TR_noans();
//		answer_judge();
	}
	
	while(to_begin==0)
	{
		if(ergent_stop==1)
			goto BEGIN;
	}
	goto BEGIN;
	
}

⌨️ 快捷键说明

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