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

📄 main1_1.c.bak

📁 基于485的51单片机多机通讯程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
//#pragma la
#include <main1.h>
#define uchar	unsigned char
#define uint	unsigned int
sbit stop=P3^5;

xdata uchar sbuffer[5],rbuffer[64],sbuffer1[55];
uchar	S_ANSW,R_ANSW,POINTER0,POINTER1,RSUM,SSUM,c_t1,s_byte_nums,r_byte_nums,
	work,pn1,PRG,err,toPRG,temp_c;
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,need_para,temp_motor_stop,p_forbid,rc_forbid,
    new_switch1,new_switch2,new_switch3,
    urgent_stop,p_active,rc_active;
uint	*point;

xdata	uchar	start		_at_ 0x0800;
xdata	uchar	start_again	_at_ 0x0801;
xdata	uchar	decrease	_at_ 0x0802;
xdata	uchar	err_ok		_at_ 0x0804;
xdata	uchar	YOUHU		_at_ 0x0806;
xdata	uchar	WIRE		_at_ 0x0808;
xdata	uchar	decrease_ok	_at_ 0x080A;
xdata	uchar	weld_switch	_at_ 0x080C;
xdata	uchar	wire_switch	_at_ 0x080E;
xdata	uchar	current_add	_at_ 0x0810;
xdata	uchar	current_dec	_at_ 0x0812;
xdata	uchar	rot_front	_at_ 0x0814;
xdata	uchar	rot_reverse	_at_ 0x0816;
xdata	uchar	wire_add	_at_ 0x0818;
xdata	uchar	wire_dec	_at_ 0x081A;
xdata	uchar	osc_l		_at_ 0x081C;
xdata	uchar	osc_r		_at_ 0x081E;
xdata	uchar	breadth_add	_at_ 0x0820;
xdata	uchar	breadth_dec	_at_ 0x0822;
xdata	uchar	avc_up		_at_ 0x0824;
xdata	uchar	avc_down	_at_ 0x0826;
xdata	uchar	motor_stop	_at_ 0x0828;
xdata	uchar	delt_switch	_at_ 0x082A;
xdata	uchar	return_ok	_at_ 0x082C;
xdata	uchar	nonce_sec	_at_ 0X082E;
xdata	uint	FINISH		_at_ 0X0830;
xdata	uint	CURRENT		_at_ 0X0832;
xdata	uint	VOLTAGE		_at_ 0X0834;
xdata	uint	AVC		_at_ 0X0836;
//xdata	uchar	pc_ok		_at_ 0x0838;
xdata	uchar	new_switch11	_at_ 0x0839;
xdata	uchar	new_switch22	_at_ 0x083A;
xdata	uchar	p_forbided	_at_ 0x083B;
xdata	uchar	rc_forbided	_at_ 0x083C;
xdata	uchar	p_actived	_at_ 0x083D;
xdata	uchar	rc_actived	_at_ 0x083E;
xdata	uint	last_FINISH	_at_ 0x0840;
xdata	uchar	pc_stop		_at_ 0x0842;

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=3;
		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:	current_add=1;break;	//电流加
		case com_current_dec:	current_dec=1;break;	//电流减
		case com_rot_front:	rot_front=1;break;
		case com_rot_reverse:	rot_reverse=1;break;
		case com_wire_add:	wire_add=1;break;
		case com_wire_dec:	wire_dec=1;break;
		case com_osc_l:		osc_l=1;break;
		case com_osc_r:		osc_r=1;break;
		case com_breadth_add:	breadth_add=1;break;
		case com_breadth_dec:	breadth_dec=1;break;
		case com_avc_up:	avc_up=1;break;
		case com_avc_down:	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 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();
			}
			else
			{
				S_ANSW=FAIL;
				if(resend==0)
					resend=1;
			}
		}
	}
	EA=1;                                       //开中断
}

