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

📄 avc_1027.c

📁 基于485的51单片机多机通讯程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	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)
	{
		if(AD5>=temp_avc)
		{
			SENS=AD5-temp_avc;
			avc_dir=0;
		}
		else
		{
			SENS=temp_avc-AD5;
			avc_dir=1;
		}
		if(SENS>=1)
		{
			switch(SENS)
			{
				case 1:	{
						COM=0X36;
						COUNT0=8000%256;		//500HZ
						COUNT0=8000/256;
						COM=0X76;
						COUNT1=4;			//2p,0.0075mm
						COUNT1=0;
					}break;
				case 2:
				case 3:	{
						COM=0X36;
						COUNT0=8000%256;		//500HZ
						COUNT0=8000/256;
						COM=0X76;
						COUNT1=10;			//5p,0.01875mm 0.1v
						COUNT1=0;

					}break;
				case 4:
				case 5:	{
						COM=0X36;
						COUNT0=8000%256;		//500HZ
						COUNT0=8000/256;
						COM=0X76;
						COUNT1=20;
						COUNT1=0;
						out1=0;			//10p,0.0375mm 0.2v
					}break;
				case 6:
				case 7:	{
						COM=0X36;
						COUNT0=6757%256;
						COUNT0=6757/256;
						COM=0X76;
						COUNT1=32;
						COUNT1=0;
					}break;
				case 8:
				case 9:	{
						COM=0X36;
						COUNT0=5141%256;	//778hz
						COUNT0=5141/256;
						COM=0X76;
						COUNT1=42;		//0.08mm 0.4v
						COUNT1=0;
					}break;
				case 10:{
						COM=0X36;
						COUNT0=4000%256;	//1000hz
						COUNT0=4000/256;
						COM=0X76;
						COUNT1=54;		//0.1mm 0.5v
						COUNT1=0;
					}break;
				default:{
						COM=0X36;
						COUNT0=3376%256;	//1185hz
						COUNT0=3376/256;
						COM=0X76;
						COUNT1=64;		//0.12mm 0.6v
						COUNT1=0;
					}break;
			}

			CTCON=CTCON|0x02;
			IEN1=IEN1|0X01;			//允许CT0,弧长调整长度
			avc_enable=0;
			gate=1;
		}
		c_sample=0;
		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)))
			CTCON=CTCON|0x20;
	}
	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)))
			CTCON=CTCON|0x20;
	}
	ad_finish=1;				//AD转换及处理完成
}

void CM0_INT (void) interrupt 11
{
	CMI0=0;
	IEN1=IEN1&0XEF;			//CM0
	c_cm0++;
	if(c_cm0==40)
	{
		COM=0X36;
		COUNT0=0XA0;
		COUNT0=0X0F;
		c_cm0=0;
	}
	else
	{
		CML0=TML2+0X50;		//50ms
		if(CML0>TML2)
			CMH0=TMH2+1+0XC3;
		else
			CMH0=TMH2+0XC3;
		IEN1=IEN1|0X10;		//CM0
	}
}

