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

📄 main1_0928.c.bak

📁 基于485的51单片机多机通讯程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//#pragma la
#include <main1.h>
#define uchar	unsigned char
#define uint	unsigned int
sbit stop=P3^5;
 	
bit edit_finish,copy,change_prg,overtime,getPRG,received,send,t31OK,t41OK,
    t51OK,resend,ans,s_p,noans_ok,connect,break_connect,main1_err,in_sector,
    editing,p_received,lift_ok,pc_ok,temp_motor_stop,
    new_switch1,new_switch2,new_switch3,need_para,
    urgent_stop,p_active,rc_active;
	

xdata	uchar	start		_at_ 0x0800;
xdata	uchar	start_again	_at_ 0x0801;
xdata	uchar	decrease	_at_ 0x0802;
xdata	uchar	err_ok		_at_ 0x0803;
xdata	uchar	YOUHU		_at_ 0x0804;
xdata	uchar	WIRE		_at_ 0x0805;
xdata	uchar	decrease_ok	_at_ 0x0806;
xdata	uchar	weld_switch	_at_ 0x0807;
xdata	uchar	wire_switch	_at_ 0x0808;
xdata	uchar	current_add	_at_ 0x0809;
xdata	uchar	current_dec	_at_ 0x080A;
xdata	uchar	rot_front	_at_ 0x080B;
xdata	uchar	rot_reverse	_at_ 0x080C;
xdata	uchar	wire_add	_at_ 0x080D;
xdata	uchar	wire_dec	_at_ 0x080E;
xdata	uchar	osc_l		_at_ 0x080F;
xdata	uchar	osc_r		_at_ 0x0810;
xdata	uchar	breadth_add	_at_ 0x0811;
xdata	uchar	breadth_dec	_at_ 0x0812;
xdata	uchar	avc_up		_at_ 0x0813;
xdata	uchar	avc_down	_at_ 0x0814;
xdata	uchar	motor_stop	_at_ 0x0815;
xdata	uchar	delt_switch	_at_ 0x0816;
xdata	uchar	return_ok	_at_ 0x0817;
xdata	uchar	nonce_sec	_at_ 0X0818;
xdata	uint	FINISH		_at_ 0X0819;
xdata	uint	CURRENT		_at_ 0X081B;
xdata	uint	VOLTAGE		_at_ 0X081D;
xdata	uint	AVC		_at_ 0X081F;
xdata	uchar	new_switch11	_at_ 0x0821;
xdata	uchar	new_switch22	_at_ 0x0822;
xdata	uchar	pc_edit		_at_ 0x0823;
xdata	uint	last_FINISH	_at_ 0x0824;
xdata	uchar	pc_stop		_at_ 0x0826;
xdata	uchar	edited		_at_ 0x0827;
xdata	uchar	p_changed	_at_ 0x0828;
xdata	uchar	scan	_at_ 0x0829;


xdata	uchar	rbuffer[64]	_at_ 0x0C00;
xdata	uchar	sbuffer[5]	_at_ 0x0C40;
xdata	uchar	sbuffer1[64]	_at_ 0x0C45;
xdata	uchar	S_ANSW		_at_ 0x0C8C;
xdata	uchar	R_ANSW		_at_ 0x0C8D;
xdata	uchar	POINTER0	_at_ 0x0C8E;
xdata	uchar	POINTER1	_at_ 0x0C8F;
xdata	uchar	RSUM		_at_ 0x0C90;
xdata	uchar	SSUM		_at_ 0x0C91;
xdata	uchar	c_t1		_at_ 0x0C92;
xdata	uchar	s_byte_nums	_at_ 0x0C93;
xdata	uchar	r_byte_nums	_at_ 0x0C94;
xdata	uchar	work		_at_ 0x0C95;
xdata	uchar	pn1		_at_ 0x0C96;
xdata	uchar	PRG		_at_ 0x0C97;
xdata	uchar	err		_at_ 0x0C98;
xdata	uchar	toPRG		_at_ 0x0C99;
xdata	uchar	temp_c		_at_ 0x0C9A;

xdata	uint	*point		_at_ 0x0D00;


void delay(unsigned int num)
{
  data unsigned int i,ii;
  for(i=0;i<num;i++)
   {
     for(ii=0;ii<255;ii++);
   }
}

void TR_noans()
{
	REN=0;
	noans_ok=0;
//	TB8=1;
	POINTER0=0;
	SSUM=0;
	send=1;
	c_t1=0;
	TR1=1;
	while(POINTER0<s_byte_nums);
	TR1=0;
	noans_ok=1;
	REN=1;
}

void TR_ans()
{
	REN=0;
	ans=1;
	POINTER1=0;
	RSUM=0;
	TB8=1;
	POINTER0=0;
	SSUM=0;
	send=1;
	c_t1=0;
	TR1=1;
	while(POINTER0<s_byte_nums);
	TR1=0;

	REN=1;
	send=0;
	c_t1=0;
//	TR1=1;
	while(POINTER1<r_byte_nums&&overtime==0);
	TR1=0;
	POINTER1=0;
	RSUM=0;
	if(overtime==1)
	{
		err=2;
		main1_err=1;
		overtime=0;
		stop=0;
	}
	ans=0;
	REN=0;
}

