fpl032dj_v02.c

来自「计算机通过串口与51单片机通讯,在单片机上实现多路硬件设备控制」· C语言 代码 · 共 1,120 行 · 第 1/2 页

C
1,120
字号
		if (b1[2]!=b1_old[2])		// B03
		{
		    b2_ms++;
			if (b2_ms>19)  		 	// 20ms
				b1_old[2]=b1[2];
		}
		else
			b2_ms=0x00;	
//----------------		
		if (b1[3]!=b1_old[3])		// B04  协道2#
		{
		    b3_ms++;
			if (b3_ms>2000 && b1[3]=='1')    // 2s 有球
			{
			    out2|=0x02;	  				 // 2#协口开
				b1_old[3]=b1[3];
			}
			if (b3_ms>50 && b1[3]=='0')    	 // 50s 无球
			{
			    out2&=0xFD;	  				 // 2#协口关
				b1_old[3]=b1[3];
			}
		}
		else
			b3_ms=0x00;
//-------------------
		if (b1[4]!=b1_old[4])		// B05
		{
		    b4_ms++;
			if (b4_ms>19)  		 	// 20ms
				b1_old[4]=b1[4];
		}
		else
			b4_ms=0x00;	
//----------------		
		if (b1[5]!=b1_old[5])		// B06  协道3#
		{
		    b5_ms++;
			if (b5_ms>2000 && b1[5]=='1')    // 2s 有球
			{
			    out2|=0x04;	  				 // 3#协口开
				b1_old[5]=b1[5];
			}
			if (b5_ms>50 && b1[5]=='0')    	 // 50s 无球
			{
			    out2&=0xFB;	  				 // 3#协口关
				b1_old[5]=b1[5];
			}
		}
		else
			b5_ms=0x00;
//----------------		
		if (b1[6]!=b1_old[6])		 // B07
		{
		    b6_ms++;
			if (b6_ms>19)  		 	 // 20ms
				b1_old[6]=b1[6];
		}
		else
			b6_ms=0x00;
//----------------		
		if (b1[7]!=b1_old[7])		 // B08  协道4#
		{
		    b7_ms++;
			if (b7_ms>2000 && b1[7]=='1')    // 2s 有球
			{
			    out2|=0x08;	  				 // 4#协口开
				b1_old[7]=b1[7];
			}
			if (b7_ms>50 && b1[7]=='0')    	 // 50s 无球
			{
			    out2&=0xF7;	  				 // 4#协口关
				b1_old[7]=b1[7];
			}
		}
		else
			b7_ms=0x00;
//---------------------------------------计数检测		
		if (b2[0]!=b2_old[0])		// B09
		{
		    b8_ms++;
			if (b8_ms>4)  		 	// 5ms
			{
				b2_old[0]=b2[0];
				if (b2[0]=='1' && con_ok==1)
				    con_ms++;
			}
		}
		else
			b8_ms=0x00;	
		//---------------------	卡球处理
		if (b2_old[0]=='1' || err_ok==1)
		{
		    kq_ms++;
			if (kq_ms>500)		//0.5s gpx
			{
			    err_ok=1;
				if (dj_set!=dj_setnum3 && kq_ms<505)
				{
				    dj_s=djs_num;
				    dj_set=dj_setnum3;
				}
				if (kq_ms==2500)		  //2.5s
				{
				    dj_s=djs_num;
				    dj_set=dj_setnum3+25;
				}
				if (kq_ms==3000)		  //3s
				{
				    dj_s=djs_num;
				    dj_set=dj_setnum3-25;
				}
				if (kq_ms==3500)		  //3.5s
				{
				    dj_s=djs_num;
				    dj_set=dj_setnum3+25;
				}
				if (kq_ms==3500)		  //4s
				{
				    dj_s=djs_num;
				    dj_set=dj_setnum3-25;
					kq_ms=0;
					err_ok=0;
				}
			}
		}
		else
			kq_ms=0;
//---------------------------------------卡球辅助检测	
		if (b2[1]!=b2_old[1])		// B09
		{
		    b9_ms++;
			if (b9_ms>500 && b2_old[1]=='0')  	 	// 0.5s
			{
				b2_old[1]=b2[1];
				err_ok=1;
				kq_ms=500;
			}
			if (b9_ms>4 && b2_old[1]=='1')  	 	// 5ms
				b2_old[1]=b2[1];
		}
		else
			b9_ms=0;	
