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

news2024/12/24 16:57:13

一、设计背景

        近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于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 

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

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

相关文章

js替换对象内部的对象名称或属性名称-(第二篇)递归

1.代码示例: function replaceKey(obj, oldKey, newKey) {// 如果不是对象或者oldKey不存在,直接返回原对象if (typeof obj ! object || !obj || !(oldKey in obj)) return obj;// 如果是数组,遍历数组每个元素if (Array.isArray(obj)) {obj…

python爬虫加入进度条

安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块,用于处理时间相关的功能 from tqdm import * # 从tqdm包中…

ESIX配置备份和恢复

ESIX虽然重装很快,但是原本配置就丢失了,在硬件不变的情况下,可以使用配置备份和配置恢复的方法。 1、备份配置 1.1、执行以下两条命令 vim-cmd hostsvc/firmware/sync_configvim-cmd hostsvc/firmware/backup_config如下图,只需…

LED灯的呼吸功能

"呼吸功能"通常是指 LED 灯的一种工作模式,它模拟人类的呼吸节奏,即 LED 灯的亮度会周期性地逐渐增强然后逐渐减弱,给人一种 LED 在"呼吸"的感觉。这种效果通常用于指示设备的状态或者简单地作为装饰效果。(就…

强化学习编程实战-2马尔可夫决策过程

2.1 从多臂赌博机到马尔可夫决策过程 如图2-1,图中A为多臂赌博机,B为一堆鸳鸯,其中左上角为雄性鸳鸯,右上角为雌性鸳鸯,B展示的任务是雄性鸳鸯绕过障碍物找到词性鸳鸯。跟多臂赌博机不同的是,雄性鸳鸯经过一…

vue移动端框架渲染标签出错是因为没有补全标签

文档地址 https://youzan.github.io/vant/v2/#/zh-CN/quickstart

LDR6020-VR串流线:开启虚拟现实新纪元的钥匙

随着科技的飞速发展,虚拟现实(VR)技术已经从科幻概念逐渐走进我们的生活,成为娱乐、教育、医疗等多个领域的热门话题。而VR串流线,作为这一技术的重要组成部分,正逐步成为连接用户与高质量VR体验的关键桥梁…

Redis的缓存雪崩,击穿,穿透的介绍

1.缓存雪崩 为保证缓存中的数据与数据库的数据一致,会给Redis里的数据设置一个过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成新的缓存,因为就会访问数据库,并将数据更新到Redis里,这样后续请求就可以直接命中缓存. 当大量缓存在同一时间过期或…

明明已经安装了python中的某个库,但是还是报错ModuleNotFoundError: No module named ‘sklearn‘

问题: 明明已经安装了python中的某个库,但是还是报错ModuleNotFoundError: No module named sklearn 解决方法: 卸载重新安装一下即可 pip uninstall scikit-learn pip install scikit-learn 成功解决!!&#xff…

DSSM双塔特征交互

传统的DSSM双塔无法在早期进行user和item侧的特征交互,这在一定程度上降低了模型性能。我们想要对双塔模型进行细粒度的特征交互,同时又不失双塔模型离线建向量索引的解耦性。下面介绍两篇这方面的工作。 美团-Dual Augmented Two-tower 在user和item的特…

Onekey正版steam分流下载工具

今天给大家介绍的是一款下载steam游戏的工具。Onekey工具,是一款游戏下载器,可以下载steam正版分流游戏。下载正版分流的网站很多,但是都是网盘或者迅雷下载,或者游戏盒子下载,速度都很慢。这款软件是用steam下载的&am…

安卓项目中so库选择

接上篇Android中常见SDK类型区别-CSDN博客 一些重要的加密算法或者核心协议一般都在C中编写,然后给java调用。这样可以避免反编译后查看到应用的源码。此时就需要了解一下NDK中的ABI(Application Binary Interface的缩写,也就是应用二进制接…

国产化框架PaddleClas结合Swanlab进行杂草分类

1. 项目介绍 杂草是农业中的主要问题之一,对作物生长和产量造成严重威胁。传统的手动识别和管理方式效率低下且不够精确,因此需要借助先进的计算机视觉技术来提升农业生产的效率和质量。ResNet作为一种深度学习模型,在处理复杂的图像分类任务…

视频压缩软件哪个压缩最小,视频用什么软件压缩最小

在数字媒体时代,视频内容的生产与分享已成为生活常态。但随之而来的问题就是,大视频文件占用过多存储空间,上传和分享也变得不便。本文将为你揭示如何将视频压缩到最小,同时保持画质清晰。让我们一起探索吧! 下载并文件…

第九篇——军形篇:先胜后战,赢了再打

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 微观层面的,洞察千里之外;提前预防以做到规避风险…

数据结构——二叉树相关习题3

1.求另一棵树的子树 题目 前序遍历一样,形状不一定一样。 子树:以任何一个节点做根都可以看做是根子树。 也就是说需要让subroot和每一个子树都比较相同的时候就一样。找出左边这棵树的所有子树 思路:如何找到左边的所有子树? …

初识数组!

目录 1.概念 2.一维数组的创建和初始化 1)数组创建 2)数组的初始化 3)数组的类型 3.一维数组的使用 1) 数组下标 2) 数组元素的打印 3) 数组的输入 4.一维数组在内存中的存储 5.sizeof计算数组元素个数 6.二维数组的创建 1.概念 …

Hugging face Transformers(4)—— Model

Hugging Face 是一家在 NLP 和 AI 领域具有重要影响力的科技公司,他们的开源工具和社区建设为NLP研究和开发提供了强大的支持。它们拥有当前最活跃、最受关注、影响力最大的 NLP 社区,最新最强的 NLP 模型大多在这里发布和开源。该社区也提供了丰富的教程…

Android 10.0 FolderIcon文件夹图标内预览图标超出边距解决方案

1.前言 在10.0的系统rom定制化产品开发中,在进行Launcher3的功能定制化过程中,在实现文件夹功能的时候,由于产品分辨率等原因 在拖拽图标进文件夹的时候,在3*3的布局中,会发现图标出了folder边距,所以就需要分析相关的功能,然后实现解决这个问题 2.FolderIcon文件夹图标…

麒麟桌面操作系统上鼠标右键菜单中打开终端栏消失的解决方法

原文链接:麒麟桌面操作系统上鼠标右键菜单中打开终端栏消失的解决方法 Hello,大家好啊!今天给大家带来一篇关于在麒麟桌面操作系统上解决鼠标右键菜单中“打开终端”选项消失的方法的文章。鼠标右键菜单中的“打开终端”选项是一个非常便捷的…