void ini_sbuf(unsigned char a,b,c,d,e)
{
	sbuffer[0]=a;
	sbuffer[1]=b;
	sbuffer[2]=c;
	sbuffer[3]=d;
	sbuffer[4]=e;
}

unsigned char get_byte_nums(unsigned char type)
{
	unsigned char numbers;
	switch(type)
	{
		case	command:
		case	program:
		case	answer:		numbers=4;
					break;
		case	err_infor:
		case	parameter1:	numbers=5;
					break;
		case	parameter:
		case	infor:		numbers=6;
					break;
		case	parameter2:	numbers=7;
					break;
		case	call_result:	numbers=9;
					break;
		case	para_pc:	numbers=10;
					break;
		case	p_out_sec:	numbers=55;
					break;
		case	p_in_sec:	numbers=24;
					break;
		case	edit_sec:	numbers=64;
					break;
		default:		break;
	}
	return numbers;
}

void com_type()
{
	switch(rbuffer[2])
  	{
		case com_edit:		editing=1;break;

		case com_efinish:	{
						editing=0;
						edit_finish=1;
					}break;

		case com_start:		if(start==0)
						start=1;break;
		case com_start_again:	if(start==0)
					{
						start=1;
						start_again=1;
					}break;
		case com_decrease:	decrease=1;break;	//手动衰减
		case com_current_add:	{
						scan=1;
						current_add=1;
					}break;	//电流加
		case com_current_dec:	{
						scan=1;
						current_dec=1;
					}break;	//电流减
		case com_rot_front:	{
						scan=1;
						rot_front=1;
					}break;
		case com_rot_reverse:	{
						scan=1;
						rot_reverse=1;
					}break;
		case com_wire_add:	{
						scan=1;
						wire_add=1;
					}break;
		case com_wire_dec:	{
						scan=1;
						wire_dec=1;
					}break;
		case com_osc_l:		{
						scan=1;
						osc_l=1;
					}break;
		case com_osc_r:		{
						scan=1;
						osc_r=1;
					}break;
		case com_breadth_add:	{
						scan=1;
						breadth_add=1;
					}break;
		case com_breadth_dec:	{
						scan=1;
						breadth_dec=1;
					}break;
		case com_avc_up:	{
						scan=1;
						avc_up=1;
					}break;
		case com_avc_down:	{
						scan=1;
						avc_down=1;
					}break;
		case com_motor_stop:	temp_motor_stop=1;break;
		case com_urgent_stop:	{
						pc_stop=1;
						urgent_stop=1;
						err=1;
						err_ok=0;
					}break;
		case com_connect:	connect=1;break;
		case com_connect_fail:	break_connect=1;break;
//		case com_forbid_p:	p_forbid=1;break;
//		case com_forbid_rc:	rc_forbid=1;break;
//		case com_p_active:	p_active=1;break;
//		case com_rc_active:	rc_active=1;break;
		case com_need_para:	need_para=1;break;
		default:		break;
	}
	if(ans==0)
	{
		POINTER1=0;
		RSUM=0;
		r_byte_nums=4;
	}

}

void data_type()						//对接收到的数据分辨类型
{
	switch(rbuffer[1])
	{
		case command:	com_type();break;
		case answer:	R_ANSW=rbuffer[2];break;
		case err_infor:	err=rbuffer[3];break;
/*
		case infor_sec:	{
					nonce_sec=rbuffer[2];

				}break;
*/
		case edit_sec:	{
//					if(in_sector==0)
//					{
//						nonce_sec=rbuffer[2];
//						in_sector=1;
//					}
				p_received=1;
				}break;
/*
		case parameter:	{
					param=1;

				}break;
*/
/*
		case program:
				if(work==0||work==1)
				{
					PRG=rbuffer[3];
					change_prg=1;
					save_prg();											//将程序号存入EEPROM
				}break;
*/
		case infor:	{
					switch(rbuffer[2])
					{
/*						case com_sector:	nonce_sec=rbuffer[3];break;
						case com_copyEXP:	{
										PRG=rbuffer[2];			//假设为当前程序号
										toPRG=rbuffer[3];		//目的程序号
										copy=1;
									}break;
*/
						case com_calling:	R_ANSW=rbuffer[3];break;
						case com_switch:	{
										YOUHU=rbuffer[3];
										WIRE=rbuffer[4];
									}break;
						case com_weld_simu:	{
										//YOUHU=rbuffer[3];
										new_switch1=1;
									}break;
						case com_wire_on_off:	{
										//WIRE=rbuffer[3];
										new_switch2=1;
									}break;
						case com_delt_switch:	new_switch3=1;;break;
						default:break;
					}
				}break;
		case p_out_sec:	p_received=1;break;
//		case p_in_sec:	p_received=1;break;
		default:	break;
	}
}

