基於51單片機的多功能八路搶答器

1.功能介紹
多功能八路搶答器是基於51單片機來設計的,除了可以實現最基本功能——8路搶答外,還具有自動處理犯規選手,搶答時間調整,還可以進行答題,計分,並且可以查詢或修改分數。

2.硬件設計
該搶答器的硬件由五個部分組成,包括單片機、按鍵電路、數碼管顯示電路、指示燈電路和聲音提示電路。硬件框圖如下
在這裏插入圖片描述
(2)硬件原理圖
由於每個部分的硬件電路都比較簡單,就不做介紹了,大家直接看圖。
在這裏插入圖片描述
在這裏插入圖片描述
3.軟件設計
(1)軟件流程圖
在這裏插入圖片描述
(2)程序源碼
由於本例程代碼比較多,所以只貼出主程序代碼

void main()
{ uint j;//用來構成循環
  TMOD=0x11;//T0設置爲16位定時方式
  TH0=0x3c;	
  TL0=0xb0;//50ms
  IE= 0x82;  //允許T0中斷
  TR0=0;     //關閉定時開關
while(1)
  {     while(1) 
          { LED01=1;LED02=1;LED03=1;LED04=1;LED05=1;LED06=1;LED07=1;LED08=1;//監視燈初始化爲滅
		    if(KS1==0)	{ks1=1;break;}//開始搶答倒計時
		    if(KS2==0)	 {ks2=1;break;}//開始答題倒計時
		    if(ADD1==0)  {delaynms(20);  if(ADD1==0)  dtime++;if(dtime>=1000) dtime=0;}//答題時間調整
			if(MIN1==0)  {delaynms(20);  if(MIN1==0)  dtime--;if(dtime<0) dtime=999;}
			if(ADD10==0) {delaynms(20);	 if(ADD10==0) dtime=dtime+10;if(dtime>=1000) dtime=0;}
			if(MIN10==0) {delaynms(20);	 if(MIN10==0) dtime=dtime-10;if(dtime<0) dtime=999;}
		    shumasm(LED[qdtime_2],dtime);//數碼管動態掃描4位  
			if(B_score==0)
			   {   delaynms(20);
			      if(B_score==0)
				    while(1)
				      { if(B_score==0)
						 { delaynms(20);if(B_score==0) break;}//再次按下B_score退出分數調節   
					   shumasm(LED_num[num],score[num]);	      //數碼管動態掃描4位,顯示選手編號和對應分數
					   if(next==0)
					     { delaynms(20);if(next==0) num++; if(num==9) num=0;}//顯示下一位選手編號和對應分數
					   if(last==0)
					     { delaynms(20);if(last==0)	num--; if(num<0) num=8;}//顯示上一位選手編號和對應分數
					   if(REST==0)  {delaynms(20); if(REST==0) score[num]=0; }//將當前選手分數清零
			           if(ADD1==0)  {delaynms(20);  if(ADD1==0)  score[num]++;if(score[num]>=1000) score[num]=0;}//調節數碼管上對應選手分數,分數範圍0-999
			           if(MIN1==0)  {delaynms(20);  if(MIN1==0)  score[num]--;if(score[num]<0) score[num]=999;}
			           if(ADD10==0) {delaynms(20);	 if(ADD10==0) score[num]=score[num]+10;if(score[num]>=1000) score[num]=0;}
			           if(MIN10==0) {delaynms(20);	 if(MIN10==0) score[num]=score[num]-10;if(score[num]<0) score[num]=999;}	 
					   }
			   }
					    
		   }
		if(ks1==1)	//開始搶答倒計時
		  { ks1=0;
		    TR0=1;//開始倒計時
			count=0;//計數標記位歸零
			second=qdtime_2;
			P2=0xef;//選通最低位
			K[1]=0;K[2]=0;K[3]=0;K[4]=0;K[5]=0;K[6]=0;K[7]=0;K[8]=0;//選手按鈕按下標記位歸零
			while(1)
			    {   
				    P0=LED[second];
				    if(second==0) {TR0=0;P0=LED[0];break;}
				    if(second<=4)  BEEP();//提示搶答快要開始  		                 
		            if(K1==0&&K[1]==0) {LED01=0;K[1]=1;}//選手監視,並用紅燈標記犯規選手
			        if(K2==0&&K[2]==0) {LED02=0;K[2]=1;}
			        if(K3==0&&K[3]==0) {LED03=0;K[3]=1;}
			        if(K4==0&&K[4]==0) {LED04=0;K[4]=1;}
			        if(K5==0&&K[5]==0) {LED05=0;K[5]=1;}
 			        if(K6==0&&K[6]==0) {LED06=0;K[6]=1;}
			        if(K7==0&&K[7]==0) {LED07=0;K[7]=1;}
			        if(K8==0&&K[8]==0) {LED08=0;K[8]=1;}
		            
				if(END==0) {delaynms(10); if(END==0) { END_mark=1;break;}}//可按結束鍵隨時結束搶答環節       
				}
			if(END_mark==1)  {END_mark=0;continue;}//若結束鍵按下則結束搶答環節
		    if(K[1]==1&&K[2]==1&&K[3]==1&&K[4]==1&&K[5]==1&&K[6]==1&&K[7]==1&&K[8]==1)		//若所有選手均犯規則報警一段時間後自動結束本次搶答
		       { for(j=0;j<22;j++)
			       BEEP2();
				   continue;
			   }
		   qdtime=score[0];
		   count=0;//計數標記位歸零
		   second=qdtime;
		   num_mark=0;
			while(1)
			     { if(END==0) {delaynms(10); if(END==0) {END_mark=1;break;}}
				   switch((uchar)!(K1||K[1])*1+(uchar)!(K2||K[2])*3+(uchar)!(K3||K[3])*5+(uchar)!(K4||K[4])*10+(uchar)!(K5||K[5])*20+(uchar)!(K6||K[6])*40+(uchar)!(K7||K[7])*80+(uchar)!(K8||K[8])*160)
				     {  
				      case 1:  num_mark=1;break;
					  case 3:  num_mark=2;break;
					  case 5:  num_mark=3;break;
					  case 10: num_mark=4;break;
					  case 20: num_mark=5;break;
					  case 40: num_mark=6;break;
					  case 80: num_mark=7;break;
					  case 160:num_mark=8;break;
					  }
					if(num_mark!=0)  break;//有人搶答成功則結束搶答	 
					if(qdtime!=0)//搶答時間不爲0秒時則啓動搶答倒計時  
					      {   if(second<=6) BEEP();
						      TR0=1;shumasm(LED[num_mark],second);
						      if(second==0)  {TR0=0;break;}	  
						  }	
				 }
			while(1)
			     { if(END_mark==1) {END_mark=0;break;}
				   P2=0xef;
				   P0=LED[num_mark];
				   if(num_mark!=0)   BEEP3();//提示搶答成功
				   else  BEEP2(); //警告音
				   if(END==0) {delaynms(10); if(END==0) break;}//可按結束鍵繼續下一輪搶答或進入答題
				   }
		  }
		else if(ks2==1)	//開始答題倒計時
		   {   ks2=0;
		       TR0=1;
			   num=num_mark;//將搶答成功選手編號給num
			   count=0;//計數標記位歸零
			   second=dtime;
			   while(1)
			   {  shumasm(0xff,second);//即用後三位顯示答題倒計時
				  if(second<10) BEEP();//提示答題時間將到
			      if(second==0) 
			        {  TR0=0;break;
					}
				  if(END==0) 
				  {
				  	   delaynms(10); 
				  	   if(END==0) 
					   {
							while(!END);  //釋放檢測
							break;
						}
				   }//可按結束鍵隨時結束答題
				}
			  while(1)
		         {	shumasm(LED_num[num],score[num]);	      //數碼管動態掃描4位,進入搶答成功選手分數調節
				    if(END==0) {delaynms(10); if(END==0) break;}//可按結束鍵繼續下一輪搶答或進入答題					
					if(ADD1==0)  {delaynms(20);  if(ADD1==0)  score[num]++;if(score[num]>=1000) score[num]=0;}//調節數碼管上對應選手分數,分數範圍0-999
			        if(MIN1==0)  {delaynms(20);  if(MIN1==0)  score[num]--;if(score[num]<0) score[num]=999;}
			        if(ADD10==0) {delaynms(20);	 if(ADD10==0) score[num]=score[num]+10;if(score[num]>=1000) score[num]=0;}
			        if(MIN10==0) {delaynms(20);	 if(MIN10==0) score[num]=score[num]-10;if(score[num]<0) score[num]=999;}	 

			      }
				 
	       }
  }	   	    
}

源碼+PCB+AD原理圖 下載:關注公衆號,首頁回覆“搶答器”獲取資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章