基于51单片机的五路抢答器Protues仿真设计

news2024/11/14 22:34:14

目录

一、设计背景

二、实现功能

三、仿真演示

四、源程序(部分)


一、设计背景

        近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于51单片机的五路抢答器设计。本设计中,51单片机充当了核心控制器的角色,通过IO口与各个功能模块相连接。按键模块负责检测参与者的抢答动作,当有人按下抢答按钮时,会通过IO口电平的变化通知单片机,单片机会记录按键的次序,并通过数码管显示当前的抢答结果。

        为了保证抢答过程的准确性和公平性,设计中还需要考虑到以下因素。首先,按键模块需要具备快速响应和高可靠性,以确保抢答者的动作能够被准确地捕捉到。其次,显示屏模块需要能够实时更新抢答结果,并显示相应的信息,比如参与者的编号和抢答时间。最后,在电路连接方面,需要注意各个模块之间的线路布局,以避免信号干扰和电气问题。

       软件系统采用C语言编写程序,包括显示程序,定时中断服务,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS8.11强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

二、实现功能

        以51单片机为控制核心,设计一种五路抢答器。整个系统包括MCU、晶振电路、时钟电路、蜂鸣器控制电路、指示灯控制电路、独立按键电路、矩阵键盘以及数码管显示电路等。可具体实现以下功能:

     (1)设定矩阵键盘的5个键作为5位选手的抢答按键,键的编号即选手编号,为1~5号,同时设定5个LED灯作为5位选手抢答状态指示;设定1个独立按键作为抢答开始键;选择两位数码管作为倒计时、选手编号及犯规显示;选择蜂鸣器作为开始、抢答、犯规和计时结束的提示。
     (2)只有当裁判按下开始键时才可以进入正常抢答,否则属于犯规抢答。抢答完毕,或计时时间到,停止抢答,数码管显示0。当裁判按下抢答开始键时,开始抢答,计时器开始倒计时,10秒倒计期间,若有抢答,则停止计时,相应选手的LED灯亮,数码管显示选手号;若倒计时结束时无人抢答,则停止抢答。
     (3)正确抢答时,抢答选手的LED灯缓慢闪烁,数码管显示抢答选手的编号;犯规抢答时,犯规选手的LED灯快速闪烁,低位数码管显示犯规选手的编号,高位数码管显示F(foul,犯规)。
       (4)开始抢答按键按下时、倒计时结束时和抢答键按下时蜂鸣器响1声,犯规时响2声。

三、仿真演示

未运行仿真时,数码管不显示。

运行仿真后,进入准备界面,数码管显示00。

按下启动按键,蜂鸣器响一声,进入抢答界面,开始10秒抢答倒计时。

在抢答倒计时范围内,按下序号为1~5的选手抢答按键,蜂鸣器响1声,数码管上显示抢答选手序号,并且相应序号的指示灯缓慢闪烁4次。

当裁判未按下开始键时,若有选手抢答视为犯规抢答,蜂鸣器响2声指示犯规抢答犯规选手的LED灯快速闪烁20次,低位数码管显示犯规选手的编号,高位数码管显示F。

无论是正常抢答还是犯规抢答,指示灯停止闪烁后,数码管显示00,表示一次抢答结束。

按下复位按钮恢复到准备界面,以便进行下一次抢答。

四、源程序(部分)

#include "reg52.h"
#include "delay.h"
#include "smg.h"
#include "timer.h"

sbit key1Led = P3^1;	//四位选手
sbit key2Led = P3^2;
sbit key3Led = P3^3;
sbit key4Led = P3^4;
sbit key5Led = P3^5;
sbit start_stop = P3^6;	//抢答按钮
sbit Beep = P3^7;	//抢答按钮
_bool action = 0;
_bool key1_flag = 0;
_bool key2_flag = 0;
_bool key3_flag = 0;
_bool key4_flag = 0;
_bool key5_flag = 0;

_bool Rush_flag = 0;

_bool reset_flag = 0; //复位标志位
_bool start_stop_flag = 0; //抢答标志位
_bool BeepF=0;	

uint8 second = 0;	//时间
uint8 timer0_count = 0;	//定时器1计数值
uint8 LedFre0Count = 0;
uint8 LedFre1Count = 0;
uint8 number = 0; //队号
uint8 number_display = 0;	//队号显示
uint8 a = 0xff;	//按键值
uint8 key_scan8(void);
uint8 Fval = 0;
void start_stop_keyscan(void);
void keycheckdown(void);				/* 反转法键盘扫描 */
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
void LedDisplay(uint8 _number)
{
	switch(_number)
	{
		case 1:
			key1Led=~key1Led;
		break;
		case 2:
			key2Led=~key2Led;
		break;
		case 3:
			key3Led=~key3Led;
		break;
		case 4:
			key4Led=~key4Led;
		break;
		case 5:
			key5Led=~key5Led;
		break;
	}
}
void SMG_delay(uint8 t)
{
	while(t--)
	{
	  display(second);
	}
}