main()
{
uchar i,j,delt,temp_pc,temp_delt,c_err,anum,snum,axis[]={M_current,M_RW,M_OSC,M_AVC};

	TMOD=0x22;			//定时器1,方式2;
	TL1=0XFD;			//波特率9600
	TH1=0XFD;
	TR1=1;				//启动定时器
//	PCON=0X80;			//SMOD=1;
	TMOD=0x23;			//定时器0,方式3,两个8位定时器;
	TR1=0;
	TF1=0;
	SCON=0X50;			//串口方式1,SM2=0,REN=1,TB8=1,RB8=0,TI=0,RI=0
	IP=0X98;			//S0=1,T1=1
//	EX0=1;				//急停
	ES=1;				//开串口中断
	ET1=1;
 	EX0=1;
 	EA=1;				//中断总允许
 	
 	temp_c=0;

        pc_ok=0;
	urgent_stop=0;
	main1_err=0;
	p_forbid=0;
	rc_forbid=0;
	p_active=0;
	rc_active=0;
	p_forbided=0;
	rc_forbided=0;
	p_actived=0;
	rc_actived=0;

BEGIN:
	if(urgent_stop==1)
	{		
		urgent_stop=0;
		EX0=1;
	}

	pc_stop=0;
	urgent_stop=0;
	err_ok=1;
	work=0;
	start=0;
	err=0;				//错误编号
	editing=0;			//正在编程
	edit_finish=0;			//编程结束
	p_received=0;
//	edited=0;			//进行过编程操作
	change_prg=0;
	connect=0;
	break_connect=0;
	in_sector=0;
	nonce_sec=0;			//当前区间号
	FINISH=0;
	CURRENT=0;
	VOLTAGE=0;
	AVC=0;
	decrease=0;
	rot_front=0;
	rot_reverse=0;
	wire_add=0;
	wire_dec=0;
	osc_l=0;
	osc_r=0;
	avc_up=0;
	avc_down=0;
	temp_motor_stop=0;
	motor_stop=0;
	new_switch1=0;
	new_switch2=0;
	new_switch3=0;
	start_again=0;

	POINTER0=0;
	SSUM=0;
	S_ANSW=0;
	POINTER1=0;
	RSUM=0;
	ans=0;
	R_ANSW=0;
	r_byte_nums=4;
	noans_ok=1;
	overtime=0;
	s_p=0;				//1,发送参数
//	rc_forbided=1;

	while(start==0)
	{
		if(urgent_stop==1)
		{
			if(pc_stop==1)
			{
				ini_sbuf(M_PC,answer,S_ANSW,0,0);
				s_byte_nums=4;
				TR_noans();
				stop=0;
				while(err_ok==0);
			}
			goto BEGIN;
		}
		if(connect==1)
		{
			ini_sbuf(M_PC,answer,OK,0,0);
			s_byte_nums=4;
			TR_noans();
			pc_ok=1;
                        connect=0;
		}
		if(break_connect==1)
		{
			ini_sbuf(M_PC,answer,OK,0,0);
			s_byte_nums=4;
			TR_noans();
			pc_ok=0;
			break_connect=0;
		}
/*
		if(p_forbid==1)
		{
			ini_sbuf(M_PC,answer,S_ANSW,0,0);
			s_byte_nums=4;
			TR_noans();
			p_forbided=1;
			p_actived=0;
			p_forbid=0;
		}
		if(rc_forbid==1)
		{
			ini_sbuf(M_PC,answer,S_ANSW,0,0);
			s_byte_nums=4;
			TR_noans();
			rc_forbided=1;
			rc_actived=0;
			rc_forbid=0;
		}
*/
		if(temp_motor_stop==1)
		{
			ini_sbuf(M_PC,answer,S_ANSW,0,0);
			s_byte_nums=4;
			TR_noans();
			motor_stop=1;
			temp_motor_stop=0;
		}
		if(editing==1)
		{
			ini_sbuf(M_PC,answer,S_ANSW,0,0);
			s_byte_nums=4;
			TR_noans();

			while(p_received==0)
			{
				if(urgent_stop==1)
				{
					if(pc_stop==1)
					{
						ini_sbuf(M_PC,answer,S_ANSW,0,0);
						s_byte_nums=4;
						TR_noans();
						stop=0;
						while(err_ok==0);
					}
					goto BEGIN;
				}
				if(resend==1)
				{
					ini_sbuf(M_PC,answer,S_ANSW,0,0);
					s_byte_nums=4;
					TR_noans();
                                        p_received=0;
					resend=0;
				}
			}
			point=&pp.pn;
			delt=0;
			for(i=2;i<55;i++)
			{
				*(point+i-2)=rbuffer[i+delt]*256+rbuffer[i+delt+1];
				delt++;
			}
			p_received=0;
			ini_sbuf(M_PC,answer,S_ANSW,0,0);
			s_byte_nums=4;
			TR_noans();

			while(p_received==0)
			{
				if(urgent_stop==1)
				{
					if(pc_stop==1)
					{
						ini_sbuf(M_PC,answer,S_ANSW,0,0);
						s_byte_nums=4;
						TR_noans();
						stop=0;
						while(err_ok==0);
					}
					goto BEGIN;
				}
				if(resend==1)
				{
					ini_sbuf(M_PC,answer,S_ANSW,0,0);
					s_byte_nums=4;
					TR_noans();
					p_received=0;
					resend=0;
				}
			}
			point=&pp.k2;
			delt=0;
			for(i=2;i<51;i++)
			{
				*(point+i-2)=rbuffer[i+delt]*256+rbuffer[i+delt+1];

⌨️ 快捷键说明

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