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

📄 main_stop.c.bak

📁 基于485的51单片机多机通讯程序
💻 BAK
📖 第 1 页 / 共 5 页
字号:
}

void TR_INT (void) interrupt 4					//串行口中断
{								//关中断
	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]=S0BUF;		//从接收缓冲读出数据
		if(rbuffer[0]==M_main)
		{
			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;
				}
			}
		}
		else
			POINTER1=0;
	}
}

void S1_INT (void) interrupt 5      //I2C
{
	ES1=0;
	if(S1STA==0x00)
	{
		FF=1;
		S1CON=0xD5;//STA=0   STO=1    SI=0     AA=1
	}
	if(S1STA==0X08)
	{
		S1DAT=SLA;
		S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
	}
	if(S1STA==0X10)
	{
		S1DAT=SLA;
		S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
	}
	if(S1STA==0X18)
	{
		S1DAT=COMM;
		S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
	}
	if(S1STA==0X20)
	{
		FF=1;
		S1CON=0xD5;//STA=0   STO=1    SI=0     AA=1
	}
	if(S1STA==0X28)
	{
		nums++;
		if(readEEPbyte==1)
		{
			if(nums==1)
			{
				if(getPRG==1)
					S1DAT=0X00;
				S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
			}
			if(nums==2)
			{
				if(getPRG==1)
					SLA=0XA1;
				S1CON=0XE5;
			}
		}
		else
		{
			if(readEEPpage==1)
			{
				if(times<6&&nums<130)
				{
					if(nums==1)
					{
						COMM=(mainDDR+times*128)%256;
						S1DAT=COMM;
						S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
					}
					if(nums==2)
					{
						SLA=SLA+1;
						S1CON=0XE5;
					}
				}
			}
			else
			{
				if(writeEEPpage==1)
				{
					if(times<6&&nums<130)
					{
						if(nums==1)
							COMM=(mainDDR+times*128)%256;
						else
						{
							if(times==5&&nums>=114)
								COMM=0xFF;
							else
							{

								if(nums%2==0)
								{

									COMM=*(point+(times*64+nums-delt))/256;
									delt++;
								}
								else
									COMM=*(point+(times*64+nums-delt))%256;

							}
						}
						S1DAT=COMM;
						S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
					}
					else
					{
						S1CON=0xD5;
						writeEEPpage=0;
					}
				}
				else
				{
					if(writeEEPword==1)
					{
						if(nums<4)
						{
							if(param==1)
							{
								if(nums==1)
									COMM=(mainDDR+secondDDR)%256;
								if(nums==2)
									COMM=general_param/256;
								if(nums==3)
									COMM=general_param%256;
							}
							if(in_sector==1)
							{
								if(nums==1)
									COMM=(mainDDR+152+nonce_sec*60+p_sec*2)%256;
								if(nums==2)
									COMM=rbuffer[p_sec*2+3];
								if(nums==3)
									COMM=rbuffer[p_sec*2+4];
							}

							S1DAT=COMM;
							S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
						}
						else
						{
							S1CON=0xD5;
							writeEEPword=0;
						}
					}
					else
					{
						if(writeEEPbyte==1)
						{
							if(nums<3)
							{
								if(savePRG==1)
								{
									if(nums==1)
										COMM=0X00;
									else
										COMM=PRG;
								}
								S1DAT=COMM;
								S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
							}
							else
							{
								S1CON=0xD5;
								writeEEPbyte=0;
							}
						}
					}
				}
			}
		}
	}
	if(S1STA==0x30)
	{
		FF=1;
		S1CON=0xD5;//STA=0   STO=1    SI=0     AA=1
	}
	if(S1STA==0x38)
		S1CON=0xE5;//STA=1   STO=0    SI=0     AA=1
	if(S1STA==0X40)
	{
		if(readEEPbyte==1)
			S1CON=0XC1;
		if(readEEPpage==1)
			S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
	}
	if(S1STA==0x48)
	{
		FF=1;
		S1CON=0xE5;//STA=0   STO=1    SI=0     AA=1
	}
	if(S1STA==0x50)
	{
		nums1++;
		GET=S1DAT;
		if(times<5&&nums1<130||times==5&&nums1<114)
		{
			if(nums1%2==1)
				temp_GET=GET;
			else
			{
				temp_GET=temp_GET*256+GET;
				*(point+(times*64+nums1-delt))=temp_GET;
				delt++;
			}
			S1CON=0XC5;
		}
		else
			S1CON=0XC1;
	}
	if(S1STA==0x58)
	{
		GET=S1DAT;
		if(readEEPbyte==1)
		{
			S1CON=0xD5;//STA=0   STO=1    SI=0     AA=1
			readEEPbyte=0;
		}
		else
		{
			if(readEEPpage==1)
			{
				S1CON=0XD5;
				temp_GET=temp_GET*256+GET;
				*(point+(times*64+nums1-delt))=temp_GET;
				readEEPpage=0;
			}
		}
	}
	ES1=1;
}