void send_param()
{
	unsigned char temp_pc,temp_delt,anum,snum,axis[]={M_current,M_RW,M_OSC,M_AVC};	
	s_p=1;
	point=&pp.pn;
	temp_delt=2;
	sbuffer1[0]=M_current;		//电流和面板接收
	sbuffer1[1]=p_out_sec;			//电流区间外参数
//	sbuffer1[54]=0;
	for(temp_pc=2;temp_pc<54;temp_pc++)
	{
		if(temp_pc%2==0)
		{
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
			temp_delt++;
		}
		else
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
	}
	for(temp_pc=54;temp_pc<64;temp_pc++)
		sbuffer1[temp_pc]=0;
	s_byte_nums=55;
	TR_ans();
//	delay(100);
	s_p=1;
	point=&pp.k2;
	temp_delt=2;
	sbuffer1[0]=M_RW;			//旋转/送丝和面板接收
	sbuffer1[1]=p_out_sec;			//旋转/送丝区间外参数
	for(temp_pc=2;temp_pc<50;temp_pc++)
	{
		if(temp_pc%2==0)
		{
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
			temp_delt++;
		}
		else
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
	}
	for(temp_pc=50;temp_pc<64;temp_pc++)
		sbuffer1[temp_pc]=0;
	s_byte_nums=55;
	TR_ans();
//	delay(100);
	s_p=1;
	point=&pp.k4;
	temp_delt=2;
	sbuffer1[0]=M_OSC;			//横摆和面板接收
	sbuffer1[1]=p_out_sec;			//横摆区间外参数
	for(temp_pc=2;temp_pc<52;temp_pc++)
	{
		if(temp_pc%2==0)
		{
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
			temp_delt++;
		}
		else
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
	}
	for(temp_pc=52;temp_pc<64;temp_pc++)
		sbuffer1[temp_pc]=0;
	s_byte_nums=55;
	TR_ans();
//	delay(100);
/*
	s_p=1;
	point=&pp.k5;
	temp_delt=0;
//	sbuffer1[0]=M_AVC;			//横摆和面板接收
//	sbuffer1[1]=p_out_sec;			//横摆区间外参数
	for(temp_pc=2;temp_pc<28;temp_pc++)
	{
		if(temp_pc%2==0)
		{
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
			temp_delt++;
		}
		else
			sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
	}
	for(temp_pc=28;temp_pc<64;temp_pc++)
		sbuffer1[temp_pc]=0;
	s_byte_nums=55;
	TR_ans();
*/
	for(snum=0;snum<10;snum++)
	{
		s_p=1;
		temp_delt=2;
		point=&pp.x[snum][0];
		for(temp_pc=2;temp_pc<62;temp_pc++)
		{
			if(temp_pc%2==0)
			{
				sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
				temp_delt++;
			}
			else
				sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
		}
		sbuffer1[0]=0;
		sbuffer1[1]=0;
		for(temp_pc=62;temp_pc<64;temp_pc++)
			sbuffer1[temp_pc]=0;
		s_byte_nums=64;
		TR_ans();
	}
	s_p=0;
}

void EX0_INT (void) interrupt 0
{
	EX0=0;
	urgent_stop=1;
//	err_ok=0;
}

void T1_INT (void) interrupt 3
{
//	EA=0;
	c_t1++;
	if(send==1)
	{
		if(c_t1==7)
		{
			if(s_p==0)
				SBUF=sbuffer[POINTER0];
			else
				SBUF=sbuffer1[POINTER0];
			c_t1=0;
		}
	}
	else
	{
		if(c_t1==100)
		{
			TR1=0;
			overtime=1;
		}
	}
//	EA=1;
}

void TR_INT (void) interrupt 4					//串行口中断
{
	EA=0;							//关中断
	if(TI==1)						//发送完成
	{
		TI=0;
		POINTER0++;					//发送缓冲指针加1
//		if(POINTER0==1)
//			TB8=0;
		if(POINTER0<s_byte_nums)
		{
			if(POINTER0<s_byte_nums-1)
			{
				if(s_p==1)
					SSUM=SSUM+sbuffer1[POINTER0];
				else
					SSUM=SSUM+sbuffer[POINTER0];	//6个数据字节求和
			}
			else
			{
				if(s_p==1)
					sbuffer1[s_byte_nums-1]=SSUM+sbuffer1[0];
				else
					sbuffer[s_byte_nums-1]=SSUM+sbuffer[0];	//数据和加地址生成校验码
			}
		}
	}

	if(RI==1)						//接收完成
	{
		RI=0;
		POINTER1++;				//接收缓冲指针加1
		rbuffer[POINTER1-1]=SBUF;		//从接收缓冲读出数据
		if(POINTER1==2)
			r_byte_nums=get_byte_nums(rbuffer[1]);
		if(POINTER1<r_byte_nums)
			RSUM=RSUM+rbuffer[POINTER1-1];	//生成校验码
		else
		{
			if(rbuffer[r_byte_nums-1]==RSUM)
			{
				if(ans==0)
				{
					POINTER1=0;
					RSUM=0;
				}
				S_ANSW=OK;
				data_type();
			}

⌨️ 快捷键说明

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