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

📄 osc2_0929.c

📁 基于485的51单片机多机通讯程序
💻 C
📖 第 1 页 / 共 2 页
字号:
						out1=out1-n_da41;
				}
				else
				{
					if(out1>n_da41)
					{
						out1=out1-n_da41;
						if(out1>26)
							osc_dec++;
						else
							out1=out1+n_da41;
					}
				}
				out2=out1;
				CTCON=CTCON|0X08;
				COM=0X76;
				COUNT1=out1%256;
				COUNT1=out1/256;
				COM=0XB6;
				COUNT2=out2%256;
				COUNT2=out2/256;
//				IEN1=IEN1|0X02;
//				gate=1;
				sec_center=1;
				osc=0;
			}
			if(in_sector==1&&K4==ON&&osc_ok==1||in_sector==0)
			{
				if(new_sector==1)
				{
					c_t42_l=pp.x[nonce_sec][1]*5;				//pp.t42_l/10*1000/50
					c_t42_r=pp.x[nonce_sec][2]*5;
					c_change=pp.x[nonce_sec][5]%256;
					temp_out0=900000/pp.x[nonce_sec][3];
					temp_out1=pp.x[nonce_sec][4]*80/3;
					const1=pp.x[nonce_sec][4];						
					if(temp_out0!=out0)
					{
						static_out0=out0;
						if(temp_out0>static_out0)
						{
							delt_out0=temp_out0-static_out0;
							out0=(static_out0*c_change+delt_out0)/c_change;
						}
						else
						{
							delt_out0=static_out0-temp_out0;
							out0=(static_out0*c_change-delt_out0)/c_change;
						}
						COM=0X36;
						COUNT0=out0%256;
						COUNT0=out0/256;
					}
						
					if(temp_out1!=out1) 
					{
						static_out1=out1;
						if(temp_out1>out1)
						{
							delt_out1=temp_out1-out1;
							out1=static_out1*c_change+delt_out1;
							out1=out1/c_change;
						}
						else
						{
							delt_out1=out1-temp_out1;
							out1=static_out1*c_change-delt_out1;
							out1=out1/c_change;
						}
							
						COM=0X76;
						COUNT1=out1%256;
						COUNT1=out1/256;				//半个摆宽
						COM=0XB6;
						COUNT2=out1%256;
						COUNT2=out1/256;
					}
					osc_add=0;
					osc_dec=0;
					sec_center=1;
					share=1;
					temp_c_change=0;
				}
			
				if(sec_change==1)
				{
					temp_c_change++;
					if(temp_c_change%2==0)
						share++;
					if(share<=c_change)
					{
						if(share==c_change||c_change==1)
						{
							out0=temp_out0;
							out1=temp_out1;
							c_change=0;
							share=0;
							temp_c_change=0;
							sec_change=0;
						}
						else
						{
							if(temp_out0>static_out0)
								out0=static_out0+share*delt_out0/c_change;
							else if(temp_out0<static_out0)
								out0=static_out0-share*delt_out0/c_change;
							if(temp_out1>static_out1)
								out1=static_out1+share*delt_out1/c_change;
							else if(temp_out1<static_out1)
								out1=static_out1-share*delt_out1/c_change;
						}
						out2=2*out1;
						COM=0X36;
						COUNT0=out0%256;
						COUNT0=out0/256;
						COM=0X76;
						COUNT1=out1%256;
						COUNT1=out1/256;				//半个摆宽
						COM=0XB6;
						COUNT2=out1%256;
						COUNT2=out1/256;
						sec_center=1;
					}
				}
			}
			else
			{
				gate=0;
				CTCON=CTCON&0xF3;
				static_out0=0;
				static_out1=0;
				osc_ok=0;
			}	
		}	
		CTCON=CTCON|0x08;
		IEN1=IEN1|0x02;
	}
}