//---------------------------------------
		if (b3[0]!=b3_old[0])
		{
		    b16_ms++;
			if (b16_ms>14 && sending_ok==0)  		 // 15ms
			{
				sending_ok=1;
				sendnumber=5;
				sendbuffer[4]='B';
				sendbuffer[3]=b3[0];
				sendbuffer[2]='1';
				sendbuffer[1]='7';
				sendbuffer[0]=enter;
				UDR='@';				//buf==5
				b3_old[0]=b3[0];
				if (b3[0]=='1')
				{
					dj_number=dj_setnum3;
					if (origin_ok==1)
					{
			    	    dj_set=dj_setnum3;
						origin_ok=0;
					}
				}
			}
		}
		else
			b16_ms=0x00;
		//-----------------
		HC273_2(out2);	
	}
}
//*******************************************************************
// 找零点
//*******************************************************************
void reset(void)
{
	if (b3[0]=='1')
	{
	    reset_ok=1;
		dj_number=dj_set=dj_setnum3;
	}
	else
	{
	 	dj_s=djs_num;
		if (dj_number>900)
		    dj_set=50;
		if (dj_number<100)		 // 找不到时
		{
			dj_s=0x00;		  	 // 停止
			HC273_1(0x00);
		}
	}
}
//*******************************************************************
// 数据初始化
//*******************************************************************
void dj_out(void)
{
    if (dj_number<dj_set)
	    F_ok=1;                          // 正转
	else
	{
	    if (dj_number==dj_set)
		{
		    dj_s=0x00;		  			 // 停止
			out1&=0xF0;					 // 另加
			HC273_1(out1);
//			HC273_1(0x00);
		}
		F_ok=0;		  		  			 // 反转
	}
//------------------------电机驱动
    if (dj_ms>dj_s)
	{
	    dj_ms=0x00;
		if (F_ok==1)
		{
	        out_temp=out_temp<<1;     // 前进		
		    if (out_x>3 || out_x==0x00)
			{
			    out_x=0x00;
				out_temp=0x01;
			}
			out_x++;
			dj_number++;
		}
		else
		{
			out_temp=out_temp>>1;	  // 后退		
		    if (out_x==0x00 || out_x==4)
			{
			    out_x=0x04;
				out_temp=0x08;
			}
			out_x--;
			dj_number--;
		}
		out1&=0xF0;
		out1=out1 | out_temp;		//另加
		HC273_1(out1);
	}
//------------------------------------控制步进脉冲宽度,从而控制电流
/*	if ((dj_ms>10) && dj_s!=0x00)
	{
	    out1&=0xF0;					 // 另加
		HC273_1(out1);
//		HC273_1(0x00);
	}*/
}
//*******************************************************************
// 数据初始化
//*******************************************************************
void test(void)
{
    if (dj_s==0)
	{
        if (test_ms==4)
		{
	        dj_s=djs_num;
			dj_set=dj_setnum1;
			test_ms++;
		}
		if (test_ms==8)
		{
	        dj_s=djs_num;
			dj_set=dj_setnum2;
			test_ms++;
		}
		if (test_ms==12)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum3;
		    test_ms++;
		}
		if (test_ms==16)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum4;
		    test_ms++;
		}
		if (test_ms==20)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum5;
		    test_ms++;
		}