void SMG_Bdelay(uint8 t)
{
	while(t--)
	{
      P2 = 0xfe;
			P0 = table[number_display];
			Delay_ms(2);
			
			P2 = 0xfd;
			P0 = table[15];
			Delay_ms(2);		
	}
}

void keycheckdown()				/* 反转法键盘扫描 */
{
	short temp1,temp2,temp;
	P1=0xf0;						/* 输入行值(或列值) */
  SMG_delay(20);
	temp1=P1;						/* 读列值(或行值) */
	P1=0xff;
  SMG_delay(20);
	P1=0x0f;						/* 输入列值(或行值) */
  SMG_delay(20);
	temp2=P1;						/* 读行值(或列值) */
	P1=0xff;
	temp=(temp1&0xf0)|(temp2&0xf);	/* 将两次读入数据组合 */
	switch(temp)					/* 通过读入数据组合判断按键位置 */
	{
		case 0x77 :a=0x0a;break;//  按键+   
		case 0x7b :a=0x0e; break;// 按键=	
		case 0x7d :a=0;	   break;// 按键0
		case 0x7e :a=0x0f; break;// 按键CE

		case 0xe7 :a=0x0d;break;// 	按键/
		case 0xeb :a=0x9;break; //  按键9
		case 0xed :a=0x8;break; //  按键8 
		case 0xee :a=0x7;break; // 	按键7

		case 0xd7 :a=0x0c;break;//  按键*
		case 0xdb :a=0x6;break; // 	按键6
		case 0xdd :a=0x5;Beep=0;SMG_delay(500);Beep=1;break; // 	按键5
		case 0xde :a=0x4;Beep=0;SMG_delay(500);Beep=1;break; // 	按键4

		case 0xb7 :a=0x0b; break;// 按键-
		case 0xbb :a=3;Beep=0;SMG_delay(500);Beep=1;break;	//  按键3
		case 0xbd :a=2;Beep=0;SMG_delay(500);Beep=1;break;	//  按键2
		case 0xbe :a=1;Beep=0;SMG_delay(500);Beep=1;break;	//  按键1

		default :a=0xff;
	}
}

void main()
{
	ConfigTimer0();//定时器初始化
	while(1)
	{
		start_stop_keyscan();//开始按键
		keycheckdown();//键盘扫描	
		Fval=key_scan8();
		if(action)//有队抢答
		{
		   second=10;
		}
		else
		{
			if(a!=0xff)
			{
			   Rush_flag=1;//违规抢答
				 second=8;
				 TR0=1;
			}		
		}
    while(Rush_flag==1)
		{
			if(BeepF==0)
			{
				Beep=0;
				SMG_Bdelay(200);
				Beep=1;	
				SMG_Bdelay(200);
				Beep=0;
				SMG_Bdelay(200);
				Beep=1;	
        BeepF=1;				
			}
			P2 = 0xfe;
			P0 = table[number_display];
			Delay_ms(2);
			
			P2 = 0xfd;
			P0 = table[15];
			Delay_ms(2);		
			if(second==0)
			{
				Rush_flag=0;
				TR0=0;
				key1Led = 1;	
				key2Led = 1;
				key3Led = 1;
				key4Led = 1;
				key5Led = 1;	
        BeepF=0;					
				break;
			}
		}
		while(action==1)//按下开始键为1,抢答结束为0
		{
			while(!key_scan8())	//无队抢答
			{
				display(second);
				TR0 = 1;
				if(second == 0)
				{
					Beep=0;
			    SMG_delay(200);
			    Beep=1;
					break;
				}
				keycheckdown();//键盘扫描	
			}
			if(number_display)//有队抢答
			{
				second=8;
			}
			while(number_display)
			{
				display(number_display);
				if(second == 0)
				{
					key1Led = 1;	
					key2Led = 1;
					key3Led = 1;
					key4Led = 1;
					key5Led = 1;					
					break;			
				}
			}
			TR0 = 0;//时间到
			second=0;
			display(second);
			action = 0;//抢答结束
			break;
		}
		display(second);	
	}
}