void CT1_int (void) interrupt 7			//整个摆宽
{
	CTI1=0;
	gate=0;				//out1、out2门控信号
	CTCON=CTCON&0xF3;
	if(sec_center==1)
	{
		out2=2*out1;
		COM=0XB6;
		COUNT2=out2%256;
		COUNT2=out2/256;
		sec_center=0;
		if(new_sector==1)
		{
			new_sector=0;
			sec_change=1;
		}
	}
	osc_dir=~osc_dir;			//换横摆方向
	t_edge=~t_edge;				//换边缘标志
	osc_out=~osc_out;			//横摆输出
	if(decreased==0)
	{
		if(center_excursion==1)
		{
			if(judge_ok==0)
			{
				if(t_edge==0&&excursion_dir==1||t_edge==1&&excursion_dir==0)//左边缘、向右偏或右边缘、向左偏
				{	
					out1=out1+n_dc41;
					out2=out2+n_dc41;
				}
				if(t_edge==0&&excursion_dir==0||t_edge==1&&excursion_dir==1)
				{
					if(out1>n_dc41)
					{
						out1=out1-n_dc41;
						out2=out2-n_dc41;
					}
				}
				judge_ok=1;
			}
			else
			{
				if(t_edge==1&&excursion_dir==1||t_edge==0&&excursion_dir==0)
				{
					out1=out1-n_dc41;
					out2=out2-n_dc41;
				}
				if(t_edge==1&&excursion_dir==0||t_edge==0&&excursion_dir==1)
				{
					out1=out1+n_dc41;
					out2=out2+n_dc41;
				}
				judge_ok=0;
				center_excursion=0;
			}
			COM=0X76;
			COUNT1=out1%256;
			COUNT1=out1/256;
			COM=0XB6;
			COUNT2=out2%256;
			COUNT2=out2/256;
			osc_enable=0;
			
		}
	}
	IEN1=IEN1|0X10;			//允许CM0,边缘停留时间
}

void CM0_int (void) interrupt 11		//边缘停留时间
{
	CMI0=0;
	c_t42++;
	if(t_edge==0&&c_t42==c_t42_l||t_edge==1&&c_t42==c_t42_r)				//左边缘
	{
		IEN1=IEN1&0XEF;		//禁止CM0
		CTCON=CTCON|0x02;	//CT0下降沿
		IEN1=IEN1|0X01;		//允许CT0
		gate=1;
		osc_out=~osc_out;	//边缘停留时间结束
		c_t42=0;
	}
	CML0=TML2+0X20;
	if(CML0<TML2)
		CMH0=TMH2+1+0X4E;
	else
		CMH0=TMH2+0X4E;
}

void CM1_INT (void) interrupt 12
{
	CMI1=0;
	IEN1=IEN1&0XDF;		//CM1
	c_cm1++;
	if(c_cm1==40)
	{
		COM=0X36;
		COUNT0=0XA0;
		COUNT0=0X0F;
		c_cm1=0;
	}
	else
	{
		CML1=TML2+0X50;		//50ms
		if(CML1>TML2)
			CMH1=TMH2+1+0XC3;
		else
			CMH1=TMH2+0XC3;
		IEN1=IEN1|0X20;		//CM1
	}
}

