基于51单片机的八路抢答器设计

基于51单片机的八路抢答器

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.主持人按下开始,8位选手开始抢答;

2.抢答时间60秒,主持人可以暂停抢答;

3.倒计时最后5秒蜂鸣器会滴滴提醒;

4.选手抢答成功,数码管会显示其号码;

5.按下复位按键进入新一轮;

​演示视频:

基于51单片机的八路抢答器设计 

添加图片注释,不超过 140 字(可选)

程序

#include<reg51.h>
/***微信公众号:木子单片机********/
#include<intrins.h>
sbit smg1=P2^0;		//定义数码管第一位
sbit smg2=P2^1;		//定义数码管第二位
sbit smg3=P2^2;		//定义数码管第三位
sbit keyks=P3^0;	//定义开始按键
sbit keytz=P3^1;	//定义停止按键
sbit keyqc=P3^2;	//定义清除按键
sbit key1=P1^0;		//定义1号抢答选手
sbit key2=P1^1;		//定义2号抢答选手
sbit key3=P1^2;		//定义3号抢答选手
sbit key4=P1^3;		//定义4号抢答选手
sbit key5=P1^4;		//定义5号抢答选手
sbit key6=P1^5;		//定义6号抢答选手
sbit key7=P1^6;		//定义7号抢答选手
sbit key8=P1^7;		//定义8号抢答选手
sbit spk=P3^7;		//定义蜂鸣器
int djs=60,js=0;		   //djs和bt是初始倒计时时间,可修改
//int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};

void delayms(int x)	   //延时函数
{
char i;
while(x--)
 {
  for(i=500;i>0;i--); 
 }
}
 


void Timer0_init()			//定时器0初始化
{
      js=0;
	  TMOD=0x01;	  			//T0为定时器方式1
      TH0=0x4c;
	  TL0=0x00;			
      //TR0=1;//IT1=1;
	  ET0=1;//EX1=1;
	  EA=1;	
}

void timer0() interrupt 1 using 1	//定时器0中断服务函数
{
	    TF0=0;
	 	TH0=0x4c;
		TL0=0x00;					//赋初值
		js++;
		if(js==15) 
		  { js=0;
		    djs--;					//产生1s的倒计时
			//led1=~led1;
		   }
}

void djsxs()				   //显示倒计时函数
 {	int b1,b2;
 	b1=djs/10;
	b2=djs%10;				  // 将倒计时时间分成高低位
	P0=table[b1];
    smg2=0;
    delayms(3);
    smg2=1;					 //显示十位数字

	P0=table[b2];
	smg3=0;
	delayms(3);				 //显示个位数字
	smg3=1;
}
void djsxs22()			  	 
 {	
 	P0=0x40;
    smg1=0;
    delayms(3);
    smg1=1;					//第一位数码管显示-

	P0=0x40;
    smg2=0;
    delayms(3);			   //第三位数码管显示-
    smg2=1;

	P0=0x40;
	smg3=0;
	delayms(3);
	smg3=1;				  //第四位数码管显示-
}

