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

2023-05-16

目录

    • 基于51单片机的八路抢答器设计
      • 1、主要功能
      • 2、仿真图
      • 3、测试图
      • 4、程序源码
      • 5、资源获取

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

1、主要功能

利用STC89C52单片机及外围接口实现的抢答系统;在抢答过程中,只有启动抢答后才有效,如果在开始抢答前抢答为无效;抢答限定时间为60秒,倒计时为5秒时蜂鸣器报警,选手抢答成功后显示选手编号以及剩余时间。

2、仿真图

在这里插入图片描述

3、测试图

当选手6抢答后,数码管会显示6号选手抢答成功。
在这里插入图片描述

4、程序源码

在这里插入图片描述

/**
  ************************************* Copyright ****************************** 
  File name: // 8路抢答器
  Author:Kevin
  Version: //1.0
  Description: // 用于详细说明此程序文件完成的主要功能
  Others: // 其它内容的说明
  Log: // 公众号:Kevin的学习站
  ******************************************************************************
 */

#include<reg51.h>
#include<intrins.h>
sbit smg1=P2^4;		//定义数码管第一位
sbit smg2=P2^6;		//定义数码管第二位
sbit smg3=P2^7;		//定义数码管第三位
sbit smg4=P2^5;

sbit keyks=P2^2;	//定义开始按键
sbit keytz=P2^1;	//定义停止按键
sbit keyqc=P2^0;	//定义清除按键

sbit key1=P1^4;		//定义1号抢答选手
sbit key2=P1^5;		//定义2号抢答选手
sbit key3=P1^6;		//定义3号抢答选手
sbit key4=P1^7;		//定义4号抢答选手
sbit key5=P3^4;		//定义5号抢答选手
sbit key6=P3^5;		//定义6号抢答选手
sbit key7=P3^6;		//定义7号抢答选手
sbit key8=P3^7;		//定义8号抢答选手
sbit spk=P1^0;		//定义蜂鸣器

int djs=60,js=0;		   //djs和bt是初始倒计时时间,可修改
unsigned char flag=0;
//int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80};

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=60;
	  TL0=176;			
      //TR0=1;//IT1=1;
	  ET0=1;//EX1=1;
	  EA=1;	
}

void timer0() interrupt 1 using 1	//定时器0中断服务函数
{
	    TF0=0;
	 	TH0=60;
		TL0=176;					//赋初值
		js++;
		if(flag==1)
		  {
		   if(js<8)
		      spk=0;
			else spk=1;
		  }
		if(js==20) 
		  { js=0;
		    djs--;					//产生1s的倒计时
		   }
}

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 djsxs30() //第二位数码管显示-
{
	  P0=0x80;			//第二位数码管
	  smg4=0;
	  delayms(3);
	  smg4=1;
}
void djsxs22()				 
{	
 	P0=0x80;
    smg1=0;
    delayms(3);
    smg1=1;
						//第一位数码管显示-
    P0=0x80;			//第二位数码管
	smg4=0;
	delayms(3);
	smg4=1;
		
	P0=0x80;
    smg2=0;
    delayms(3);			   //第三位数码管显示-
    smg2=1;

	P0=0x80;
	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(8);		   //去除抖动
			   							if(key2==0)	   //再次判断是否按下复位按键
			   							{
										 do
										 { 
			   				 			 while(!key2); //如果按下复位键,则回到- --状态
										 delayms(5);
										 }
										 while(key2!=1);
										 djs++;
										 djs1=djs;
										}
									}
							   if(key3==0)	  //复位按下按下
						           {	
			   							delayms(8);		   //去除抖动
			   							if(key3==0)	   //再次判断是否按下复位按键
			   							{ 
										do
										 {
			   				 			  while(!key3); //如果按下复位键,则回到- --状态
										   delayms(5);	
										 }
										while(key3!=1);
										 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;		   //定时器停止
								 flag=0;//
								 spk=1;
								}

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

							}
						}
