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

📄 newserver507.c

📁 受人之托制作的单片机抢答器。很稳定。但成本高些。
💻 C
📖 第 1 页 / 共 2 页
字号:
					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 + -