void djsxs1()
 {
	P0=table[1];
    smg1=0;
    delayms(3);
    smg1=1;				   //第一位数码管显示1

}
void djsxs2()
 {
	P0=table[2];
    smg1=0;
    delayms(3);
    smg1=1;				//第一位数码管显示2

}
void djsxs3()
 {
	P0=table[3];
    smg1=0;
    delayms(3);
    smg1=1;			  //第一位数码管显示3

}
void djsxs4()
 {
	P0=table[4];
    smg1=0;
    delayms(3);
    smg1=1;			 //第一位数码管显示4

}
void djsxs5()
 {
	P0=table[5];
    smg1=0;
    delayms(3);
    smg1=1;		   //第一位数码管显示5

}
void djsxs6()
 {
	P0=table[6];
    smg1=0;
    delayms(3);
    smg1=1;			//第一位数码管显示6

}
void djsxs7()
 {
	P0=table[7];
    smg1=0;
    delayms(3);
    smg1=1;		  //第一位数码管显示7
}
void djsxs8()
 {
	P0=table[8];
    smg1=0;
    delayms(3);
    smg1=1;		 //第一位数码管显示8

}
void main()
{
int djs1=60;
Timer0_init();	 //初始化定时器中断
spk=1;			  //蜂鸣器不响
        djs=60;		//倒计时赋值
while(1)
{

LOOP1:   djs=djs1;
djsxs22();	                 //LOOP1是标号,显示 -  --

			if(key1==0)		 //在定时器运行状态下,key1==0 则说明1号选手按下按键
						{
			   				delayms(3);
			   				if(key1==0)
			   				{ 
			   				 while(!key1);	  //去除按键抖动后,重新在判断,是否确实按下
							 djs=60;
				/*			 while(1)
							  {
							    TR0=0;		  //定时器停止
								djsxs();	  
							   if(key2==0)	  //复位按下按下
						           {	
			   							delayms(3);		   //去除抖动
			   							if(key2==0)	   //再次判断是否按下复位按键
			   							{ 
			   				 			while(!key2); //如果按下复位键,则回到- --状态
										 djs++;
										 djs1=djs;
										}
									}
							   if(key3==0)	  //复位按下按下
						           {	
			   							delayms(3);		   //去除抖动
			   							if(key3==0)	   //再次判断是否按下复位按键
			   							{ 
			   				 			while(!key3); //如果按下复位键,则回到- --状态
										 djs--;
										 djs1=djs;
										}
									}
							   if(key1==0)	  //复位按下按下
						           {	
			   							delayms(3);		   //去除抖动
			   							if(key1==0)	   //再次判断是否按下复位按键
			   							{ 
			   				 			while(!key1); //如果按下复位键,则回到- --状态
										goto LOOP1;		  //goto语句,回到loop1表号处
										}
									}										   
							  }	 */
							}
						}
			if(keyks==0)
			{		   
			  //spk=0;
			   delayms(3);		 //去除按键抖动
			   if(keyks==0)
			   { 
			    while(!keyks);	  //以上表示按下开始按键 
				//spk=1;			   //蜂鸣器不响
				TR0=1;			   //启动定时器 开始倒计时
				while(1)
				  {
				    djsxs();
				if(keytz==0)
						{
			   				delayms(3);			 //此处表示出去抖动, 以后不一一标出
			   				if(keytz==0)
			   				{ 
			   				 while(!keytz);	   //以上表示按下停止按键后 

							    TR0=0;		   //定时器停止

							}
						}
				   if(keyks==0)
						{
						    //spk=0;
			   				delayms(3);
			   				if(keyks==0)
			   				{ 
			   				 while(!keyks);	   //以上表示按下清楚按键后 
							 //spk=1;			   //蜂鸣器不响
							    TR0=1;		   //定时器启动

							}
						}

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

IC座:DIP40;万能板:9*15;

数码管:MT03621AR;

排阻:1K*8;电容:22pF;

三极管:9012;按键:6*6*5;

晶振:11.0592;电阻:1K;

接线端子:5.08*2P;

蜂鸣器:有源 5V;

电容:10uF/16V;

自锁开关:8*8;

导线:若干;

添加图片注释,不超过 140 字(可选)

流程图

添加图片注释,不超过 140 字(可选)

设计资料

01仿真图

本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!

添加图片注释,不超过 140 字(可选)

02原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件keil5版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

八千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

05设计资料

全部资料包括程序(含注释)、仿真源文件 、AD原理图、PCB、设计报告、流程图、实物图、元件清单、实物演示视频等。具体内容如下,全网最全!!

添加图片注释,不超过 140 字(可选)

资料获取请观看前面演示视频!

点赞分享一起学习成长。

一、功能分析 1、设计一个智力竞赛抢答器,可同时供8名选手或8个代表队参加比赛,他们的编号分别为0、1、2、3、4、5、6、7,各用一个抢答按钮,按钮的编号与选手的编号相对应,分别为S0-S7。 2、给节目主持设置一个控制开关,用来控制系统的清零和抢答的开始。 3、如果想调节抢答时间或答题时间,按"抢答时间调节"键或"答题时间调节"键进入调节状态,此时会显示现在设定的抢答时间或回答时间值,如想加一秒按一下"+1s"键,如果想减一秒按一下"-1s"键,时间LED上会显示改变后的时间,调整范围为0s~99s, 0s时再减1s会跳到99,99s时再加1s会变到0s。 4、主持按"抢答开始"键,会有提示音,并立刻进入抢答倒计时(预设30s抢答时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预设60s抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。倒数时间到小于5s会每秒响一下提示音。 5、如倒计时期间,主持想停止倒计时可以随时按"停止"按键,系统会自动进入准备状态(清零),等待主持按"抢答开始"进入下次抢答计时。 6、如果主持未按"抢答开始"键,而有按了抢答按键,犯规抢答,LED上不断闪烁FF和犯规号数并响个不停,直到按下"停止" 键为止。 7、P3.0为开始抢答,P3.1为停止,p1.0-p1.7为八路抢答输入,数码管段选P0口,位选P2口低3位,扬声器输出为P3.6口。P3.2抢答时间调整,P3.3回答时间调整,P3.4为时间加1调整,P3.5为时间减1调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值