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

一、设计背景

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

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

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

二、实现功能

        以51单片机为控制核心,设计一种四路抢答器。整个系统包括MCU、晶振电路、时钟电路、功能按键以及数码管显示。该系统利用共阳数码管实时显示抢答倒计时时间,通过独立按键设计控制抢答器的启动、复位、以及不同选手的抢答。可具体实现以下功能:

        (1) 按下启动键后,在10s倒计时的过程中,按下任意路抢答按键,数码管上对应显示抢答选手的序号并开始60s倒计时,60s倒计时结束后,抢答数据清零。

        (2) 按下复位键后,抢答器复位,再次按下启动键可以实现新一轮的抢答。

        (3)·定时器定时50ms,20次定时可产生1秒钟计时。

三、仿真演示

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

运行仿真后,进入准备界面,数码管显示默认抢答序号0和抢答倒计时10秒。

按下启动按键,进入抢答界面,开始10秒抢答倒计时,并在数码管上实时显示。

在抢答倒计时范围内,按下序号为1~4的选手抢答按键,抢答倒计时归零,数码管上显示抢答选手序号和倒计时60秒。

60s倒计时结束后,数码管显示0-00,表示1次抢答结束。

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

四、源程序(部分)

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

sbit key1 = P1^0;	//四位选手
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;

sbit start_stop = P3^6;	//抢答按钮

_bool action = 0;
_bool key1_flag = 0;
_bool key2_flag = 0;
_bool key3_flag = 0;
_bool key4_flag = 0;

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

uint8 second = 10;	//时间
uint8 timer0_count = 0;	//定时器1计数值
uint8 number = 0; //队号
uint8 number_display = 0;	//队号显示

uint8 key_scan8(void);
void start_stop_keyscan(void);
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
void main()
{
	ConfigTimer0();//定时器初始化
	while(1)
	{
		start_stop_keyscan();//开始按键
		while(action)//按下开始键为1,抢答结束为0
		{
			while(!key_scan8()&&!reset_flag)	//无队抢答
			{
				display(number_display,second);
				if(second == 0)
				{
					break;
				}
			}
			if(number_display)//有队抢答
			{
				second=60;
			}
			while(number_display&&!reset_flag)
			{
				display(number_display,second);
				TR0 = 1;
				if(second == 0)
				{
					break;
				}
			}
			TR0 = 0;//时间到
			display(number_display,second);
			action = 0;//抢答结束
			break;
		}
		display(number_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;
		}
	}	
}

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

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

/*-----------------------------------------------------------
复位键外部中断函数
------------------------------------------------------------*/
void EXINT0() interrupt 0  //外部中断0触发函数
{
	if(!reset_flag)
	{
		reset_flag = 1;
		number_display = 0;
		action=0;
		second=10;
	}
	
}

仿真源文件及源程序百度网盘链接:https://pan.baidu.com/s/1xKDNPqCrTqCiqI-F8pCGcQ 
提取码:v8a3 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ExcelVBA运用Excel的【条件格式】(二)

ExcelVBA运用Excel的【条件格式】(二) 前面知识点回顾 1. 访问 FormatConditions 集合 Range.FormatConditions 2. 添加条件格式 FormatConditions.Add 方法 语法 表达式。添加 (类型、 运算符、 Expression1、 Expression2) 3. 修改或删除条件…

【数据结构】线性表----栈详解

栈 栈(Stack)是一种常见的数据结构,它具有**后进先出(Last In, First Out, LIFO)**的特点。栈的运作类似于物理世界中的叠盘子:最新放上去的盘子最先被拿走,而最底部的盘子最后才能被取出。 如…

企业文档加密软件推荐丨2024企业用什么加密软件

在数字化时代,信息安全已经成为企业和个人不可忽视的问题。文档加密软件作为一种保护敏感信息不被非法访问或篡改的有效工具,其重要性日益凸显。通过加密技术,可以确保文档内容在传输和存储过程中的安全性,防止数据泄露和未经授权…

谷粒商城学习笔记-使用renren-fast-vue框架时安装依赖包遇到的问题及解决策略

文章目录 1,npm error Class extends value undefined is not a constuctor or null2,npm warn cli npm v10.8.1 does not support Node.js v16.20.2.3,npm error code CERT_HAS_EXPIRED学习心得 这篇文章记录下使用renren-fast-vue&#xff…

Spring Boot:连接MySQL错误Public Key Retrieval is not allowed

环境: MySQL版本:8.0.17 SpringBoot版本:2.5.15 解决 解决方式很简单,在数据库配置连接字符串spring.datasource.url末尾添加&allowPublicKeyRetrievaltrue即可,如下图: 重新启动,恢复正常…

