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

news2024/11/16 7:31:41

目录

一、设计背景

二、实现功能

三、仿真演示

四、源程序(部分)


一、设计背景

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

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

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

二、实现功能

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

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

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

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

(4) 抢答倒计时开始抢答指示灯亮起,抢答结束,按下复位按键后指示灯熄灭。

三、仿真演示

运行仿真,未按下总开关按键,数码管不显示。

按下系统总开关后,进入准备界面,数码管显示默认抢答序号0和抢答倒计时20秒。

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

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

 按下复位按键后,恢复到准备界面,按下启动按钮进行下一次抢答。

四、源程序(部分)

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

sbit kaishi=P3^1;
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;

sbit key5 = P1^4;
sbit key6 = P1^5;
sbit key7 = P1^6;
sbit key8 = P1^7;
sbit state = P3^4;
sbit reset = P3^7;
sbit start_stop = P3^6;

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

_bool key5_flag = 0;
_bool key6_flag = 0;
_bool key7_flag = 0;
_bool key8_flag = 0;
_bool reset_flag = 0;
_bool start_stop_flag = 0;

uint8 second = 20;
uint8 timer0_count = 0;
uint8 number = 0;
uint8 number_display = 0;

uint8 key_scan8(void);
void reset_keyscan(void);
void start_stop_keyscan(void);
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
void main()
{
	ConfigTimer0();
	while(1)
	{	
		while((kaishi == 0)&&(!kaishi_flag))
		{	
			start_stop_keyscan();
			reset_keyscan();
			while(action)
			{
				while(!key_scan8())
				{
					display(number_display,second);
					if(second == 0)
					{
						second = 20;
						break;
					}
				}
				TR0 = 0;
				second = 0;
				display(number_display,second);
				action = 0;
				break;
			}
			display(number_display,second);	
		}
	}
}