/*-----------------------------------------------------------
中断服务函数
------------------------------------------------------------*/
void timer0() interrupt 1
{
	TH0 = (65536-50000)/256; //50ms
	TL0 = (65536-50000)%256;	
	timer0_count ++;
	if(timer0_count == 20)//1s
	{
		timer0_count = 0;
		second--;	//10s倒计时
		if(second == 0)//计时结束
		{
			TR0 = 0;
			number_display = 0;
			action = 0;
			second = 0;
		}
	}	
	if(number_display!=0)
	{
		if(Rush_flag==0)
		{  
			 LedFre0Count++;
			 if(LedFre0Count==20)
			 {
				 LedFre0Count=0;
			   LedDisplay(number_display);
			 }
		}
		else
		{
			 LedFre1Count++;
			 if(LedFre1Count==5)
			 {
				 LedFre1Count=0;
			   LedDisplay(number_display);
			 }	
		}
	}
}

/*-----------------------------------------------------------
开始键扫描函数
------------------------------------------------------------*/
void start_stop_keyscan(void)
{
	if(start_stop == 0)
	{
		SMG_delay(800);
		if((start_stop == 0)&&(!start_stop_flag))
		{
			start_stop_flag = 1;
			action = 1;
			TR0 = 1;
			Beep=0;
			SMG_delay(200);
			Beep=1;
			reset_flag = 0;
		}
	}
	else
	{
		start_stop_flag = 0;	
	}
}

/*-----------------------------------------------------------
四位抢答键扫描函数
------------------------------------------------------------*/
uint8 key_scan8(void)
{
	if((a == 1)&&(!key1_flag))
	{
		key1_flag = 1;
		number  = 1;
		number_display = number;
	}
	else
	{
		key1_flag = 0;
		number  = 0;	
	}
	
	if((a == 2)&&(!key2_flag))
	{
		key2_flag = 1;
		number  = 2;
		number_display = number;
	}
	else
	{
		key2_flag = 0;
		number  = 0;	
	}
	
	if((a == 3)&&(!key3_flag))
	{
		key3_flag = 1;
		number  = 3;
		number_display = number;
	}
	else
	{
		key3_flag = 0;
		number  = 0;	
	}
	
	if((a == 4)&&(!key4_flag))
	{
		key4_flag = 1;
		number  = 4;
		number_display = number;
	}
	else
	{
		key4_flag = 0;
		number  = 0;	
	}
	if((a == 5)&&(!key5_flag))
	{
		key5_flag = 1;
		number  = 5;
		number_display = number;
	}
	else
	{
		key5_flag = 0;
		number  = 0;	
	}			
	
	if(number_display != 0)	
	{
		return 1;
	}
	else
	{
		return 0;
	}	
}

仿真源文件及源程序百度网盘链接:https://pan.baidu.com/s/12J02HAeeTJgKW468viFx1g 
提取码:kc9n 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1914830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么做好菲律宾TikTok直播带货?

TikTok目前是全球最受欢迎的APP之一,菲律宾TikTok直播已成为品牌出海的新趋势。作为一种新兴的引流渠道,出海电商卖家正通过直播带货模式实现流量变现。 在进行菲律宾TikTok直播时,关键在于能否吸引和留住消费者并促成购买。因此,…

Python基础语法:变量和数据类型详解(整数、浮点数、字符串、布尔值)①

文章目录 变量和数据类型详解(整数、浮点数、字符串、布尔值)一、变量二、数据类型1. 整数(int)2. 浮点数(float)3. 字符串(str)4. 布尔值(bool) 三、类型转换…

高考后暑假新选择:从AI聊天机器人开发入门IT领域

你好,我是三桥君 七月来临,各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束,而是新旅程的开始。对于有志于踏入IT领域的高考少年们,这个假期是开启探索IT世界的绝佳时机。 不知道这些有志于踏入IT领域的高考少年们&…

车载聚合路由器应用场景分析

乾元通QYT-X1z车载式1U多卡聚合路由器,支持最多8路聚合,无论是应急救援,还是车载交通,任何宽带服务商无法覆盖的区域,聚合路由器可提供现场需要的稳定、流畅、安全的视频传输网络,聚合路由器可无缝接入应急…

二四、3d人脸构建

一、下载github项目3dmm_cnn-master https://github.com/anhttran/3dmm_cnn.git 一个使用深度神经网络从单个图像进行 3D 人脸建模的项目,端到端代码,可直接根据图像强度进行 3D 形状和纹理估计;使用回归的 3D 面部模型,从检测到的面部特征点估计头部姿势和表情。…

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身?

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身? Linux中查看目录下的文件夹的命令是使用ls命令。ls命令用于列出指定目录中的文件和文件夹。通过不同的选项可以实现显示详细信息、按照不同的排序方式以及使用不同的…

网络安全防御【防火墙安全策略用户认证综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤 1、打开ensp防火墙的web服务(带内管理的工作模式) 2、在FW1的web网页中网络相关配置 3、交换机LSW6(总公司)的相关配置: 4、路由器相关接口配置&a…

Java中的锁都有什么

