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

📄 main1.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,
    pc_stop,urgent_stop,p_active,rc_active;
uint	*point;

xdata	uchar	start		_at_ 0x0800;
xdata	uchar	decrease	_at_ 0x0802;
//xdata	uchar	urgent_stop	_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	lift_ok		_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;

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=8;
					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:		if(p_forbided==1)
					{
						editing=1;	//编程
					}break;

		case com_efinish:	if(p_forbided==1)
					{
						editing=0;
						edit_finish=1;

					}break;

		case com_start:		if(rc_forbided==1)
					{
//						if((edited==1&&edit_finish==1)||(edited==0))//编程未结束,禁止启动焊接
							start=1;
					}break;
		case com_decrease:	if(rc_forbided==1)
						decrease=1;break;	//手动衰减
		case com_current_add:	if(rc_forbided==1)
						current_add=1;break;	//电流加
		case com_current_dec:	if(rc_forbided==1)
						current_dec=1;break;	//电流减
		case com_rot_front:	if(rc_forbided==1)
						rot_front=1;break;
		case com_rot_reverse:	if(rc_forbided==1)
						rot_reverse=1;break;
		case com_wire_add:	if(rc_forbided==1)
						wire_add=1;break;
		case com_wire_dec:	if(rc_forbided==1)
						wire_dec=1;break;
		case com_osc_l:		if(rc_forbided==1&&osc_l==0)
						osc_l=1;break;
		case com_osc_r:		if(rc_forbided==1&&osc_r==0)
						osc_r=1;break;
		case com_breadth_add:	if(rc_forbided==1&&breadth_add==0)
						breadth_add=1;break;
		case com_breadth_dec:	if(rc_forbided==1&&breadth_dec==0)
						breadth_dec=1;break;
		case com_avc_up:	if(rc_forbided==1)
						avc_up=1;break;
		case com_avc_down:	if(rc_forbided==1)
						avc_down=1;break;
		case com_motor_stop:	if(rc_forbided==1&&temp_motor_stop==0)
						temp_motor_stop=1;break;
		case com_urgent_stop:	if(rc_forbided==1)
					{
						pc_stop=1;
						urgent_stop=1;
						err=1;
					}break;
		case com_connect:	connect=1;break;
		case com_connect_fail:	break_connect=1;break;
		case com_forbid_p:	if(p_forbided==0)
						p_forbid=1;break;
		case com_forbid_rc:	if(rc_forbided==0)
						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:	if(rc_forbided==1)
									{
										YOUHU=rbuffer[3];
										new_switch1=1;
									}break;
						case com_wire_on_off:	if(rc_forbided==1)
									{
										WIRE=rbuffer[3];
										new_switch2=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=1;
}

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;

	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;
 	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;

⌨️ 快捷键说明

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