/*-----------------------------------------------------------
中断服务函数
------------------------------------------------------------*/
void timer0() interrupt 1
{
	TH0=0x3c;
	TL0=0xb0;
	timer0_count++;
	if(timer0_count == 20)
	{
		timer0_count = 0;
		second--;
		if(second == 0)
		{
			TR0 = 0;
			number_display = 0;
			state = 1;
			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;
			state = 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(key5 == 0)
	{
		Delay_ms(8);
		if((key5 == 0)&&(!key5_flag))
		{
			key5_flag = 1;
			number  = 5;
			number_display = number;
		}
	}
	else
	{
		key5_flag = 0;
		number  = 0;	
	}
	
	if(key6 == 0)
	{
		Delay_ms(8);
		if((key6 == 0)&&(!key6_flag))
		{
			key6_flag = 1;
			number  = 6;
			number_display = number;
		}
	}
	else
	{
		key6_flag = 0;
		number  = 0;	
	}
	
	if(key7 == 0)
	{
		Delay_ms(8);
		if((key7 == 0)&&(!key7_flag))
		{
			key7_flag = 1;
			number  = 7;
			number_display = number;
		}
	}
	else
	{
		key7_flag = 0;
		number  = 0;	
	}
	
	if(key8 == 0)
	{
		Delay_ms(8);
		if((key8 == 0)&&(!key8_flag))
		{
			key8_flag = 1;
			number  = 8;
			number_display = number;
		}
	}
	else
	{
		key8_flag = 0;
		number  = 0;	
	}
							
	if(number_display != 0)	
	{
		return 1;
	}
	else
	{
		return 0;
	}	
}

/*-----------------------------------------------------------
复位键扫描函数
------------------------------------------------------------*/
void reset_keyscan(void)
{
	if(reset == 0)
	{
		Delay_ms(8);
		if((reset == 0)&&(!reset_flag))
		{	second=20;
			reset_flag = 1;
			number_display = 0;
			state = 1;
		}
	}
	else
	{
		reset_flag = 0;
	}	
}

仿真源文件及源程序百度网盘链接:https://pan.baidu.com/s/1WXV4yNoltarwZwnfIL92rQ 
提取码:42b1 
 

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

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

相关文章

HTML浪漫动态表白代码绚烂星空烟花+粉色大爱心+3D旋转相册+音乐(附源码)(三)

一. 前言 七夕马上就要到了,为了帮助大家高效表白,下面再给大家加几款实用的HTML浪漫表白代码(附源码)背景音乐,可用于520,情人节,生日,求爱表白等场景,可直接使用。 来吧,展示&am…

统一git使用方法,git状态变迁图,git commit提交规范

目录 说明 统一git使用方法 git状态变迁图 git commit 提交规范 说明 多次工作中多名员工不懂git多次技术分享,自行查资料学习git并使用,会出现使用各种偏僻的命令,异常问题无法解决;或出现带url的git合并提交。主要是学的不…

【腾讯云 TDSQL-C Serverless 产品测评】全面测评TDSQL-C Mysql Serverless

全面测评TDSQL-C Mysql Serverless 文章目录 全面测评TDSQL-C Mysql Serverless前言什么是TDSQL-C Mysql Serverless初始化 TDSQL-C Mysql Serverless新建数据库建立数据表开启外网访问 兼容性SQL文件 导入导出navicat 直接在线传输 构建测试环境准备Python测试脚本准备 Jmeter…

算法通关村第5关【白银】| 哈希和栈经典算法题

1.两个栈实现队列 思路:两个栈,一个输入栈,一个输出栈。 当需要输入的时候就往inStack中插入,需要输出就往outStack中输出,当输出栈是空就倒出输入栈的数据到输出栈中,这样就保证了后插入的数据从栈顶倒入…

MySQL数据库中间件Mycat介绍及下载安装(教程)

一,介绍 MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat,对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可,而具体底层用到几台数据库,每一台数据库服务器…

数组分割(2023省蓝桥杯)n种讨论 JAVA

目录 1、题目描述:2、前言:3、动态规划(bug):3、递归 剪枝(超时):4、数学(正解): 1、题目描述: 小蓝有一个长度为 N 的数组 A [A0, A1,…, AN−…

3分钟通过日志定位bug,这个技能测试人必须会!

♥ 前 言 软件开发中通过日志记录程序的运行情况是一个开发的好习惯,对于错误排查和系统运维都有很大帮助。 Python 标准库自带了强大的 logging 日志模块,在各种 python 模块中得到广泛应用。 一、简单使用 1. 入门小案例 import logging loggin…

sync修饰符(重要)

作用:可以实现 子组件 与 父组件 数据的双向绑定 简化代码 特点:prop属性名,可以自定义,非固定为value 场景:封装弹框类的基础组件,visible属性 true显示 false隐藏 本质:就是 :属性名 和 updat…

SpringBoot 配置优先级

一般而言,SpringBoot支持配置文件进行配置,即在resources下的application.properties或application.yml。 关于配置优先级而言, application.properties>application.yml>application.yaml 另外JAVA程序程序还支持java系统配置和命令行…

lombok启动不生效(什么方法都试了,可还是不生效怎么办 ?! 救救我)

使用IntelliJ IDEA 2021.1.3&#xff08;Ultimate Edition&#xff09;时提示Lombok不生效 java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 方式一&#xff1a;我们手动更新一下版本到以下版本 <!--Lombok--&…

水果音乐制作软件fl studio v21.1.0.3713 中文特别版

水果音乐制作软件fl studio v21.1.0.3713 中文特别版是一个功能完备的音乐制作环境&#xff0c;能够进行多轨道音频录制、音序处理和混音&#xff0c;可以帮助用户创作专业质量的音乐轨道。 借助 VST 托管、灵活的混音器、高级 MIDI 和 ReWire 支持&#xff0c;您将轻松驾驭各种…

第14章——FreeRTOS信号量

1.信号量的简介 信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。 信号量&#xff1a;用于传递状态&#xff08;区别于队列传递消息&#xff09; 信号量的计数值都有限制&#xff1a;限定最大值。 如果最大值被限定为1&#xff0c;那么它就是二值…

多种编程语言运行速度排名-10亿次除7求余数为0的数量

最佳方式是运行10次&#xff0c;取平均数&#xff0c;用时秒数显示3位小数。 因为第一次打开&#xff0c;可能CPU还没优化好&#xff0c;多次取平均&#xff0c;比较准确 第1次共10次&#xff0c;用时3秒&#xff0c;平均3秒 第2次共10次&#xff0c;用时4秒&#xff0c;平均3.…

搭建开发环境-操作系统篇(一键搭建开发环境)

概述 所谓工欲善其事必先利其器&#xff0c;搭环境往往是开发过程中卡出很多初学者的拦路虎。 对于很多老鸟来说&#xff0c;很多东西都已经习惯成自然&#xff0c;也就没有刻意和初学者说。但对于很多初学者&#xff0c;却是受益良多。 这个系列&#xff0c;先从操作系统开始…

string类写时拷贝

文章目录 1.string类拷贝构造函数的现代写法2.string类写时拷贝vs和g下string结构的不同vs下string的结构&#xff1a;g下string的结构 3.总结 1.string类拷贝构造函数的现代写法 string类拷贝构造函数的传统写法&#xff1a; string(const string& s){if (this ! &s)…

2023年每天都投递很多份简历,但都石沉大海,我还投吗?测试人该何去何从?

各大互联网公司的接连裁员&#xff0c;政策限制的行业接连消失&#xff0c;让今年的求职雪上加霜&#xff0c;想躺平却没有资本&#xff0c;还有人说软件测试岗位饱和了&#xff0c;对此很多求职者深信不疑&#xff0c;因为投出去的简历回复的越来越少了。 另一面企业招人真的…

计算机视觉--利用HSV和YIQ颜色空间处理图像噪声

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天我们将利用HSV和YIQ颜色空间处理图像噪声。在本次实验中&#xff0c;我们使用任意一张图片&#xff0c;通过RGB转HSV和YIQ的操作&#xff0c;加入了椒盐噪声并将其转换回RGB格式&#xff0c;最终实现对图像的噪声处理…

mysql之host is blocked问题

程序上线一段时间之后&#xff0c;更新程序总是遇到这个问题 每次都是重启几次程序&#xff0c;或者执行 flush hosts; 毕竟指标不治本&#xff0c;抽出时间决定分析一下问题&#xff0c;查阅了几篇博客。&#xff08;感谢这几位大佬&#xff09; https://blog.51cto.com/u_…

飞机打方块(四)游戏结束

一、游戏结束显示 1.新建节点 1.新建gameover节点 2.绑定canvas 3.新建gameover容器 4.新建文本节点 2.游戏结束逻辑 Barrier.ts update(dt: number) {//将自身生命值取整let num Math.floor(this.num);//在Label上显示this.num_lb.string num.toString();//获取GameCo…

数据结构—队列

队列 队列的概念及结构队列的实现 队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 。 入队列&#xff1a;进行插入操作的一端称为队尾。 出队列&am…