Ai Native应用开发(一)--数字人

背景 刚参加完24年世界人工智能大会(WAIC),聊聊自己的一些感受。这次会明显比去年多很多人,用人山人海来形容应该也不为过。根据我自己粗浅观察参会的人员也比去年更多样化。去年更多还是从业者或者是这块研究人员。今年每个论坛…

Pytorch实战(二):VGG神经网络

文章目录 一、诞生背景二、VGG网络结构2.1VGG块2.2网络运行流程2.3总结 三、实战3.1搭建模型3.2模型训练3.3训练结果可视化3.4模型参数初始化 一、诞生背景 从网络结构中可看出,所有版本VGG均全部使用33大小、步长为1的小卷积核,33卷积核同时也是最小的能…

Linux网络配置管理

目录 一、网络配置 1. 网卡配置 2. 路由 二、 网络信息查看 1.netstat 2. ss 三、 额外的命令 time 一、网络配置 之前我们学过 ifconfig ,这个命令可以查看网络接口的地址配置信息,我们只知道它可以查看接口名称、IP 地址、子网掩码等。 但是&a…

java —— tomcat 部署项目

一、通过 war 包部署 1、将项目导出为 war 包; 2、将 war 包放置在 tomcat 目录下的 webapps 文件夹下,该 war 包稍时便自动解析为项目文件夹; 3、启动 tomcat 的 /bin 目录下的 startup.bat 文件,此时即可从浏览器访问项目首页…

windows 11 + kali wsl二合一配置步骤与踩坑

windows 11 kali wsl二合一配置步骤与踩坑 在前几天的某市攻防演练中,在攻防前期,我的虚拟机经常无缘无故出现断网、卡顿等现象,但找不出原因。 为了不影响后续的这些天的攻防演练,我选择在一个晚上通宵 在我的windows 11系统上…

2.作业2

目录 1.作业题目 A图 B代码 2.css盒子模型 0.css盒子模型 1.外边距(margin) 2.边框(border) 3.内边距(padding) ​编辑 3.GET方法与POST方法的区别 学习产出: html的作业 1.作业题目 A图…

无向图中寻找指定路径:深度优先遍历算法

刷题记录 1. 节点依赖 背景: 类似于无向图中, 寻找从 起始节点 --> 目标节点 的 线路. 需求: 现在需要从 起始节点 A, 找到所有到 终点 H 的所有路径 A – B : 路径由一个对象构成 public class NodeAssociation {private String leftNodeName;private Stri…

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码: 新建主图幅图类型指标都可以! VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

离线查询+线段树,CF522D - Closest Equals

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 522D - Closest Equals 二、解题报告 1、思路分析 考虑查询区间已经给出,我们可以离线查询 对于这类区间离线查询的问题我们通常可以通过左端点排序,然后遍历询问同时维护左区间信息…

数据泄露态势(2024年5月)

监控说明:以下数据由零零信安0.zone安全开源情报系统提供,该系统监控范围包括约10万个明网、深网、暗网、匿名社交社群威胁源。在进行抽样事件分析时,涉及到我国的数据不会选取任何政府、安全与公共事务的事件进行分析。如遇到影响较大的伪造…

《金山 WPS AI 2.0:重塑办公未来的智能引擎》

AITOP100平台获悉,在 2024 世界人工智能大会这一科技盛宴上,金山办公以其前瞻性的视野和创新的技术,正式发布了 WPS AI 2.0,犹如一颗璀璨的星辰,照亮了智能办公的新征程,同时首次公开的金山政务办公模型 1.…

支持图片识别语音输入的LobeChat保姆级本地部署流程

文章目录 前言1. LobeChat对我们有哪些帮助?2. 本地安装LobeChat3. 如何使用LobeChat工具4. 安装Cpolar内网穿透5. 实现公网访问LobeChat6. 固定LobeChat公网地址 前言 本文主要介绍如何在Windows系统电脑本地部署LobeChat,一款高颜值的开源AI大模型智能应用&…

5-google::protobuf命名空间下常用的C++ API----message.h

#include <google/protobuf/message.h> namespace google::protobuf 假设您有一个消息定义为: message Foo {optional string text 1;repeated int32 numbers 2; } 然后&#xff0c;如果你使用 protocol编译器从上面的定义生成一个类&#xff0c;你可以这样使用它: …

Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树、贪心算法总结

第31天&#xff0c;贪心最后一节(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 56.合并区间 738.单调递增的数字 968.监控二叉树 贪心算法总结 56.合并区间 文档讲解&#xff1a;代码随想录合并区间 视频讲解&#xff1a;手撕合并区间 题目&#xf…