文章目录 锁公平锁与非公平锁可重入锁与不可重入锁共享锁与独占锁悲观锁与乐观锁自旋锁与适应性自旋锁偏向锁轻量级锁与重量级锁可中断锁互斥锁死锁使用资源有序分配法避免死锁使用银行家算法避免死锁使用tryLock进行超时锁定 锁 在Java中根据锁的特性来划分可以分为很多&…

(自用)共享单车服务器(二) 项目日志

stdin、stdout、stderr 注意&#xff1a;stderr是不缓存的&#xff0c;stdout则进行行间缓存。接下来我们看下行间缓存的效果&#xff0c;请参考以下代码&#xff1a; #include "stdio.h" #include <unistd.h>int main(int argc, char** argv) {for (int i 0…

Hum Brain Mapp:青春期早期的灰质流失可以用白质生长来解释吗?

摘要 关于大脑发育的一个基本谜题是&#xff0c;为什么儿童进入青春期时&#xff0c;灰质(GM)体积明显减少&#xff0c;而白质(WM)体积明显增加。一种流行的理论认为&#xff0c;由于被修剪的突触太小而不足以影响脑灰质体积&#xff0c;因此大脑总体积保持稳定&#xff0c;而…

从0-1搭建一个web项目(页面布局详解)详解

本章分析页面布局详解详解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 开源的后台管理框架。在一定程度上节省您的开发效率。另外本项目还封装了一些常用组件、hooks、指令、动态路由、按钮级别权限控制等功能。感兴趣的小伙伴可以访问源码点个赞 地…

10个图源二维码分享及使用方法

我们曾在《8个图源二维码分享及使用方法》一文中&#xff0c;为你分享了8个图源二维码。 现在在此基础之上新增两个图源二维码&#xff0c;共享10个。 如果你需要这些图源&#xff0c;请在文末查看领取方式。 新增了哪两个图源 增加的两个图源分别是全球10m等高线地图和全球…

【HTML入门】第八课 - 链接的学习(二)

我们上一节学习了&#xff0c;链接的基本知识&#xff0c;有锚点&#xff0c;还有鼠标上移的title属性的作用&#xff0c;这一节&#xff0c;我们继续说链接的知识点。 目录 1 跳转本项目的网页 1.1 修改html文件名 1.2 新建index1.html文件 1.3 修改index1.html文件 1.4…

随身WiFi市场乱象横生,随身WiFi测评最好的格行随身WiFi如何引领变革?

在当今随身WiFi市场乱象频发、内卷严重的背景下&#xff0c;消费者对于产品的性能与商家是否会后台割韭菜依旧存疑&#xff0c;尤其是“随身WiFi到底卡不卡&#xff1f;”的问题&#xff0c;成为了广大消费者关注的重点。然而&#xff0c;在众多品牌中&#xff0c;格行随身WiFi…

浅谈开源项目对于我编程之路的影响

开源项目有哪些机遇与挑战&#xff1f; 随着全球经济和科技环境的快速变化&#xff0c;开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目&#xff0c;以推动技术创新和实现协作共赢。你如何看待当前开源项目的发展趋势&#xff1f;…

昇思25天学习打卡营第22天 | Shufflenet图像分类

ShuffleNet图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有…

分布式架构演进之路

文章目录 1 相关概念1.1 基本概念1.2 评价指标 2 架构演进2.1 单机架构2.2 应用数据分离架构2.3 应用服务集群架构2.4 读写分离/主从分离架构2.5 冷热分离架构&#xff08;缓存&#xff09;2.5 分库分表2.6 微服务架构 3 本章总结 1 相关概念 在正式引入架构演进之前&#xff…

不入耳耳机哪个品牌好便宜学生、不入耳式蓝牙耳机推荐

开放式耳机相较于传统的入耳式耳机&#xff0c;极大地提升了用户的听觉享受和佩戴时的持久舒适度。然而&#xff0c;如何找到一款性价比高、品质优良的开放式耳机也是一个不小的问题。不入耳耳机哪个品牌好便宜学生&#xff1f;为了帮助大家更好地做出选择&#xff0c;我结合自…

第5章 IT服务部署实施

第5章 IT服务部署实施 5.1 概述 IT服务部署实施是衔接IT服务规划设计与IT服务运营的中间阶段&#xff0c;负责对服务组件进行客户化&#xff0c;并在充分满足客户要求的前提下&#xff0c;使用标准化的方法管理人员、资源、技术和过程&#xff0c;包括计划、实施和管理生产环…

【排序 - 快速排序】

快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它基于分治&#xff08;Divide and Conquer&#xff09;的策略。这种排序算法的核心思想是选择一个基准元素&#xff0c;将数组分割成两部分&#xff0c;使得左边的元素都小于等于基准元素&#xf…