/***************************以下是八个选手抢答,key1表示1号选手,依次类推,注释只写第一位选手,其他和第一个完全一致,************************************/
				if((key1==0)&&(TR0==1))		 //在定时器运行状态下,key1==0 则说明1号选手按下按键
						{		 spk=0;		 //蜂鸣器响
			   				delayms(3);
			   				if(key1==0)
			   				{ 
			   				 while(!key1);	  //去除按键抖动后,重新在判断,是否确实按下
							  {
							    spk=1;		  //蜂鸣器不响
								flag=0;//清0最后五秒响蜂鸣器
							  }
							 while(1)
							  {
							    TR0=0;		  //定时器停止
							 	djsxs1();	  //显示选手编号
								djsxs30();	  //第二位数码管显示-
								djsxs();	  //显示剩余倒计时时间
							   if(keyqc==0)
						           {	
			   							delayms(3);		   //去除抖动
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc); //如果按下清楚键,则回到- --状态

										goto LOOP1;		  //goto语句,回到loop1表号处
										}
										}										   
							  }
							}
						}
				if((key2==0)&&(TR0==1))
						{	spk=0;
			   				delayms(3);
			   				if(key2==0)
			   				{ 
			   				 while(!key2);
							  {
							   spk=1;
							   flag=0;//清0最后五秒响蜂鸣器
							  }
							 while(1)
							  {
							    TR0=0;
							 	djsxs2();
								djsxs30();	  //第二位数码管显示-
								djsxs();
							    if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);

										goto LOOP1;	
										}
										}										   
							  }
							}
						}
					if((key3==0)&&(TR0==1))
						{	spk=0;
			   				delayms(3);
			   				if(key3==0)
			   				{ 
			   				 while(!key3);
								  {
								   spk=1;
								   flag=0;//清0最后五秒响蜂鸣器
								  }
							 while(1)
							  {
							    TR0=0;
							 	djsxs3();
								djsxs30();	  //第二位数码管显示-
								djsxs();
							   if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);

										goto LOOP1;	
										}
										}										   
							  }
							}
						}
				if((key4==0)&&(TR0==1))
						{	spk=0;
			   				delayms(3);
			   				if(key4==0)
			   				{ 
			   				 while(!key4);
							  {
							   spk=1;
							   flag=0;//清0最后五秒响蜂鸣器
							  }
							 while(1)
							  {
							    TR0=0;
							 	djsxs4();
								djsxs30();	  //第二位数码管显示-
								djsxs();
							   if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);

										goto LOOP1;	
										}
										}										   
							  }
							}
						}
					if((key5==0)&&(TR0==1))
						{	spk=0;
			   				delayms(3);
			   				if(key5==0)
			   				{ 
			   				 while(!key5);
							  {
							   spk=1;
							   flag=0;//清0最后五秒响蜂鸣器
							  }
							 while(1)
							  {
							    TR0=0;
							 	djsxs5();
								djsxs30();	  //第二位数码管显示-
								djsxs();
							   if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);

										goto LOOP1;	
										}
										}										   
							  }
							}
						}
					if((key6==0)&&(TR0==1))
						{  spk=0;
			   				delayms(3);
			   				if(key6==0)
			   				{ 
			   				 while(!key6);
							  {
							   spk=1;
							   flag=0;//清0最后五秒响蜂鸣器
							  }
							 while(1)
							  {
							    TR0=0;
							 	djsxs6();
								djsxs30();	  //第二位数码管显示-
								djsxs();
							   if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);

										goto LOOP1;	
										}
										}										   
							  }
							}
						}
					if((key7==0)&&(TR0==1))
						{	spk=0;
			   				delayms(3);
			   				if(key7==0)
			   				{ 
			   				 while(!key7);
							  {
							   spk=1;
							   flag=0;//清0最后五秒响蜂鸣器
							  }
							 while(1)
							  {
							    TR0=0;
							 	djsxs7();
								djsxs30();	  //第二位数码管显示-
								djsxs();
								if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);

										goto LOOP1;	
										}
										}	   
							  }
							}
						}
					if((key8==0)&&(TR0==1))
						{	spk=0;
			   				delayms(3);
			   				if(key8==0)
			   				{ 
			   				 while(!key8);
								 {
							       spk=1;
							       flag=0;//清0最后五秒响蜂鸣器
							     }
							 while(1)
							  {
							    TR0=0;
							 	djsxs8();
								djsxs30();	  //第二位数码管显示-
								djsxs();
							   if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);

										goto LOOP1;	
										}
										}	   
							  			}
						     	}
						}  
					 if(djs<=5)  flag=1; //spk=0;	  //到倒计时小于5是,蜂鸣器响
					 if(djs==0)			   //当倒计时时间等于0后,需要按清楚键恢复
					  {
					  flag=0;
					  spk=1;
					  while(1)
					  	{
						 		if(keyqc==0)
						           {	
			   							delayms(3);
			   							if(keyqc==0)
			   							{ 
			   				 			while(!keyqc);
										spk=1;		  
										goto LOOP1;	
										}
										}
						}
					  } 

				  }

				}
			   }
 }
}

5、资源获取

在这里插入图片描述