main()
{
	TMOD=0x22;				//定时器1,方式2;定时器0,方式3,两个8位定时器;
	TL1=0XFD;				//波特率9600
	TH1=0XFD;
	TR1=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=0X01;				//CT0高优先级
	IP0=0X98;				//S0=1,T1=1
	ES0=1;					//开串口中断
	ET1=1;
 	EAD=1;					//AD中断允许
 	EX1=1;
 	EA=1;					//中断总允许
	start_t2();

 	COM=0XB6;
	COUNT2=0x00;
	COUNT2=0x00;
	AD1=0;
	AD2=0;
	AD3=0;
	AD4=0;
	AD5=0;
	U51=0;
	urgent_stop=0;
	avc_err=0;
	err_ok=0;
	err=0;

BEGIN:	if(urgent_stop==1)
	{
		urgent_stop=0;
		err_ok=0;
		EX1=1;
		EX0=1;
	}
	CTCON=0X00;
	IEN1=0x00;
	COM=0x36;
	COUNT0=0x00;
	COUNT0=0x00;
	COM=0X76;
	COUNT1=0x00;
	COUNT1=0x00;
	gate=0;			//关门控
	avc_enable=1;
	avc_dir=1;
	externel_voltage=1;
	temp_voltage=1;
	work=0;
	called=0;
	start=0;
	pgj=0;
	in_sector=0;
	new_sector=0;
	start_avc=0;
	avc_ok=0;
	new_circle=1;
	c_sample=0;
	ad_finish=1;			//AD转换及处理完成标志
	pulse_base=0;			//峰、基值标志 0-基值、1-峰值
	stop_avc=0;
	decrease=0;
	lift=0;
	lift_ok=0;
	lift_complete=0;
	to_begin=0;

	need_para=0;
	POINTER0=0;
	SSUM=0;
	S_ANSW=0;
	POINTER1=0;
	RSUM=0;
	ans=0;
	send=0;
	resend=0;
	r_byte_nums=4;
	send_p=0;
	send_p_ok=0;

//	avc=0;
	avc_up=0;
	avc_down=0;
	motor_stop=0;
	touch=0;
	touched=0;

	PWMP=12;					//采样保持脉冲,2K
 	PWM0=127;
 	COM=0X36;					//弧长点动速度,1K
	COUNT0=4000%256;
	COUNT0=4000/256;

	CML0=TML2+0X20;
	if(CML0<TML2)
		CMH0=TMH2+1+0X4E;
	else
		CMH0=TMH2+0X4E;				//20ms
	lamp=0xF0;
	write_8574(lamp);
	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(send_p==1)
		{
			while(send_p_ok==0)
			{
				if(receive_p_out==1)
				{
					point=&pp.k5;
					for(p_sec=0;p_sec<14;p_sec++)
						*(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
					ini_sbuf(M_main,answer,S_ANSW,0,0,0);
					s_byte_nums=4;
					TR_noans();
					c_lift=80*pp.h51/3;
					receive_p_out=0;		
				}
		
				if(receive_p_in==1)
				{
					point=&pp.x[nonce_sec][0];
					for(p_sec=0;p_sec<4;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();
					receive_p_in=0;
				}
			}
			send_p_ok=0;
			send_p=0;
			EX1=1;
			EX0=1;
		}

		if(avc_up==1)
		{
			COM=0X36;		//450Hz
			COUNT0=0X10;
			COUNT0=0X27;
			avc_dir=1;		//方向——上
			avc_enable=0;		//使能
			gate=1;
			c_cm0=0;
			CML0=TML2+0X50;		//50ms
			if(CML0>TML2)
				CMH0=TMH2+1+0XC3;
			else
				CMH0=TMH2+0XC3;
			IEN1=IEN1|0X10;		//CM0
			avc_up=0;
		}
		if(avc_down==1)
		{
			COM=0X36;		//450Hz
			COUNT0=0X10;
			COUNT0=0X27;
			avc_dir=0;		//方向——下
			avc_enable=0;
			gate=1;
			c_cm0=0;
			CML0=TML2+0X50;		//50ms
			if(CML0>TML2)
				CMH0=TMH2+1+0XC3;
			else
				CMH0=TMH2+0XC3;
			IEN1=IEN1|0X10;		//CM0
			avc_down=0;
		}
		if(motor_stop==1)
		{
			gate=0;			//关8254门控信号
  			avc_enable=1;			//关弧长使能
  			motor_stop=0;
  		}

		if(lift==1)
		{
			COM=0X36;
			COUNT0=0XA0;
			COUNT0=0X0F;
			COM=0X76;
			COUNT1=c_lift%256;
			COUNT1=c_lift/256;
			CTCON=CTCON|0X01;	//CT0下降沿
			IEN1=IEN1|0X01;				//允许CT0
			avc_dir=1;					//弧长方向——上
			externel_voltage=0;
			avc_enable=0;					//开弧长使能
			gate=1;
			while(lift_complete==0);
			externel_voltage=1;
			lift_complete=0;
			lift=0;
			if(urgent_stop==1)
				goto BEGIN;
			lamp=lamp&0xF7;
			write_8574(lamp);
			EX1=1;
		}

		if(pgj==1)
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			avc_dir=0;		//方向——下
			avc_enable=0;
			gate=1;
			while(lift==0);
			COM=0X36;
			COUNT0=0XA0;
			COUNT0=0X0F;
			COM=0X76;
			COUNT1=c_lift%256;
			COUNT1=c_lift/256;
			CTCON=CTCON|0X01;	//CT0下降沿
			IEN1=IEN1|0X01;				//允许CT0
			avc_dir=1;					//弧长方向——上
			externel_voltage=0;
			avc_enable=0;					//开弧长使能
			gate=1;

			while(lift_complete==0)
			{
				if(urgent_stop==1)
					goto BEGIN;
			}
			ini_sbuf(M_main,command,com_lift_ok,0,0,0);
			s_byte_nums=4;
			TR_ans();
			externel_voltage=1;
			lift_complete=0;
			lift=0;
			pgj=0;
			lamp=lamp&0xF7;
			write_8574(lamp);
			EX1=1;
		}
		if(urgent_stop==1)
			goto BEGIN;
	}
	work=3;
	temp_u51_p=pp.u51_p;
	temp_u51_b=pp.u51_b;
	if(pp.k1==DC)
		temp_avc=temp_u51_p;	
	do
	{
		if(start_avc==1)			//开始弧长
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			temp_voltage=0;
			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
			}
			else if(pp.k1==DC)
			{
				avc_ok=1;
				c_sample=0;
				CTCON=CTCON|0x20;	//CT2下降沿
				IEN1=IEN1|0X04;		//允许CT2,采样保持脉冲
			}
			start_avc=0;
		}
		if(urgent_stop==1)
			goto BEGIN;

		if(touch==1)
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			avc_dir=0;		//方向——下
			COM=0X36;					
			COUNT0=10000%256;
			COUNT0=10000/256;
			COM=0X76;
			COUNT1=c_lift%256;
			COUNT1=c_lift/256;
			touched=1;
			avc_enable=0;		//使能
			gate=1;
			touch=0;
			
		}
		if(urgent_stop==1)
			goto BEGIN;
			
		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;
			s_byte_nums=5;
			TR_noans();
			need_para=0;
		}
		if(urgent_stop==1)
				goto BEGIN;

		if(avc_up==1)
		{
			if(pp.k5==OFF||avc_ok==0)
			{
				avc_dir=1;		//方向——上
				COM=0X36;					//弧长点动速度,1K
				COUNT0=4000%256;
				COUNT0=4000/256;
				COM=0X76;
				COUNT1=250;
				COUNT1=0;
				avc_enable=0;		//使能
				CTCON=CTCON|0X02;
				IEN1=IEN1|0X01;
				lift=1;
				gate=1;
			}
			if(avc_ok==1)
			{
				if(in_sector==1)
				{
					temp_u51_p=temp_u51_p+pp.x[nonce_sec][3];
					temp_u51_b=temp_u51_b+pp.x[nonce_sec][3];
				}
				else
				{
					temp_u51_p=temp_u51_p+pp.du51;
					temp_u51_b=temp_u51_b+pp.du51;
				}
				if(pp.k1==DC)
					temp_avc=temp_u51_p;
			}
			avc_up=0;
		}

		if(urgent_stop==1)
			goto BEGIN;

		if(avc_down==1)
		{
			if(pp.k5==OFF||avc_ok==0)
			{
				avc_dir=0;		//方向——下
				COM=0X36;					//弧长点动速度,1K
				COUNT0=4000%256;
				COUNT0=4000/256;
				COM=0X76;
				COUNT1=250;
				COUNT1=0;
				avc_enable=0;		//使能
				CTCON=CTCON|0X02;
				IEN1=IEN1|0X01;
				lift=1;
				gate=1;
			}
			if(avc_ok==1)
			{
				if(in_sector==1)
				{
					temp_u51_p=temp_u51_p-pp.x[nonce_sec][3];
					temp_u51_b=temp_u51_b-pp.x[nonce_sec][3];
				}
				else
				{
					temp_u51_p=temp_u51_p-pp.du51;
					temp_u51_b=temp_u51_b-pp.du51;
				}
				if(pp.k1==DC)
					temp_avc=temp_u51_p;
			}
			avc_down=0;
		}

		if(urgent_stop==1)
				goto BEGIN;

		if(in_sector==1&&new_sector==1)				//进入新区间
		{
			temp_u51_p=pp.x[nonce_sec][0];
			temp_u51_b=pp.x[nonce_sec][1];
			new_sector=0;
		}

		if(urgent_stop==1)
				goto BEGIN;

		if(avc_ok==1&&stop_avc==1)
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
  			gate=0;
  			IEN1=IEN1&0XF2;		//禁止CT0,CT2,CT3
