【STM32单片机】比赛计时计分系统设计

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用OLED显示模块、矩阵按键模块、蜂鸣器等。

主要功能:
系统运行后,OLED默认显示第1节次比赛时间、AB得分。默认是12分钟倒计时,在未开始比赛时,可通过S4键设置时间,S8和S12键调节时间。时间设置好后,可按下S1键开始,比赛过程中,可按下S2键暂停,比赛过程中或结束后,可按下S3键改变节次,共4节次,每节次的默认时间是12分钟。比赛过程中,可通过S5-S7键调节A队得分,可通过S9-S11键调节B队得分。比赛时间结束,蜂鸣器报警。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/



//系统数据设置
void sys_data_set(void)
{
	u8 key=0;

	key=KEY_Matrix_Scan();
	//开始
	if(key==1)
	{
		BEEP_Alarm(100,100);
		sys_ctrl.start=1;
		sys_ctrl.mode=0;
		TIM_Cmd(TIM3,ENABLE);//打开定时器
	}
	//暂停
	else if(key==2)
	{
		BEEP_Alarm(100,100);
		sys_ctrl.start=0;
		TIM_Cmd(TIM3,DISABLE);//关闭定时器	
	}
	//更换节次
	else if(key==3)
	{
		BEEP_Alarm(100,100);
		sys_ctrl.start=0;
		TIM_Cmd(TIM3,DISABLE);//关闭定时器
		sys_ctrl.cnt++;
		if(sys_ctrl.cnt>4)sys_ctrl.cnt=1;
		//更换节次,每次重新开始时间
		sys_ctrl.min=12;
		sys_ctrl.sec=0;	
	}

	//如果还未开始,修改时间
	if(sys_ctrl.start==0)
	{
		//设置
		if(key==4)
		{
			sys_ctrl.mode++;
			if(sys_ctrl.mode>=3)sys_ctrl.mode=1;
		}
		//加
		else if(key==8)
		{
			switch(sys_ctrl.mode)
			{
				case 1://分
					sys_ctrl.min++;
					if(sys_ctrl.min>=60)sys_ctrl.min=0;
					break;
				case 2://秒
					sys_ctrl.sec++;
					if(sys_ctrl.sec>=60)sys_ctrl.sec=0;
					break;	
			}	
		}
		//减
		else if(key==12)
		{
			switch(sys_ctrl.mode)
			{
				case 1://分
					sys_ctrl.min--;
					if(sys_ctrl.min<0)sys_ctrl.min=59;
					break;
				case 2://秒
					sys_ctrl.sec--;
					if(sys_ctrl.sec<0)sys_ctrl.sec=59;
					break;	
			}		
		}
	}
	//比赛中,得分统计
	else
	{	
		switch(key)
		{
			case 5://A队加1分
				sys_ctrl.score_a+=1;
				break;
			case 6://A队加2分
				sys_ctrl.score_a+=2;
				break;
			case 7://A队加3分
				sys_ctrl.score_a+=3;
				break;
			case 9://B队加1分
				sys_ctrl.score_b+=1;
				break;
			case 10://B队加2分
				sys_ctrl.score_b+=2;
				break;
			case 11://B队加3分
				sys_ctrl.score_b+=3;
				break;
		}
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	//比赛结束,蜂鸣器报警
	if(sys_ctrl.overflag)
	{
		sys_ctrl.overflag=0;
		OLED_ShowxNum(30+6*8,0,sys_ctrl.sec,2,16,0x80,1);
		OLED_Refresh_Gram();//刷新显示缓存
		BEEP_Alarm(8000,100);
	}
}

//应用控制系统
void app_sys_ctrl_demo(void)
{
	sys_parm_init();//系统参数初始化
	LED_Init();
	USART1_Init(115200);
	OLED_Init();
	KEY_Matrix_Init();
	BEEP_Init();
	TIM3_Init(1000,36000-1);  //定时500ms
	sys_open_show();//系统开机界面显示
	
	while(1)
	{
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制
	}
}

/*******************************************************************************
* 函 数 名         : TIM3_IRQHandler
* 函数功能		   : TIM3中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM3_IRQHandler(void)
{
	static u8 i=0;
	if(TIM_GetITStatus(TIM3,TIM_IT_Update))
	{
		LED0=!LED0;
		i++;
		if(i>=2)
		{
			i=0;
			sys_ctrl.sec--;
			if(sys_ctrl.sec<0)
			{
				sys_ctrl.sec=59;
				sys_ctrl.min--;
				if(sys_ctrl.min<=0)
					sys_ctrl.min=0;	
			}
			else if(sys_ctrl.sec==0)
			{
				if(sys_ctrl.min==0)//比赛结束
				{
					TIM_Cmd(TIM3,DISABLE);//关闭定时器
					sys_ctrl.start=0;
					sys_ctrl.overflag=1;	
				}
			}
		}
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);	
}



三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

机器学习6:逻辑回归

假设我们有一个二元分类问题&#xff0c;有两个特征&#xff08;x1, x2&#xff09;和对应的类别标签&#xff08;y&#xff09;。给定 以下训练数据集&#xff1a; 我们定义逻辑回归模型的假设函数和损失函数。假设函数使用 sigmoid 函 数来将线性函数的输出转换为概率值&…

Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转Java之Sprin…

【2014年数据结构真题】

41. (13分&#xff09;二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。 给定一棵二叉树T,采用二叉链表存储&#xff0c;结点结构如下&#xff1a; 其中叶结点的weight域保存该结点的非负权值。 设root为指向T的根结点的指针&#xff0c; 请设计求T 的WPL…

抖音电商的野心,中小商家的风口

文丨新熔财经 作者丨寒蝉鸣 反向消费的大浪潮&#xff0c;不会辜负任何一个抓住风口的平台。过去是拼多多&#xff0c;如今是唯品会。 靠着响应新时代消费者对“质价比”的需求&#xff0c;消失在大众视线许久的唯品会&#xff0c;不仅守住了电商老前辈的行业地位&#xff0…

Express基本接口开发-入门学习

前提推荐 任何一个新的知识都是从文档看起&#xff0c;因此express官方文档示例有必要去学习一遍。 推荐看&#xff1a; 推荐入门指南-路由指南-中间件 看完这几个内容之后心里大概知道express有些什么东西了&#xff0c;然后现在就可以去练习了 注意&#xff1a;更多示例-代…

Quarkus 替代 SpringBoot

1 概述2 SpringBoot3 Quarkus4 比较5 调查结果6 从 Spring 转换到 Quarkus7 我是 Spring 开发者&#xff0c;为什么要选Quarkus&#xff1f;8 Spring 开发者可以活用哪些现有知识&#xff1f;9 对Spring开发者有额外的好处吗&#xff1f;10 Spring开发者如何开始学习Quarkus&am…

libgdx实现雪花、下雪效果(二十三)

libgdx实现雪花、下雪效果&#xff08;二十三&#xff09; 转自&#xff1a;https://lingkang.top/archives/libgdx-shi-xian-xue-hua package effect;import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.backends.lwjgl3.…

使用CXF调用WSDL(二)

简介 本篇文章主要解决了上篇文章中遗留的对象嵌套问题&#xff0c;要想全面解析无限极的对象嵌套需要使用递归去解决 上文链接&#xff1a; 使用CXF调用WSDL&#xff08;一&#xff09; 上文回顾 上文使用了单方法“ call() ”解决了List和基本类型&#xff08;含String&…

基于逐次变分模态分解(SVMD)联合小波阈值去噪

代码原理 逐次变分模态分解 (Iterative Variational Mode Decomposition, IVMD) 是一种信号分解方法&#xff0c;它可以将一个时域信号分解为若干个本征模态函数&#xff08;Intrinsic Mode Functions, IMF&#xff09;。它通过迭代寻找信号的本征模态函数和残差部分&#xff…

Kalman滤波

文章目录 一、公式推导二、扩展卡尔曼滤波 卡尔曼滤波是一种最优化递归数据处理算法。&#xff08;Optimal Recursive Data Processing Algorithm&#xff09; Kalman滤波是时域滤波&#xff0c;采用状态空间描述系统&#xff0c;运用递推形式是计算简单&#xff0c;数据存储量…

TSINGSEE视频汇聚管理与AI算法视频质量检测方案

一、建设背景 随着互联网视频技术的发展&#xff0c;视频监管在辅助安全生产、管理等方面发挥了不可替代的作用。但是&#xff0c;在监管场景中&#xff0c;仍然存在视频掉线、视频人为遮挡、视频录像存储时长不足等问题&#xff0c;对企业的日常管理和运转存在较大的安全隐患…

A. Weird Sum

题目链接 : Problem - 1648A - Codeforces 题面 : 题意 : 输入 n m (1≤n*m≤1e5) 和 n 行 m 列的矩阵 a&#xff0c;元素范围 [1,1e5]。 对于矩阵中的所有相同元素对&#xff0c;即满足 a[x1][y1] a[x2][y2] 的元素对 (a[x1][y1], a[x2][y2])&#xff0c;把 abs(x1-x2)…

P3371 【模板】单源最短路径(弱化版)

【模板】单源最短路径&#xff08;弱化版&#xff09; 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到所有点的最短路…

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…

ABZ正交编码 - 异步电机常用的位置信息确定方式

什么是正交编码&#xff1f; ab正交编码器&#xff08;又名双通道增量式编码器&#xff09;&#xff0c;用于将线性移位转换为脉冲信号。通过监控脉冲的数目和两个信号的相对相位&#xff0c;用户可以跟踪旋转位置、旋转方向和速度。另外&#xff0c;第三个通道称为索引信号&am…

μC/OS-II---计时器管理2(os_tmr.c)

目录 获取计时器的名字获取计时器到期前剩余的时间查看计时器的状态 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;例…

软件测试基础1:认识软件及测试

功能测试能力:具备对所有软件的功能进行质量验证。 1什么是软件 分类 应用软件系统软件 软件&#xff1a;控制计算机硬件工作的工具。 2软件基本组成 3软件产生过程 4什么是软件测试 软件测试&#xff1a;使用技术手段验证软件是否满足使用需求。 5软件测试目的 减少软件…

使用matlab制作声音采样率转换、播放以及显示的界面

利用matlab做一个声音采样率转换、播放以及显示的界面 大抵流程&#xff1a; 图形界面创建&#xff1a;使用figure函数创建名为“声音采样率转换”的图形界面&#xff0c;并设置了其位置和大小。 按钮和文本框&#xff1a;使用uicontrol函数创建了选择音频文件的按钮、显示当前…

工业数据的“最后一公里”怎么走?

随着工业互联网的迅猛发展&#xff0c;工业数据已经成为推动制造业转型升级的重要动力。然而&#xff0c;面对海量的工业数据&#xff0c;如何高效、准确地走过数据的“最后一公里”&#xff0c;成为制约企业发展的关键问题。本文将探讨工业数据“最后一公里”所面临的挑战&…

魔兽服务器学习-笔记(服务器部署、地图管理、DB、日志模块、任务模块、战斗模块)

文章目录 一、环境准备1&#xff09;依赖安装2&#xff09;源码下载和编译 二、生成数据信息1&#xff09;地图数据信息&#xff08;客户端信息&#xff09;2&#xff09;数据库信息 三、启动服务器四、日志模块五、数据库模块六、场景模块1&#xff09;地图管理2&#xff09;A…