main()
{
	TMOD=0x22;				//定时器1,方式2;定时器0,方式3,两个8位定时器;
	TL1=0XFD;				//波特率19200
	TH1=0XFD;
	TR1=1;					//启动定时器
	TMOD=0x23;				//定时器0,方式3,两个8位定时器;
	TR1=0;
	TF1=0;
	S0CON=0XF8;				//串口方式3,SM2=1,REN=1,TB8=1,RB8=0,TI=0,RI=0
//	IP1=0X03;				//CT0、CT1高优先级
	IP0=0X98;				//S0=1,T1=1
	ES0=1;					//开串口中断
	ET1=1;
 	EA=1;					//中断总允许
	start_t2();
	urgent_stop=0;
	osc_err=0;
	err_ok=0;
	err=0;
BEGIN:
	if(urgent_stop==1)
	{
		urgent_stop=0;
		err_ok=0;
		EX1=1;
		EX0=1;
	}
	CTCON=0x00;
	IEN1=0x00;
//	COM=0X36;
//	COUNT0=0XA0;
//	COUNT0=0X0F;					//启动横摆脉冲 1K
//	COM=0X76;
//	COUNT1=0x00;
//	COUNT1=0x00;
//	COM=0XB6;
//	COUNT2=0x00;
//	COUNT2=0x00;
	gate=0;				//关门控
	static_out1=0;
	static_out0=0;
	osc_enable=1;				//横摆使能
	osc_dir=0;				//横摆方向,0-左,1-右
	osc_out=1;				//横摆输出
	work=0;
	receive_p_out=0;
	receive_p_in=0;
	called=0;
	start=0;
	new_sector=0;
	in_sector=0;
	nonce_sec=0;
	sec_center=0;
	sec_change=0;				//区间过渡时调整标志
	c_change=0;				//区间过渡时调整次数
	temp_c_change=0;
	K4=0;
	start_osc=0;
	osc_ok=0;
	t_edge=0;				//0-左边缘 1-右边缘
	c_t42=0;
	share=0;				//启动横摆标志
	stop_osc=0;
	decrease=0;
	decreased=0;				//衰减标志
	decrease_ok=0;
	to_begin=0;

	need_para=0;
	POINTER0=0;
	SSUM=0;
	S_ANSW=0;
	POINTER1=0;
	RSUM=0;
	r_byte_nums=4;
	ans=0;
	send=0;
	resend=0;

	osc_l=0;
	osc_r=0;
	center_excursion=0;			//横摆中心偏移标志(DC41)
	center_change=0;			//自动横摆未开时,调整中心
	breadth_add=0;
	breadth_dec=0;
	osc_add=0;				//摆宽增加次数
	osc_dec=0;
	osc=0;
	judge_ok=0;
	motor_stop=0;
	c_cm1=0;

	CML0=TML2+0X20;
	if(CML0<TML2)
		CMH0=TMH2+1+0X4E;
	else
		CMH0=TMH2+0X4E;				//20ms
	write_8574(0xF0);
	EX1=1;
	EX0=1;
	while(start==0)					//等待过程中,接受点名和参数
	{
		if(called==1)
		{
			ini_sbuf(M_main,infor,com_calling,S_ANSW,0,0);
			s_byte_nums=get_byte_nums(infor);
			TR_noans();
			called=0;
		}

		if(receive_p_out==1)
		{
			point=&pp.k4;
			for(p_sec=0;p_sec<14;p_sec++)
				*(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			receive_p_out=0;
		}

		if(receive_p_in==1)
		{
			point=&pp.x[nonce_sec][0];
			for(p_sec=0;p_sec<6;p_sec++)
				*(point+p_sec)=rbuffer[p_sec*2+3]*256+rbuffer[p_sec*2+4];

			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			receive_p_in=0;
		}

		if(osc_l==1)
		{
			COM=0X36;		//1KHz
			COUNT0=0X10;
			COUNT0=0X27;
			gate=1;			//给出横摆脉冲
			osc_dir=0;		//左
			osc_enable=0;		//开使能
			c_cm1=0;
			CML1=TML2+0X50;		//50ms
			if(CML1>TML2)
				CMH1=TMH2+1+0XC3;
			else
				CMH1=TMH2+0XC3;
			IEN1=IEN1|0X20;		//CM1
			osc_l=0;
		}

		if(osc_r==1)
		{
			COM=0X36;		//1KHz
			COUNT0=0X10;
			COUNT0=0X27;
			gate=1;		//开8254门控信号
			osc_dir=1;		//右
			osc_enable=0;		//开使能
			c_cm1=0;
			CML1=TML2+0X50;		//50ms
			if(CML1>TML2)
				CMH1=TMH2+1+0XC3;
			else
				CMH1=TMH2+0XC3;
			IEN1=IEN1|0X20;		//CM1
			osc_r=0;
		}

		if(motor_stop==1)
		{
			gate=0;		//关横摆脉冲
			osc_enable=1;
  			motor_stop=0;
  		}

		if(urgent_stop==1)
			goto BEGIN;
	}
	
	if(pp.k4==ON)
	{
		const1=pp.a41;
		c_t42_l=pp.t42_l*5;				//pp.t42_l/10*1000/50
		c_t42_r=pp.t42_r*5;
		c_change=pp.t43%256;
		n_dc41=pp.dc41*80/3;
		n_da41=pp.da41*80/3;
		temp_out0=900000/pp.v41;				//横摆脉冲, 时钟4M,4*60*0.01*1000000
		static_out0=900000/start_v;
		if(temp_out0>=static_out0)
			delt_out0=temp_out0-static_out0;
		else
			delt_out0=static_out0-temp_out0;

		temp_out1=pp.a41*80/3;				//横摆半宽脉冲
		delt_out1=temp_out1;
		
		out0=static_out0;
		out1=delt_out1/c_change;					
		out2=2*out1;					//横摆整宽脉冲
		COM=0X36;
		COUNT0=out0%256;
		COUNT0=out0/256;
		COM=0X76;
		COUNT1=out1%256;
		COUNT1=out1/256;				//半个摆宽
		COM=0XB6;
		COUNT2=out1%256;
		COUNT2=out1/256;				//整个摆宽
	}
	work=3;					//关8254门控信号
	nonce_sec=0;
	do
	{
		if(start_osc==1)		//开始横摆
		{
			ini_sbuf(M_main,answer,S_ANSW,0,0,0);
			s_byte_nums=4;
			TR_noans();
			osc_dir=0;		//方向——左
			osc_enable=0;		//开横摆使能
			CTCON=CTCON|0x08;	//CT1下降沿
			IEN1=IEN1|0X02;		//允许CT1
			sec_center=1;
			sec_change=1;
			temp_c_change=0;
			share=1;
			osc_ok=1;
			start_osc=0;
			gate=1;
			osc_out=1;
		}

		if(in_sector==1&&new_sector==1&&osc_ok==0&&K4==ON)
		{
			c_t42_l=pp.x[nonce_sec][1]*5;				//pp.t42_l/10*1000/50
			c_t42_r=pp.x[nonce_sec][2]*5;
			c_change=pp.x[nonce_sec][5]%256;
			const1=pp.x[nonce_sec][4];
			temp_out0=900000/pp.x[nonce_sec][3];				//横摆脉冲, 时钟4M,4*60*0.01*1000000
			static_out0=900000/start_v;
			if(temp_out0>=static_out0)
				delt_out0=temp_out0-static_out0;
			else
				delt_out0=static_out0-temp_out0;
				
			temp_out1=pp.x[nonce_sec][4]*80/3;
			delt_out1=temp_out1;
				
			out0=static_out0;
			out1=delt_out1/c_change;
			out2=2*out1;					//横摆整宽脉冲
			COM=0X36;
			COUNT0=out0%256;
			COUNT0=out0/256;
			COM=0X76;
			COUNT1=out1%256;
			COUNT1=out1/256;				//半个摆宽
			COM=0XB6;
			COUNT2=out1%256;
			COUNT2=out1/256;				//整个摆宽
			
			osc_dir=0;		//方向——左
			osc_enable=0;		//开横摆使能
			CTCON=CTCON|0x08;	//CT1下降沿
			IEN1=IEN1|0X02;		//允许CT1
			osc_ok=1;
			sec_center=1;
			sec_change=1;
			temp_c_change=0;
			share=1;
			osc_add=0;
			osc_dec=0;
			gate=1;
			osc_out=1;
		}
		if(urgent_stop==1)
			goto BEGIN;
		if(osc_ok==0&&center_excursion==1)	//未开自动横摆时的左右调整
		{
			if(excursion_dir==0)
				osc_dir=0;		//左
			else
				osc_dir=1;
			CTCON=CTCON|0X02;
			COM=0X76;
			COUNT1=10;
			COUNT1=0;
			IEN1=IEN1|0X01;
			gate=1;
			osc_enable=0;		//开横摆使能
			center_excursion=0;
			center_change=1;
		}

		if(urgent_stop==1)
			goto BEGIN;
	}while(decrease==0);
	
	while(to_begin==0)
	{
		if(urgent_stop==1)
			goto BEGIN;
	}
	goto BEGIN;
}

⌨️ 快捷键说明

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