//  			avc=0;
  			avc_ok=0;
  			stop_avc=0;
  			temp_voltage=1;
  		}
		if(urgent_stop==1)
				goto BEGIN;
	}while(decrease==0);

	if(avc_ok==1)
	{
		gate=0;
  		IEN1=IEN1&0XF2;		//禁止CT0,CT2,CT3
//  		avc=0;
  		avc_ok=0;
  		stop_avc=0;
  		temp_voltage=1;
	}

	if(pp.h52>0)
	{
		while(lift==0)
		{
			if(urgent_stop==1)
				goto BEGIN;
		}
		ini_sbuf(M_main,answer,S_ANSW,0,0,0);	//焊枪提升
		s_byte_nums=4;
		TR_noans();
		c_lift=80*pp.h52/3;				//c_lift=400*pp.h52/1.5
		COM=0X36;					//弧长点动速度,1K
		COUNT0=4000%256;
		COUNT0=4000/256;				//弧长采样脉冲,1K
		COM=0X76;
		COUNT1=c_lift%256;
		COUNT1=c_lift/256;
		CTCON=CTCON|0X01;	//CT0下降沿
		IEN1=IEN1|0X01;				//允许CT0
		avc_dir=1;					//弧长方向——上
		avc_enable=0;					//开弧长使能
		lift=1;
		gate=1;

		while(lift_complete==0)
		{
			if(urgent_stop==1)
				goto BEGIN;
		}
		ini_sbuf(M_main,command,com_lift_ok,0,0,0);
		s_byte_nums=4;
		TR_ans();
	}
	while(to_begin==0)
	{
		if(urgent_stop==1)
			goto BEGIN;
	}
	goto BEGIN;
}

⌨️ 快捷键说明

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