基于51单片机的多功能八路抢答器[通俗易懂]

基于51单片机的多功能八路抢答器[通俗易懂]1.功能介绍多功能八路抢答器是基于51单片机来设计的,除了可以实现最基本功能——8路抢答外,还具有自动处理犯规选手,抢答时间调整,还可以进行答题,计分,并且可以查询或修改分数。2.硬件设计该抢答器的硬件由五个部分组成,包括单片机、按键电路、数码管显示电路、指示灯电路和声音提示电路。硬件框图如下(2)硬件原理图由于每个部分的硬件电路都比较简单,就不做介绍了,大家直接看图。3.软件设…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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原理图 下载:关注公众号,首页回复“抢答器”获取资料
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179790.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Matlab画图线型、符号及颜色设置

    Matlab画图线型、符号及颜色设置在matlab中线条的属性主要有:Color:颜色LineStyle:线型LineWidth:线宽Marker:标记点的形状MarkerFaceColor:标记点填充颜色MarkerEdgeColor:标记点边缘颜色MarkerSize:标记点大小举例x=[-2*pi:0.01:2*pi];y1=sin(x);y2=cos(x);figure;%打开一个画板%画两条线,返回的是这两条线的句柄,h是一个包含两个句柄的数组h=plo

  • python 去除字符串中指定字符[通俗易懂]

    python 去除字符串中指定字符[通俗易懂]python中的strip()可以去除头尾指定字符ss=’我的电话是18827038663,也是微信号,\n请加入,谢谢\n\n\n’print(ss.strip(‘\n’))结果:我的电话是18827038663,也是微信号,请加入,谢谢可以看到只能删除头尾指定字符。想要去除中间字符,可以使用replace()函数ss=’我的电话是188270386…

  • Maven的安装与配置

    Maven的安装与配置Maven超详细的安装与配置步骤

  • kafka时间轮源码_flume kafka

    kafka时间轮源码_flume kafkaKafka中存在大量的延迟操作,比如延迟生产、延迟拉取以及延迟删除等。Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能,而是基于时间轮自定义了一个用于实现延迟功能的定时器(SystemTimer)。JDK的Timer和DelayQueue插入和删除操作的平均时间复杂度为O(nlog(n)),并不能满足Kafka的高性能要求,而基于时间轮可以将插入和删除操作的时间复…

  • Win10安装Ubuntu18.04双系统,图文详解,全网最详细教程

    Win10安装Ubuntu18.04双系统,图文详解,全网最详细教程博主经历过多次双系统的安装与卸载,所以这次安装就记录下全过程,能让后面的同学少走弯路。安装目录一、查看电脑信息1、BIOS模式2、硬盘数二、制作系统盘1、下载镜像源2、制作U盘启动盘三、分配硬盘空间四、安装Ubuntu18.041、进入U盘引导项2、安装设置一、查看电脑信息1、BIOS模式Win+R,输入msinfo32回车,出现系统界面,可查看BIOS模式:本教程只适合BIOS模式为UEFI的电脑,如果BIOS模式为传统的,请查看其他对应教程。2、硬盘数此电脑——>磁盘管理,可以.

  • 从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十三 || DTOs 对象映射使用,项目部署Windows+Linux完整版[通俗易懂]

    从壹开始前后端分离【 .NET Core2.0/3.0 +Vue2.0 】框架之十三 || DTOs 对象映射使用,项目部署Windows+Linux完整版[通俗易懂]本文3.0版本文章本文内容,和netcore2.0一样,不需要更新。更新很多小伙伴在用IIS发布的时候,总是会有一些问题,文章下边 #autoid-6-0-0 我也简单的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号