项目的仿真和程序工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“051”,就可以获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于51单片机的八路竞赛抢答器设计 的相关文章

  • QT界面窗口的显示和隐藏,关闭

    这里写目录标题 QT窗口的显示和隐藏 xff1a 1 隐藏窗口1 1 介绍 xff1a 2 显示窗口2 1 介绍 xff1a 3 关闭窗口常用函数有 xff1a QT窗口的显示和隐藏 xff1a 1 隐藏窗口 span class toke
  • QT的中文显示乱码问题解决

    QT的中文显示乱码问题解决 QT的中文显示乱码问题解决 xff1a 1 查看源文件的编码格式 xff0c 有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示 2 在代码里面解决 xff1a 3 用法 xff1a QT的中文显示
  • 0.9 - GPIO寄存器的C语言映射与STM32库函数雏形构建思路

    首先 xff0c 从参考手册可知 xff0c 程序存储器 xff08 flash xff09 数据存储器 SRAM 寄存器 外设控制 和输入输出端口被组织在同一个4GB的线性地址空间内 数据字节以小端格式存放在存储器中 一个字里的最低地址字
  • Linux文件/文件夹建立软硬链接

    建立软连接 xff1a sudo ln s home spike Downloads redis src redis server usr local bin redis server 源文件 链接到 目标文件 xff0c 这两个文件目录都
  • Linux中记录终端(Terminal)输出到文本文件四种方法

    Linux中记录终端 xff08 Terminal xff09 输出到文本文件 Linux中记录终端 xff08 Terminal xff09 输出到文本文件 一 xff0c 如何把命令运行的结果保存到文件当中 二 command gt f
  • C++ 标准库头文件汇集:

    C 43 43 标准库头文件汇集 xff1a C 43 43 标准库的接口由下列头文件的汇集定义 C 43 43 标准库头文件汇集 xff1a 概念库协程库工具库动态内存管理数值极限错误处理字符串库容器库迭代器库范围库算法库数值库本地化库输
  • C++开源库列表总结记录

    开源 C 43 43 库列表 前言包管理器库音频 音频指纹格式标签CD 性能测试 通信 并发 配置 XMLJSONYAMLTOMLHOCONCSS容器 密码学 数据库 嵌入语言绑定 嵌入式 实时 文件元数据 金融计算 游戏引擎架构 通用多媒
  • C++转义序列和操作符优先级

    C 43 43 转义序列和操作符优先级 1 转义序列 xff1a 2 C 43 43 运算符优先级注解 1 转义序列 xff1a 转义序列 描述 表示 简单转义序列 39 单引号 ASCII 编码中为字节 0x27 34 双引号 ASCII
  • PX4:Policy “CMP0097“ is not known to this version of CMake.

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma
  • 安装Anaconda3后再安装ROS(用于PX4)

    记录一下安装anaconda后再安装ROS xff0c 方便未来找错误 出现no module wstool 仔细观察报错信息发现调用的库都在anaconda3 lib python3 7里面了 随后按照https www cnblogs
  • Offboard仿真时出现CMD: Unexpected command 176, result 0

    在用PX4 43 gazebo 43 ROS仿真offboard例程时 xff0c 如果出现以下问题 xff1a 运行以下命令 xff1a roslaunch mavros px4 launch fcu url span class tok
  • Offboard例程的python版本

    因为python的库很丰富 xff0c 有现成的解方程库 xff0c 比如sympy 自己写了一份python版本的自动起飞2m的程序 假设自定义的包名为offb xff0c 在offb下新建scripts文件夹 xff0c 将py文件放在
  • 子类与父类构造函数调用顺序

    子类与父类构造函数调用顺序 构造函数 当创建子类对象时 构造函数的调用顺序 xff1a 静态数据成员的构造函数 gt 父类的构造函数 gt 非静态的数据成员的构造函数 gt 自己的构造函数 注意 无论创建几个对象 该类的静态成员只构建一次
  • 0.1- 机械加工工艺-----切削加工基础

    1 钳工 xff1a 通过工人手持工具进行切削加工 机械加工 xff1a 采用不同的机床 xff08 如车床 铣 床 刨床 磨床 钻床等 xff09 对工 件进行切削加工 2 零件几何参数 xff1a 1 宏观几何参数 xff1a 包括 x
  • 判断当前机器的字节序是大端还是小端?

    字节序 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序 大端字节序 xff08 Big endian xff09 大端存储模式是指数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 小端字
  • Qt简易计算器实现复数运算绘图等等

    太久没更新博客了前段时间弄了个计算器 实现了加减乘除复数 带记忆 绘图计算二维图形等功能 先简单讲解下我代码的分块 用图片描述虽然画的丑 实现效果图片 代码放心使用转载请通知 1 Ui 2 在Maindow 类实现计算 maindow h
  • 【tensorboard】可视化events.out.tfevents文件

    介绍 笔者训练Mask RCNN模型时 xff0c 在生成权重 xff08 h5 xff09 文件的同时会实时更新events out tfevents szfj文件 xff0c 通过tensorboard可视化events out tfe
  • 【tensorflow】缺少libcudart.so.11.0和libcudnn.so.8解决方法

    问题 xff1a 安装tensorflow gpu xff0c 在测试是否调用GPU时出现如下问题 xff1a Could not load dynamic library libcudart so 11 0 dlerror libcuda
  • 【Lane】 Ultra-Fast-Lane-Detection 复现

    引言 笔者Ultra Fast Lane Detection专栏链接 x1f517 导航 xff1a Lane Ultra Fast Lane Detection 复现 Lane Ultra Fast Lane Detection xff0
  • 【Lane】Ultra-Fast-Lane-Detection(1)自定义数据集训练

    引言 笔者Ultra Fast Lane Detection专栏链接 x1f517 导航 xff1a Lane Ultra Fast Lane Detection 复现 Lane Ultra Fast Lane Detection xff0

随机推荐