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 + -
显示快捷键?