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

📄 qiangdaxitong.c

📁 基于AT89S52的智能抢答系统
💻 C
📖 第 1 页 / 共 2 页
字号:
    else DisplayNumber(ss-tt,Number_C);	
   if(x) {if(CANCEL==0){delayms(250); if(CANCEL==0) {Beeper(2);return 0;}}}
    else if(SURE==0){delayms(250);if(SURE==0){Beeper(2);return 0;}}  //跳出
  }
   ss=60;
   mm--;
   if(!mm) Beeper(2);								 //分钟提醒
    else Beeper(1);
 }
 while(mm+1);
 Number_A1[1]=black;								 //恢复原显示
 Number_A1[0]=Group;
 Number_C[1]=Number_C[0]=0;
 DisplayNumber(No_,Number_A2);
 Beeper(3);											 //提醒跳出
 return 1;
}																		   
/****************************************************************************
* 名    称:SuiJi()
* 功    能:随机选组
* 入口参数:无
* 出口参数:无
* 显示描述:数码管来回做流水灯显示,左后停在所选组上
*****************************************************************************/
void SuiJi()
{
 Group=count;          								 //此函数功能所在
 Number_C[0]=Number_C[1]=black;						 //C置暗
 Time_temp=1; tt=1;
 while(Time_temp<=7)
 {
   switch(tt)									     //循环流水显示
   {
    case 1: Number_A1[1]=Number_B2[1]=black; Number_A1[0]=Number_B1[1]=1; break;
    case 2: Number_A1[0]=Number_B1[1]=black; Number_A1[1]=Number_B2[1]=2; break;
    case 3: Number_A1[1]=Number_B2[1]=black; Number_A2[0]=Number_B3[1]=3; break;
    case 4: Number_A2[0]=Number_B3[1]=black; Number_A2[1]=Number_B4[1]=4; break;
    case 5: Number_A2[1]=Number_B4[1]=black; Number_A2[0]=Number_B3[1]=3; break;
    case 6: Number_A2[0]=Number_B3[1]=black; Number_A1[1]=Number_B2[1]=2; break;
    }	
  if(tt>6) {Time_temp+=3; tt=1;}					 //控制速度
 }
 Time_temp=10;
 for(tt=1;tt<=Group;)								 //最后选定
 {
  switch(tt)
  {
   case 1: Number_A1[1]=Number_B2[1]=black; Number_A1[0]=1; Number_B1[1]=1; break;
   case 2: Number_A1[0]=Number_B1[1]=black; Number_A1[1]=2; Number_B2[1]=2; break;
   case 3: Number_A1[1]=Number_B2[1]=black; Number_A2[0]=3; Number_B3[1]=3; break;
   case 4: Number_A2[0]=Number_B3[1]=black; Number_A2[1]=4; Number_B4[1]=4; break;
  }
 }
 Number_A2[0]=Number_A2[1]=black;					 //恢复显示
 Number_B1[1]=Number_B2[1]=Number_B3[1]=Number_B4[1]=black;
 Number_A1[0]=Group; Number_A1[1]=black;    
 Time_temp=20;
} 											   
/****************************************************************************
* 名    称:QiangDa()
* 功    能:抢答与随机的选择
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void QiangDa()
{
  Group=0;
  DisplayNumber(No_,Number_A2);
  Number_A1[0]=Number_A1[1]=black;
  Number_B1[1]=Number_B2[1]=Number_B3[1]=Number_B4[1]=black;
  Number_B1[0]=Number_B2[0]=Number_B3[0]=Number_B4[0]=black;
  while(1)							                 //抢答与随机的选择
  {
   KEYchoose(1);   delayms(10);
   if(CANCEL==0){delayms(250);if(CANCEL==0){KEYCHOOSE_2=KEYCHOOSE_1=1;SuiJi();break;}}
   KEYchoose(0); 
   if(KEY1==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=1; break;}
   if(KEY2==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=2; break;}
   if(KEY3==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=3; break;}
   if(KEY4==0) {KEYCHOOSE_2=1; Group=Number_A1[0]=4; break;}
  }
  Number_C[0]=Number_C[1]=black;
  switch(Group)										 //闪烁提醒
  {
   case 1:KEY1=0;Number_B1[1]=1;delayms(300);B1=0;delayms(300);B1=1;delayms(300);B1=0;break;
   case 2:KEY2=0;Number_B2[1]=2;delayms(300);B2=0;delayms(300);B2=1;delayms(300);B2=0;break;
   case 3:KEY3=0;Number_B3[1]=3;delayms(300);B3=0;delayms(300);B3=1;delayms(300);B3=0;break;
   case 4:KEY4=0;Number_B4[1]=4;delayms(300);B4=0;delayms(300);B4=1;delayms(300);B4=0;
  }
  delayms(300);
  B1=B2=B3=B4=1;
  Beeper(2);
  DisplayNumber(Group,Number_C);					 //恢复显示
  DisplayNumber(Result[0],Number_B1); 
  DisplayNumber(Result[1],Number_B2); 
  DisplayNumber(Result[2],Number_B3); 
  DisplayNumber(Result[3],Number_B4); 
  Time_temp=20;
}
/****************************************************************************
* 名    称:Save_Mark()
* 功    能:存储一轮情况
* 入口参数:mm  (两个值Mark和0,判断答题正确与否)
* 出口参数:无
* 显示描述:1、2、3、4顺序移入
*****************************************************************************/
void Save_Mark(unsigned char mm)
{
 Save_NOW=Read24c02(NOWsave);						 //获取存储位置
 switch(Group)										 //存储各主要项
 {
  case 1: Result[0]+=mm;DisplayNumber(Result[0],Number_B1);Write24c02(Result[0],GROUP_1);break;
  case 2: Result[1]+=mm;DisplayNumber(Result[1],Number_B2);Write24c02(Result[1],GROUP_2);break;
  case 3: Result[2]+=mm;DisplayNumber(Result[2],Number_B3);Write24c02(Result[2],GROUP_3);break;
  case 4: Result[3]+=mm;DisplayNumber(Result[3],Number_B4);Write24c02(Result[3],GROUP_4);
 }
  Write24c02(No_,Save_NOW);
  Write24c02(Group,Save_NOW+1);
  Write24c02(Mark,Save_NOW+2);
  Write24c02(Save_NOW+3,NOWsave);
  Write24c02(Save_NOW+3,NOWcancel);
  Write24c02(++No_,NOW_NO_);						 
													 //完成存储
  Number_A1[0]=Number_A1[1]=Number_A2[0]=Number_A2[1]=black;
  Time_temp=10;
  for(tt=1;tt<5;)
   switch(tt)										 //1、2、3、4顺序移入
	{												 
	 case 1: Number_A2[1]=1; break;
	 case 2: Number_A2[1]=2; Number_A2[0]=1; break;
	 case 3: Number_A2[1]=3; Number_A2[0]=2; Number_A1[1]=1; break;
	 case 4: Number_A2[1]=4; Number_A2[0]=3; Number_A1[1]=2; Number_A1[0]=1;break;
	}
  Time_temp=20;
  Beeper(1);
}
/****************************************************************************
* 名    称:All_CANCEL()
* 功    能:取消上一次存储
* 入口参数:无
* 出口参数:无
* 显示描述:4、3、2、1顺序移出
*****************************************************************************/
void All_CANCEL()
{
 unsigned char mm,gg;						         //谋次的Mark和Group
 Cancel_NOW=Read24c02(NOWcancel);					 //取消操作的入口地址
 mm=Read24c02(Cancel_NOW-1);
 gg=Read24c02(Cancel_NOW-2);		
 if(Cancel_NOW-3>=SAVEbegin)  						 //撤销各项
 {
  Write24c02(0,Cancel_NOW-1);
  switch(gg)
  {
  case 1: Result[0]-=mm;DisplayNumber(Result[0],Number_B1); Write24c02(Result[0],GROUP_1);break;
  case 2: Result[1]-=mm;DisplayNumber(Result[1],Number_B2); Write24c02(Result[1],GROUP_2);break;
  case 3: Result[2]-=mm;DisplayNumber(Result[2],Number_B3); Write24c02(Result[2],GROUP_3);break;
  case 4: Result[3]-=mm;DisplayNumber(Result[3],Number_B4); Write24c02(Result[3],GROUP_4);
  }
  Write24c02(Cancel_NOW-3,NOWcancel);
													 //完成撤销
  Number_A1[0]=Number_A1[1]=Number_A2[0]=Number_A2[1]=black;
  Time_temp=10;
  for(tt=1;tt<5;)
   switch(tt)										 //4、3、2、1顺序移出
	{
	 case 1: Number_A1[0]=4; break;
	 case 2: Number_A1[0]=3; Number_A1[1]=4; break;
	 case 3: Number_A1[0]=2; Number_A1[1]=3; Number_A2[0]=4; break;
	 case 4: Number_A1[0]=1; Number_A1[1]=2; Number_A2[0]=3; Number_A2[1]=4;break;
	}
  Time_temp=20;
  Beeper(3);
 }
}
/****************************************************************************
* 名    称:Test()
* 功    能:检测各组件的完好
* 入口参数:无
* 出口参数:无
* 显示描述:从0开始数数
*****************************************************************************/
void Test()
{
  P0=LED_table[0]; LED1=0; delayms(200);LED1=1;		 //从0开始
  P0=LED_table[1]; LED2=0; delayms(200);LED2=1;	
  P0=LED_table[2]; LED3=0; delayms(200);LED3=1;	
  P0=LED_table[3]; LED4=0; delayms(200);
  BEEP=0;  delayms(300);BEEP=1; LED4=1;	

  P0=LED_table[4]; LED5=0;  delayms(200); LED5=1;	
  P0=LED_table[5]; LED6=0;  delayms(200); LED6=1;	
  P0=LED_table[6]; LED7=0;  delayms(200); LED7=1;	
  P0=LED_table[7]; LED8=0;  delayms(200); LED8=1;	
  P0=LED_table[8]; LED13=0;  delayms(200);LED13=1;  
  P0=LED_table[9]; LED14=0;  delayms(200);LED14=1; 

  NONE();
  B3=1;

  Sys_Init();   					                 //初始化定时器

  DisplayNumber(10,Number_B3);     
  delayms(300);
 
  B3=0; B4=1;	

  DisplayNumber(11,Number_B4);     
  Beeper(2); delayms(300); 
  Number_B3[0]=Number_B3[1]=Number_B4[0]=Number_B4[1]=0;

  ALLon();						        
  KEYchoose(1);								         //开始检测主按键
  while(UP==1);		 B1=0;	 
  while(DOWN==1);	 B2=0;
  while(SURE==1);	 B3=0;
  while(CANCEL==1);	 B4=0;
  KEYchoose(0);		 A2=0;
  while(KEY1==1);	 B1=1;
  while(KEY2==1);	 B2=1;
  while(KEY3==1);	 B3=1;
  while(KEY4==1);	 B4=1;
  Beeper(2);
  A2=1; 
  KEYchoose(1);
}																			   
/****************************************************************************
* 名    称:Load_1()
* 功    能:选择延续上一轮时载入初始化
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void Load_1()
{
  Sys_Init();										 //初始化定时器
  Group=Read24c02(NOWgroup);						 //恢复上一轮各项的值
  No_=Read24c02(NOW_NO_);
  Mark=Read24c02(NOWmark);
  Time_m=Read24c02(NOWtime_m);
  Time_s=Read24c02(NOWtime_s);
  Result[0]=Read24c02(GROUP_1);
  Result[1]=Read24c02(GROUP_2);
  Result[2]=Read24c02(GROUP_3);
  Result[3]=Read24c02(GROUP_4);
  Save_NOW=Read24c02(NOWsave);
  if(Save_NOW==SAVEbegin) 
   {Write24c02(SAVEbegin+2,NOWcancel); Write24c02(0,SAVEbegin+2); }
  else	Write24c02(Save_NOW,NOWcancel);
  
}

/****************************************************************************
* 名    称:Load_2()
* 功    能:选择新一轮时载入初始化
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void Load_2()
{
  Write24c02(3,NOWmark);    Mark=3;					 //初始化各主要值
  Write24c02(1,NOWtime_m);	Time_m=1;
  Write24c02(0,NOWtime_s); 																			
  Write24c02(0,GROUP_1);  
  Write24c02(0,GROUP_2); 
  Write24c02(0,GROUP_3); 
  Write24c02(0,GROUP_4);  
  Write24c02(1,NOW_NO_);   No_=1;
  Write24c02(0,NOWgroup);
  Write24c02(SAVEbegin,NOWsave);Save_NOW=SAVEbegin;
  Write24c02(0,SAVEbegin+2);  
  Write24c02(SAVEbegin+2,NOWcancel);
}


/****************************************************************************
* 名    称:Check_Mark()
* 功    能:查看各题的分数、选组、得分情况
* 入口参数:无
* 出口参数:0和1  (没用)
* 显示描述:1、2、3、4顺序移入、移出
*****************************************************************************/
bit Check_Mark()
{
 unsigned char nn,gg,mm,ss,ns;	 //谋次的No_、Group、Mark、读取地址和总开始地址
 Time_temp=10; tt=0;
 while(1)											
 {
  switch(tt)										 //1、2、3、4顺序移入、移出
  {
   case 1: Number_A2[1]=1; break;
   case 2: Number_A2[1]=2; Number_A2[0]=1; break;
   case 3: Number_A2[1]=3; Number_A2[0]=2; Number_A1[1]=1; break;
   case 4: Number_A2[1]=4; Number_A2[0]=3; Number_A1[1]=2; Number_A1[0]=1;break;
   case 5: Number_A2[1]=black; Number_A2[0]=4;Number_A1[1]=3;Number_A1[0]=2;break;
   case 6: Number_A2[0]=black; Number_A1[1]=4;Number_A1[0]=3;break;
   case 7: Number_A1[1]=black; Number_A1[0]=4;break;
   case 8: Number_A1[0]=black; break;
   case 9: Number_A1[0]=4; break;
   case 10: Number_A1[0]=3; Number_A1[1]=4; break;
   case 11: Number_A1[0]=2; Number_A1[1]=3; Number_A2[0]=4; break;
   case 12: Number_A1[0]=1; Number_A1[1]=2; Number_A2[0]=3; Number_A2[1]=4;break;
   case 13: Number_A1[0]=black; Number_A1[1]=1;Number_A2[0]=2;Number_A2[1]=3;break;
   case 14: Number_A1[1]=black; Number_A2[0]=1;Number_A2[1]=2;break;
   case 15: Number_A2[0]=black; Number_A2[1]=1;break;
   case 16: Number_A2[1]=black; break; 
  }
  if(tt>16) tt=1;
  if(CANCEL==0)  {delayms(100); if(CANCEL==0) {Time_temp=20;return 0;}}
  if(SURE==0)  {delayms(200); if(SURE==0) break;}	 //等待确认或取消
 }
  Beeper(1);
  ss=SAVEbegin;
  ns=Read24c02(NOWsave);
  Number_A1[1]=black;
  Number_B1[0]=Number_B2[0]=Number_B3[0]=Number_B4[0]=black;
  if(ns==SAVEbegin) return 0;
 while(1)
 {
  nn=Read24c02(ss);									 //读取并显示
  gg=Read24c02(ss+1);   
  mm=Read24c02(ss+2);
  Number_A1[0]=gg;
  DisplayNumber(nn,Number_A2);
  DisplayNumber(nn,Number_C);
  Number_B1[1]=Number_B2[1]=Number_B3[1]=Number_B4[1]=black;
   switch(gg)
   {
    case 1: Number_B1[1]=mm; break;
    case 2: Number_B2[1]=mm; break;
    case 3: Number_B3[1]=mm; break;
    case 4: Number_B4[1]=mm; break;
   }
 delayms(350);										 //延时进入下一题
  if(DOWN==0) {ss-=6;goto ADD;}  else if(UP==0)  goto ADD;
  if(SURE==0||CANCEL==0) return 1;
 delayms(350);
  if(DOWN==0) {ss-=6;goto ADD;}  else if(UP==0)  goto ADD;
  if(SURE==0||CANCEL==0) return 1;
 delayms(350);
  if(DOWN==0) {ss-=6;goto ADD;}  else if(UP==0)  goto ADD;
  if(SURE==0||CANCEL==0) return 1;
 delayms(350);
  if(DOWN==0) {ss-=6;goto ADD;}  else if(UP==0)  goto ADD;
  if(SURE==0||CANCEL==0) return 1;
 delayms(300);
  if(DOWN==0) {ss-=6;goto ADD;}  else if(UP==0)  goto ADD;
  if(SURE==0||CANCEL==0) return 1;
 delayms(300);
  if(DOWN==0) ss-=6;
   else if(SURE==0||CANCEL==0) return 1;
ADD:  
  ss+=3;
  if(ss>=ns) ss=ns-3;
   else if(ss<SAVEbegin) ss=SAVEbegin;
 }
}

