📄 newserver507.c
字号:
LED_N4=!LED_N4;
OUT_N4=!OUT_N4;
}
else if (work_state==STARTMODE)
{
// LED_N4=1;
key_hurry=4;
}
break;
case 4:
if (work_state==OVERMODE)
{
LED_N5=!LED_N5;
OUT_N5=!OUT_N5;
}
else if (work_state==STARTMODE)
{
// LED_N5=1;
key_hurry=5;
}
break;
case 5:
if (work_state==OVERMODE)
{
LED_N6=!LED_N6;
OUT_N6=!OUT_N6;
}
else if (work_state==STARTMODE)
{
// LED_N6=1;
key_hurry=6;
}
break;
case 6:
if (work_state==OVERMODE)
{
LED_N7=!LED_N7;
OUT_N7=!OUT_N7;
}
else if (work_state==STARTMODE)
{
// LED_N7=1;
key_hurry=7;
}
break;
case 7:
if (work_state==OVERMODE)
{
LED_N8=!LED_N8;
OUT_N8=!OUT_N8;
}
else if (work_state==STARTMODE)
{
// LED_N8=1;
key_hurry=8;
}
break;
case 8:
if (work_state==OVERMODE)
{
LED_N9=!LED_N9;
OUT_N9=!OUT_N9;
}
else if (work_state==STARTMODE)
{
// LED_N9=1;
key_hurry=9;
}
break;
case 9:
if (work_state==OVERMODE)
{
LED_N10=!LED_N10;
OUT_N10=!OUT_N10;
}
else if (work_state==STARTMODE)
{
// LED_N10=1;
key_hurry=10;
}
break;
case 10:
if (work_state==0) //A/M键
{
work_state=SETMODE;
disp_bufh=disp_bufl=0;
LED_AM=1;
}
break;
case 11:
if (work_state==SETMODE) //START键
{
disp_bufh=disp_bufl=0;
LED_START=LED_AM=1;
work_state=STARTMODE;
sendata[1]=STARTCOMMAND;
sendata[2]=out_n_bufh;
sendata[3]=out_n_bufl;
SEND_DATA();
slave_int_bit=com_ask_bit=com_answer_bit=0;
ask_count=task_count=0;
IE0=0;
EX0=1; //打开中断等待从机抢答。
key_hurry=0;
}
break;
case 12:
if (work_state==OVERMODE) //TEST测试键
{
work_state=TESTMODE;
disp_bufh=disp_bufl=0;
out_n_bufh=out_n_bufl=0;
LED_TEST=LED_N1=1;
IE0=0;
task_count=1;
sendata[1]=TESTCOMMAND;
sendata[2]=task_count;
sendata[3]=0X07;
SEND_DATA();
time_s=0;
EX0=1; //开中断准备第一个。
}
break;
case 13: //结束键
LED_RST=!LED_RST;
work_state=OVERMODE;
if (LED_RST==0)
{
disp_bufh=disp_bufl=Number_ALL_light;
out_n_bufh=0x07;
out_n_bufl=0xfe;
}
else
{
disp_bufh=disp_bufl=0;
LED_RST=1;
out_n_bufh=out_n_bufl=0x00;
}
sendata[1]=RESETCOMMAND;
sendata[2]=sendata[3]=0x00;
SEND_DATA();
break;
}
}
}
key_buffer=0;
}
}
//工作状态处理。
void WORK_PROCESS()
{
switch (work_state)
{
case OVERMODE:
EX0=0;
IE0=0;
break;
case TESTMODE: //测试状态。
{
if (time_s<7) //主机查询时间未超过7秒钟,则判有无从可中断。
{
if (slave_int_bit==1) //从机有才准备发命令。
{
if (com_ask_bit==1) //主机发出命令后判从机有无回应。
{
if (com_answer_bit==1) //主机有回应才校对返回值。
{
if (ReceiveData[2]==task_count&&ReceiveData[3]==1) //从机返回值为查询机,且有抢答。
{
if (INT==1) //收到了主机命令并接收正确后从机INT脚才返回1。
{
com_answer_bit=0;
time_s=8; //跳转到下一从机
}
}
}
}
else
{
com_ask_bit=1; //主机尚未发出命令,则发出命令。
sendata[1]=ASKCOMMAND;
sendata[2]=task_count;
sendata[3]=0x01;
SEND_DATA();
}
}
}
else //主机查询时间超过7秒,则复位所有从机,并向下一从机发出测试命令。
{
time_s=0;
task_count++;
if (task_count>10) task_count=1;
sendata[1]=RESETCOMMAND;
sendata[2]=sendata[3]=0x00;
SEND_DATA();
disp_bufh=disp_bufl=0;
LED_TEST=1;
IE0=0;
LEDN_LIGHT(task_count);
slave_int_bit=com_ask_bit=com_answer_bit=0;
sendata[1]=TESTCOMMAND;
sendata[2]=task_count;
sendata[3]=0x01;
SEND_DATA();
IE0=0;
EX0=1;
}
}
break;
case STARTMODE: //抢答及轮询状态。
if (slave_int_bit==1) //有从机中断吗//并列为键盘按键
{
IE0=EX0=0;
if (com_ask_bit==1) //已发送查询命令??
{
if (time_coms<11) //主机应答时间不可超过75MS。//容错处理。
{
if (com_answer_bit==1) //有应答且正确才改变状态。
{
com_answer_bit=0;
if (ReceiveData[1]==ANSWERCOMMAND&&ReceiveData[2]==task_count)
{
if (INT==1&&ReceiveData[3]==0X01)
{
time_coms=0;
work_state=0x81;
slave_int_bit=com_ask_bit=0;
}
else
{
com_ask_bit=0;
}
}
}
}
else
{
com_ask_bit=0;
com_answer_bit=0;
}
}
else
{
if (ask_count<3) //发送查询命令时不允许超过3个循环。
{
com_ask_bit=1;
task_count++;
if (task_count>10) {task_count=1;ask_count++;} //查询到10为一个循环。
sendata[1]=ASKCOMMAND;
sendata[2]=task_count;
sendata[3]=0x01;
SEND_DATA();
time_coms=0;
com_answer_bit=0;
}
else //超过3个循环则视从机中断无效,不再发送。
{
slave_int_bit=0;
IE0=EX0=0;
task_count=4;
ask_count=10;
LED_AM=0;
}
}
}
else if (key_hurry!=0) //有键盘按键吗//并列为从机中断
{
task_count=key_hurry;
key_hurry=0;
IE0=EX0=0;
work_state=0x81;
}
break;
case 0x81: //在抢答轮询后强制点亮某灯。
work_state=0x82;
LEDN_LIGHT(task_count);
sendata[1]=RESETCOMMAND;
sendata[2]=0X00;
sendata[3]=0x01;
SEND_DATA();
sendata[1]=LAMPCOMMAND;
sendata[2]=task_count;
sendata[3]=0x01;
SEND_DATA();
break;
case 0x82: //抢答结束
break;
default:
break;
}
}
main()
{
rst:
initMCU();
LED_RST=1;
sendata[1]=RESETCOMMAND;
sendata[2]=sendata[3]=0x00;
SEND_DATA();
delay(100);
sendata[1]=RESETCOMMAND;
sendata[2]=sendata[3]=0x00;
SEND_DATA();
for(;;)
{
LED_KEY();
KEY_PROCESS();
WORK_PROCESS();
}
goto rst;
goto rst;
goto rst;
goto rst;
goto rst;
goto rst;
}
void ext0() interrupt 0 using 1
{
EX0=0;
IE0=0;
slave_int_bit=1;
}
void timer0() interrupt 1 using 2
{
TL0=0x00;TH0=0xee;
time_coms++;
time_5ms++;
if(time_5ms>200)
{
time_5ms=0;time_s++;
}
scan=1;
}
void series() interrupt 4 using 3
{
uchar i;
if(RI)
{
RI=0;
if(com_answer_bit==0)
{
for(i=0;i<4;i++) ReceiveData[i]=ReceiveData[i+1];
ReceiveData[4]=SBUF;
if(ReceiveData[0]==0x7e&&ReceiveData[4]==0x7f)
{
com_answer_bit=1;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -