前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于51单片机的多功能八路抢答器[通俗易懂]

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

作者头像
全栈程序员站长
发布2022-11-01 15:36:46
8320
发布2022-11-01 15:36:46
举报
文章被收录于专栏:全栈程序员必看

1.功能介绍 多功能八路抢答器是基于51单片机来设计的,除了可以实现最基本功能——8路抢答外,还具有自动处理犯规选手,抢答时间调整,还可以进行答题,计分,并且可以查询或修改分数。

2.硬件设计 该抢答器的硬件由五个部分组成,包括单片机、按键电路、数码管显示电路、指示灯电路和声音提示电路。硬件框图如下

在这里插入图片描述
在这里插入图片描述

(2)硬件原理图 由于每个部分的硬件电路都比较简单,就不做介绍了,大家直接看图。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.软件设计 (1)软件流程图

在这里插入图片描述
在这里插入图片描述

(2)程序源码 由于本例程代码比较多,所以只贴出主程序代码

代码语言:javascript
复制
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原理图 下载:关注公众号,首页回复“抢答器”获取资料

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档