//================================== 主函数 ==================================
//============================================================================
//============================================================================

void main()
{    
  unsigned char temp;
  ALLon(); P0=LED_table[0];							 //P0口输出0
  KEYchoose(1);
  while(1)											 //“0”流水灯等待确认
  {
   LED4=1; LED1=0; delayms(150);
   if(SURE==0) {Load_1(); Check_Mark(); break;}		 //进入上一轮
   	else if(CANCEL==0){Test(); Load_2(); break;}	 //开始新一轮
   LED1=1; LED2=0; delayms(150);
   LED2=1; LED3=0; delayms(150);
   if(SURE==0) {Load_1(); Check_Mark(); break;}
   	else if(CANCEL==0){Test(); Load_2(); break;}
   LED3=1; LED4=0; delayms(150); 
  }
													  
NEXT:  												 //抢答期间主循环
  DisplayNumber(No_,Number_A2);     				 //刷新各显示管
  DisplayNumber(Mark,Number_A1);
  DisplayNumber(No_,Number_C);
  DisplayNumber(Result[0],Number_B1); 
  DisplayNumber(Result[1],Number_B2); 
  DisplayNumber(Result[2],Number_B3); 
  DisplayNumber(Result[3],Number_B4); 
  tt=1;
 while(1)											 //显示题号、分数、时间
 {													 //等待确认
  if(tt%3)  {DisplayNumber(No_,Number_A2); DisplayNumber(Mark,Number_A1); temp=1;}
   else {A2=1;DisplayNumber(Time_s,Number_A2);DisplayNumber(Time_m,Number_A1);temp=0;}
  if(UP==0) {tt=1; SetMark(); delayms(250); tt=1; }	 //按UP键进行分数设定
   else if(DOWN==0) { tt=1; SetTime(); delayms(250);tt=1; }	 //按DOWN键进行分数设定
  if(temp) A2=~A2;	delayms(150);
  if(SURE==0) break;								 //按SURE进入抢答
  if(CANCEL==0){A2=1; All_CANCEL(); goto NEXT;}		 //按CANCEL撤销上一次操作
 }
 A2=1; 												 //抢答函数
 QiangDa();											 //倒计时
 Count_Down();
 KEYchoose(1); 
 DisplayNumber(No_,Number_A2);     
 Number_A1[0]=Group;
 Number_A1[1]=black;
 Number_C[0]=Number_C[1]=black;
 while(1)											 //闪烁A1、A2等待判断答题正误
 {
  if(SURE==0){A1=A2=1; Save_Mark(Mark); delayms(250); goto NEXT;}
   else if(CANCEL==0){A1=A2=1; Save_Mark(0); delayms(250); goto NEXT;}
  A1=A2=~A1;  delayms(250);
 }
}

⌨️ 快捷键说明

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