void CM0_int (void) interrupt 11		//流程时钟,100ms中断一次
{
	CMI0=0;
	if(auto_return==0)
		c_flow++;
	else
	{
		if(c_end>0)
			c_end--;
		else
			IEN1=IEN1&0XEF;		//禁止CM0
	}
	CML0=TML2+0XD4;
	if(CML0>TML2)
		CMH0=TMH2+1+0X30;
	else
		CMH0=TMH2+0X30;				//100ms
}

main()
{
	unsigned char k;

	TMOD=0x22;			//定时器1,方式2;
	TL1=0XFD;			//波特率9600
	TH1=0XFD;
	TR1=1;				//启动定时器
	TMOD=0x23;			//定时器0,方式3,两个8位定时器;
	TR1=0;
	TF1=0;
	S0CON=0XC0;			//串口方式3,SM2=0,REN=0,TB8=1,RB8=0,TI=0,RI=0
	IP0=0X9C;			//S0=1,T1=1,EX1=1
	ES0=1;				//开串口中断
	ET1=1;
	ES1=1;				//I2C
 	EA=1;				//中断总允许
	start_t2();
	
	
	urgent_stop=0;
	main_err=0;
//	rc_err=0;
	p_forbid=0;
	rc_forbid=0;
	p_active=0;
	rc_active=0;
	calling=0;
	getPRG=0;
	readEEPbyte=0;
	readEEPpage=0;
	send_p_ok=0;
	
	S_ANSW=0;
	ans=0;
	R_ANSW=0;
	r_byte_nums=4;
	noans_ok=1;
	overtime=0;
	wait_ans=0;
	s_p=0;				//1,发送参数
	resend=0;
	
	EX0=1;
	if(reset==0x5555)
	{
		rc_err=1;
		stop=0;
		while(rc_err==1);
		
	}
	else
	{
		last_FINISH=0;
		FINISH=0;
	// 	call_slave();			//点名
		readPRG();			//从EEPROM中读取上次使用的程序号
		delay(5);
	 	ini_ram();			//从EEPROM中读取当前程序号下的参数存入RAM
	
	 	
		delay(3);
AA:		while(send_p_ok==0)
		{
			ini_sbuf(M_ALL,command,com_send_p,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			send_param();		//更新RAM,及向从板发送参数
			if(urgent_stop==1)
				goto AA;
			delay(2);
			send_param1();
			if(urgent_stop==1)
				goto AA;
			ini_sbuf(M_ALL,command,com_send_p_ok,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			send_p_ok=1;
		}
	 	send_p_ok=0;
	 }
	 delay(300);
	 switch_state();

BEGIN:	if(urgent_stop==1)
	{
		POINTER1=0;
		RSUM=0;
		r_byte_nums=4;
		urgent_stop=0;
		EX0=1;
	}
	IEN1=IEN1&0XEF;
	reset=0x5555;
	send_p_ok=0;
	p_send=0;
	work=0;				//工作状态
	err=0;				//错误编号
	editing=0;			//正在编程
	change_sec_num=0;
	edit_finish=0;			//编程结束
	temp_edit_finish=0;
	param=0;
	p_out=0;
	change_prg=0;
	savePRG=0;
	copy=0;
	start=0;
	start_again=0;
	ignit_ok=0;			//引弧成功信号
	c_flow=0;
	c_sum=0;
	c_current=0;
	c_end=0;
	in_sector=0;
	nonce_sec=0;			//当前区间号
	t31OK=0;			//送丝已经开始=1
	t41OK=0;			//横摆已经开始=1
	t51OK=0;			//弧长已经开始=1
	wire_stoped=0;
	avc_stoped=0;
	
	CURRENT=0;
	VOLTAGE=0;
	AVC=0;
	decrease=0;
	decrease_ok=0;
	lift_ok=0;
	auto_return=0;
	return_ok=0;

	writeEEPbyte=0;
	writeEEPword=0;
	writeEEPpage=0;
	
	S_ANSW=0;
	ans=0;
	R_ANSW=0;
	r_byte_nums=4;
	noans_ok=1;
	overtime=0;
	wait_ans=0;
	s_p=0;				//1,发送参数
	resend=0;
	c_c_t1=0;

	rot_front=0;
	rot_reverse=0;
	wire_add=0;
	wire_dec=0;
	osc_l=0;
	osc_r=0;
	breadth_add=0;
	breadth_dec=0;
	avc_up=0;
	avc_down=0;
	motor_stop=0;
	new_switch11=0;
	new_switch22=0;
	delt_switch=0;
	rc_demand=0;
	c_ex1=0;	

	CML0=TML2+0XD4;
	if(CML0<TML2)
		CMH0=TMH2+1+0X30;
	else
		CMH0=TMH2+0X30;			//CM0 100ms

	REN=1;
	while(start==0)
	{
		if(p_forbided==1&&p_forbid==0)
		{
			REN=0;
			ini_sbuf(M_P,command,com_forbid_p,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			p_active=0;
			p_forbid=1;
		}

		if(rc_forbided==1&&rc_forbid==0)
		{
			REN=0;
			ini_sbuf(M_RC,command,com_forbid_rc,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			rc_active=0;
			rc_forbid=1;
		}

		if(p_active==0&&p_actived==1&&p_forbided==0)
		{
			ini_sbuf(M_P,command,com_p_active,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
//			TR_ans();
//			answer_judge();
			REN=1;
			p_forbid=0;
			p_active=1;
		}

		if(rc_active==0&&rc_actived==1&&rc_forbided==0)
		{
			ini_sbuf(M_RC,command,com_rc_active,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
//			TR_ans();
//			answer_judge();
			ini_sbuf(M_RC,command,com_weld_simu,0,0,0,0);
			s_byte_nums=4;
			TR_ans();
			YOUHU=rbuffer[3];
			new_switch11=0;
			ini_sbuf(M_current,infor,com_weld_simu,YOUHU,0,0,0);
			s_byte_nums=6;
			TR_noans();
			ini_sbuf(M_RC,command,com_wire_on_off,0,0,0,0);
			s_byte_nums=4;
			TR_ans();
			WIRE=rbuffer[3];
			new_switch22=0;
			ini_sbuf(M_RW,infor,com_wire_on_off,WIRE,0,0,0);
			s_byte_nums=6;
			TR_noans();
			rc_forbid=0;
			rc_active=1;
			REN=1;
		}

		if(change_prg==1&&editing==0)	//程序号改变
		{
			PRG=rbuffer[2];
			save_prg();
			delay(2);
			ini_ram();
			delay(2);
			while(send_p_ok==0)
			{
				ini_sbuf(M_ALL,command,com_send_p,0,0,0,0);
				s_byte_nums=4;
				TR_noans();
				send_param();
				if(urgent_stop==1)
					goto AA;
				delay(2);
				send_param1();
				if(urgent_stop==1)
					goto AA;
				ini_sbuf(M_ALL,command,com_send_p_ok,0,0,0,0);
				s_byte_nums=4;
				TR_noans();
				send_p_ok=1;
			}
			send_p_ok=0;
			ini_sbuf(M_P_RC,program,PRG,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			change_prg=0;
			REN=1;
		}

		if(editing==1)		//编程
		{
			ini_sbuf(M_ALL,command,com_send_p,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			work=1;
			edit();
			while(send_p_ok==0)
			{
				send_param();
				if(urgent_stop==1)
					goto AA;
				delay(2);
				send_param1();
				if(urgent_stop==1)
					goto AA;
				ini_sbuf(M_ALL,command,com_send_p_ok,0,0,0,0);
				s_byte_nums=4;
				TR_noans();
				send_p_ok=1;
				if(urgent_stop==1)
					goto BEGIN;
			}
			send_p_ok=0;
			REN=1;
		}

		if(rot_front==1)
		{
			ini_sbuf(M_RW,command,com_rot_front,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			rot_front=0;
		}

		if(rot_reverse==1)
		{
			ini_sbuf(M_RW,command,com_rot_reverse,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			rot_reverse=0;
		}
		if(wire_add==1)
		{
			ini_sbuf(M_RW,command,com_wire_add,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			wire_add=0;
		}
		if(wire_dec==1)
		{
			ini_sbuf(M_RW,command,com_wire_dec,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			wire_dec=0;
		}
		if(osc_l==1)
		{
			ini_sbuf(M_OSC,command,com_osc_l,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			osc_l=0;
		}
		if(osc_r==1)
		{
			ini_sbuf(M_OSC,command,com_osc_r,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			osc_r=0;
		}
		if(avc_up==1)
		{
			ini_sbuf(M_AVC,command,com_avc_up,0,0,0,0);
			s_byte_nums=4;
			TR_noans();
			REN=1;
			avc_up=0;
		}
		if(avc_down==1)
		{
			ini_sbuf(M_AVC,command,com_avc_down,0,0,0,0);

⌨️ 快捷键说明

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