//-------------		
		if (test_ms==25)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum2;
		    test_ms++;
		}
		if (test_ms==30)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum4;
		    test_ms++;
		}
		if (test_ms==35)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum1;
		    test_ms++;
		}
		if (test_ms==40)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum3;
		    test_ms++;
		}
		if (test_ms==45)
		{
	        dj_s=djs_num;
		    dj_set=dj_setnum5;
		    test_ms=0x00;
		}
	}
}
//*******************************************************************
// 控制
//*******************************************************************
void control(void)
{
	if (con_x==0)
	{
	    if (b2_ok==1)             // 2#通道申请放球
		{
		    if (dj_set!=dj_setnum2)
			{
			    dj_s=djs_num;
			    dj_set=dj_setnum2;
			}
			if (con_ms>8)             // 放球9
			{
			    con_ms=0x00;
				con_ok=0;
				b2_ok=0;
			}
			else
			{
			    if (dj_number==dj_set)
				    con_ok=1;			   // 开始计数
			}
		}
		else
		    con_x=1;
	}
    if (con_x==1)
	{
	    if (b1_ok==1)                  // 1#通道申请放球
		{
		    if (dj_set!=dj_setnum1)
			{
			    dj_s=djs_num;
				dj_set=dj_setnum1;
			}
			if (con_ms>12)             // 放球13
			{
			    con_ms=0x00;
				con_ok=0;
				b1_ok=0;
			}
			else
			{
			    if (dj_number==dj_set)
				    con_ok=1;			   // 开始计数
			}
		}
		else
		    con_x=2;
	}
	if (con_x==2)
	{
	    if (b2_ok==1)             	   // 2#通道申请放球
		{
		    if (dj_set!=dj_setnum2)
			{
			    dj_s=djs_num;
			    dj_set=dj_setnum2;
			}
			if (con_ms>8)             // 放球9
			{
			    con_ms=0x00;
				con_ok=0;
				b2_ok=0;
			}
			else
			{
			    if (dj_number==dj_set)
 				    con_ok=1;			   	   // 开始计数
			}
		}
		else
		    con_x=3;
	}
	if (con_x==3)
	{
	    if (b3_ok==1)             // 4#通道申请放球
		{
		    if (dj_set!=dj_setnum4)
			{
			    dj_s=djs_num;
			    dj_set=dj_setnum4;
			}
			if (con_ms>8)             // 放球9
			{
			    con_ms=0x00;
				con_ok=0;
				b3_ok=0;
			}
			else
			{
			    if (dj_number==dj_set)
				    con_ok=1;			   // 开始计数
			}
		}
		else
		    con_x=4;
	}
	if (con_x==4)
	{
	    if (b4_ok==1)             // 5#通道申请放球
		{
		    if (dj_set!=dj_setnum5)
			{
			    dj_s=djs_num;
			    dj_set=dj_setnum5;
			}
			if (con_ms>12)             // 放球13
			{
			    con_ms=0x00;
				con_ok=0;
				b4_ok=0;
			}
			else
			{
			    if (dj_number==dj_set)
				    con_ok=1;			   // 开始计数
			}
		}
		else
		    con_x=5;
	}
//--------------------	
	if (con_x==5)
	{
	    if (b3_ok==1)             // 4#通道申请放球
		{
		    if (dj_set!=dj_setnum4)
			{
			    dj_s=djs_num;
			    dj_set=dj_setnum4;
			}
			if (con_ms>8)             // 放球9
			{
			    con_ms=0x00;
				con_ok=0;
				b3_ok=0;
			}
			else
			{
			    if (dj_number==dj_set)
				    con_ok=1;			   // 开始计数
			}
		}
		else
		    con_x=6;
	}
	//------------------
	if (con_x==6)
	{
	   	if (b1_ok==0 && b2_ok==0 && b3_ok==0 && b4_ok==0)
		{
	        if (dj_set!=dj_setnum3 && origin_ok==0)
			{
		        dj_s=djs_num;
				if (dj_setnum3<dj_set)
			        dj_set=dj_setnum3-90;     // 3#通道球返回(无申请时)
				else
		            dj_set=dj_setnum3+90; 	  // 3#通道球返回(无申请时)
				origin_ok=1;
		    }
		}
	    if (origin_ok==0)
	        con_x=0;
	}
	if (con_x>6)
	    con_x=0;
}
//*******************************************************************
// 数据初始化
//*******************************************************************
void data_init(void)
{
    HC273_1(0x00);
	HC273_2(0x00);
	dj_number=dj_setnum3;
	dj_set=1000;
	con_x=0;
	reset_ok=0;
	error_x=0x00;
	b2_old[1]=0x30;
	b3_old[0]=0x30;
	//----------------eeprom 数据
	dj_setnum1=r_eeprom(0);
	if (dj_setnum1==0x00FF)
	{
	    dj_setnum1=780;
		dj_setnum2=670;
		dj_setnum4=320;
		dj_setnum5=220;
//		testgpx=0x11;
	}
	else
	{
	    dj_setnum1=dj_setnum1+653;    // 653+127=780
		dj_setnum2=r_eeprom(1)+543;	  // 543+127=670
		dj_setnum4=r_eeprom(2)+193;	  // 193+127=320
		dj_setnum5=r_eeprom(3)+93;	  // 93+127=220
//		testgpx=0x22;
	}
}
//*******************************************************************
// 主程序  
//*******************************************************************
void main(void)
{
    init();                     // 单片机初始化
	WDT_init();					// 内部看门狗初始化
	data_init();				// 数据初始化
	SEI();						// 开中断
	while(1)
	{
	    clock();
		command();
		button_in();
//		if (error_x<2)			   		 // 2次 10秒无球
//		{
		    if (reset_ok==0)
		        reset();				 // 找零点
			else
		 	{
		     	if (test_ok==0xFF)	   	 // test
			        test();
				else
				{
				    test_ms=0x00;
					if (err_ok==0)
					    control();
				}
			}
			dj_out();
//		}
	}
}

⌨️ 快捷键说明

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