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

📄 main_0928.c.bak

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

void EX1_INT(void) interrupt 2		//响应线控器申请
{
	EX1=0;
	c_ex1++;
	if(c_ex1==3)
	{
		EX1=0;
		c_ex1=0;
		rc_demand=1;
	}
	else
		EX1=1;
}

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

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)
			{
				if(rbuffer[1]>=4)
					r_byte_nums=get_byte_nums(rbuffer[1]);
			}
			if(r_byte_nums>=4)
			{
				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
			{
				r_byte_nums=4;
				POINTER1=0;
				RSUM=0;
			}
		}
		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)
	{
		if(readEEPbyte==1||readEEPpage==1||writeEEPpage==1||writeEEPword==1||writeEEPbyte==1)
		{
			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;
								}
							}
						}
					}
				}
			}
		}
		else
			S1CON=0XD5;
	}
	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)
		else
			S1CON=0xC5;//STA=0   STO=0    SI=0     AA=1
	}
	if(S1STA==0x48)
	{
		FF=1;
		S1CON=0xD5;//STA=0   STO=1    SI=0     AA=1
	}
	if(S1STA==0x50)
	{
		GET=S1DAT;
		if(readEEPpage==1)
		{
			nums1++;
			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;
		}
		else
			S1CON=0xC1;
	}
	if(S1STA==0x58)
	{
		
		if(readEEPbyte==1||readEEPpage==1)
		{
			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;
				}
			}
		}
		else
			S1CON=0xD5;
	}
	ES1=1;
}

void CT0_int (void) interrupt 6
{
	CTI0=0;
	IEN1=IEN1&0XFE;
	CTCON=CTCON&0XFC;
	
	if(enter==0)
	{
		SLA=0X40;
		COMM=0X02;
		start_i2a();
		delay(5);
		SLA=0X43;
		start_i2a();
		delay(5);
		switch(GET)
		{
			case 0xFB:	{
						start=1;
						enter=1;
					}break;
			case 0xF7:	{
						decrease=1;
						enter=1;
					}break;
			case 0xEF:	{
						current_add=1;
						enter=1;
					}break;
			case 0xDF:	{
						current_dec=1;
						enter=1;
					}break;
			default:	break;
		}
		if(enter==0)
		{
			SLA=0X40;
			COMM=0X01;
			start_i2a();
			delay(5);
			SLA=0X43;
			start_i2a();
			delay(5);
			switch(GET)
			{
				case 0xFE:	{
							rot_front=1;
							enter=1;
						}break;
				case 0xFD:	{
							rot_reverse=1;
							enter=1;
						}break;
				case 0xFB:	{
							wire_add=1;
							enter=1;
						}break;
				case 0xF7:	{
							wire_dec=1;
							enter=1;
						}break;
				case 0xEF:	{
							avc_up=1;
							enter=1;
						}break;
				case 0xDF:	{
							avc_down=1;
							enter=1;
						}break;
				case 0xBF:	{
							osc_l=1;
							enter=1;
						}break;
				case 0x7F:	{
							osc_r=1;
							enter=1;
						}break;
				default:	break;
			}
		}
		SLA=0X40;
		COMM=0X03;
		start_i2a();
		delay(5);
	}
	else
	{
		motor_stop=1;
		enter=0;
	}
	if(enter==1)
		CTCON=CTCON|0X01;
	else
		CTCON=CTCON|0X02;
	IEN1=IEN1|0X01;
}
	
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
}

void CM1_int (void) interrupt 12
{
	CMI1=0;
	IEN1=IEN1&0XDF;		//CM1
	scan=1;
}

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();	
	
	stop=1;
	err=0;
	urgent_stop=0;
	main_err=0;
	calling=0;
	getPRG=0;
	readEEPbyte=0;
	readEEPpage=0;
	send_p_ok=0;
		
	rc_err=1;
	EX0=1;
	stop=0;
	while(rc_err==1);
	urgent_stop=0;
	EX0=1;
	
	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;
	
	last_FINISH=0;
	FINISH=0;
	readPRG();			//从EEPROM中读取上次使用的程序号
	delay(5);
	ini_ram();			//从EEPROM中读取当前程序号下的参数存入RAM	
	call_slave();			//点名	
	
//	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)
		{
			urgent_stop=0;
			goto AA;
		}
		if(existent[4]==1)
		{
			delay(2);
			send_param1();
			if(urgent_stop==1)
			{
				urgent_stop=0;
				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;
	 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;
	pc_edit=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;

	current_add=0;
	current_dec=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;
	enter=0;
	scan=0;	
	

⌨️ 快捷键说明

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