【详解】篮球记分牌硬件及代码

news2024/11/16 15:37:52

篮球记分牌设计

  • 1 系统设计
      • 1.1 设计任务
    • 1.2 性能指标要求
    • 1.2 设计思路及设计框图
      • 1.2.1设计思路
      • 1.2.2总体设计框图
      • 1.2.3电路原理图
      • 1.2.3 PCB布线图
  • 2 主要程序模块的设计及原理
      • 2.1 外部中断0
    • 2.2 菜单
    • 2.3 两队比分及两队犯规次数显示及修改
      • 2.3.1选择功能
      • 2.3.2修改功能
      • 2.3.3显示功能
    • 2.4 24秒倒计时
      • 2.4.1 T0计时器
      • 2.4.2 24秒倒计时显示/复位/暂停
  • 3 调试过程
    • 3.1 硬件
      • 3.1.1 实物正面
      • 3.1.1 实物背面
    • 3.2 软件
  • 4 功能测试
    • 4.1 测试仪器与设备
    • 4.2 性能指标测试
  • 附录2:程序清单

1 系统设计

1.1 设计任务

设计一个基于单片机的篮球计分牌,实现两队的计分和犯规次数功能及24秒计时功能。

1.2 性能指标要求

(1)按照题目要求独立设计系统所需电路,并完成硬件电路的制作及调试。
(2)结合硬件能够正常计分(1,2,3)。
(3)能够正常显示分值。
(4)能够正常修改工作模式(计分与24秒)。
(5)能够24秒的误差不小于1秒。
(6)能够两队球员犯规次数计数。

1.2 设计思路及设计框图

1.2.1设计思路

(1)了解设计要求后,查询各元件的特性及使用方法。
(2)查找类似实验资料,吸收其设计经验。
(3)由于本次下发的是万能板,需要己排版并焊接。为焊接电路我决定先用制图软件进行排版,绘制结束门根据电路图直按焊接即可。
(4)焊接结束后测试数码管显示。
(5)对拓展功能进行设计及实现,增加犯规和比分减减的功能并有Led灯指示操作。

1.2.2总体设计框图

请添加图片描述

1.2.3电路原理图

请添加图片描述

1.2.3 PCB布线图

在这里插入图片描述

2 主要程序模块的设计及原理

2.1 外部中断0

请添加图片描述
由于菜单的切换可能发生在任意地方,所以采用中断切换的方式能更快捷。与P3_2连接的按钮每按一次会触发一次外部中断0,IN0_num也随之++,但IN0_num到达3后会变为0,使IN0_num数值范围始终在0~2;(每个值对应一个功能)

当触发外部中断0且P3_5 状态为 0 则两队比分及犯规次数在LED上左右显示位置交换(模拟换场地)

2.2 菜单

请添加图片描述IN0_num为0时进入两队比分显示及调整功能

当IN0_num为1时进入两队犯规次数显示及调整功能

IN0_num为2时进入24秒倒计时功能

2.3 两队比分及两队犯规次数显示及修改

2.3.1选择功能

请添加图片描述
该函数是可以复用的:
1:当执行两队比分显示或修改时给queue_Ajusth()函数传两队比分变量的地址及数字0即可

2:当执行两队犯规次数显示或修改时给queue_Ajusth()函数传两队犯规次数变量的地址及数字1即可

如何复用及复用之间的差异:
1:函数参数c1传0或1用于分辨当前执行的时两队比分显示或修改还是两队犯规次数显示或修改,c1为0时操作指示灯常亮,c1为1时指示灯闪烁

2:P3_6按钮每按一次pat变量加一,当始终是在0~1循环,0时实验板上左边操作指示LED灯会发出指示行为,0时右边操作指示LED灯会发出指示行为

3:当左边LED灯发出指示行为时,按下修改按键后修改的的是左边数码管对应的值,当有边LED灯发出指示行为时,按下修改按键后修改的的是右边数码管对应的值

2.3.2修改功能

请添加图片描述
原理:
在2.3.1中的queue_Ajusth()函数对要修改的变量进行了选择,将变量地址传送给Score()函数。

功能:
1:P3_1/P3_3/P3_4所接的按钮被按下,对应对要修改的变量进行加1/2/3
2:P3_1/P3_3/P3_4所接的按钮被按下与P3_5一同被按下时,对应对要修改的变量进行减1/2/3
3:由于数码管两位显示一个值,所以所显示的值超过99时会显示异常,所以当执行加操作后值超过99,将忽略该操作
4:由于比分及犯规次数没有负数,所以当执行减操作后值小于0,将忽略该操作

2.3.3显示功能

请添加图片描述
原理:
LED函数传要显示的位和段码数组的下标即可,如Led(1,6),表示在数码管第一位显示6

2.4 24秒倒计时

2.4.1 T0计时器

请添加图片描述
原理:
1:由于24秒倒计时,时需显示两位小数分辨率为10ms所以T0定时器每10ms触发一次中断,使用T0_num计数,当达到100时说明以达到一秒,time_24变量减减,大概到-1后计时结束

2:24秒计时结束后,P1_0连接的蜂鸣器发声(模拟哨声)

3:每次24秒倒计时结束后TR0会被置零,需按复位键后才能启动计时器

2.4.2 24秒倒计时显示/复位/暂停

请添加图片描述
功能:
1:显示24秒倒计时是当前所剩时间
2:P3_6所连接按键被按下时对倒计时进行暂停或启动
3:P3_5所连接按键被按下时对时间进行复位,使其回到24秒,并将TR0置零需按下启动/暂停间才能启动倒计

3 调试过程

3.1 硬件

1:由于S8050三极管的不熟悉,一开始焊接好后蜂鸣器处于不可控状态,查找资料时发现自己集电极和发射极接反了,改进后蜂鸣器才正常运行

2:LED灯由于是临时改变位置(因为是操作指示灯改在图中位置,能更好指示操作),导致LED不跳线的情况下只能采用共阴接法。但是所使用的8052复位后I/O口默认为高电平,复位后不处理的话LED默认为亮的状态。

3.1.1 实物正面

请添加图片描述

3.1.1 实物背面

请添加图片描述

3.2 软件

1:由于复位后LED默认为亮的状态,所以程序一开始就要给LED置对应电平以达到LED的正确显示

2:一开始24秒倒计时分辨率只有秒,后面思考后数码管一共有四位前两位显示十秒和秒,后两位可以用来显示100ms和10ms

2:由于篮球比赛时间过半后,会交换双方场地也就意味着比分和犯规数的左右显示也要交换。我通过交换双方比分及犯规变量的值来达到,场地交换后比分及犯规数后的显示。

4 功能测试

4.1 测试仪器与设备

开发板USB转串口CH340驱动
STC-ISP单片机下载器
STC89C52单片机1个
1K电阻1个10K电阻2个
30u电容2个
LED二极管3个
晶振原件1个
电解质电容1个
锡线、排针导线若干
笔记本电脑一台

4.2 性能指标测试

(1)结合硬件能够正常显示分值且能够正常计分(1,2,3)。
(2)能够正常修改工作模式(计分与24秒)。
(3)能够实现24秒的误差不小于1秒。
(4)能够显示两队球员犯规次数计数。
(5)半场交换场地后,对应数据的显示也左右交换
(4)能控制蜂鸣器及为防止误触后比分不可逆,实现比分及犯规数的减功能

附录2:程序清单

#include <AT89X51.H>
sbit ALM = P1^0; //警报

char queue_1 = 0, queue_2 = 0;//两队分数

char war_1 = 0 , war_2 = 0;//两队犯规数

char IN0_num = 0,T0_num = 0 , T1_num = 0,time_24 = 24 , p10 = 0, pat = 0 , cur = 0;

unsigned char arr[] = {0x5f , 0x44 , 0x9d, 0xd5 , 0xc6, 0xd3 , 0xdb , 0x45 , 0xdf  ,0xd7 ,0x20 };//最后一个是dp小数点
void delay(unsigned int n)
{
	unsigned int i , j;
	for( i = 0 ; i < n ; i++)
	{
		for(j = 0 ; j < 200 ; j++);
	}
}
void IN0_Init()
{
		EA = 1 ; EX0 = 1; IT0 = 1;//外部中断0下降沿触发
}

void T0_Init()
{
	TMOD &= 0xf0; TMOD |= 0x01;//清第四位,并设置T0工作方式1
	ET0 = 1; TR0 = 0;//开启T0
	
	TH0 = (65536 - 10000)%256;
	TH0 = (65536 - 10000)/256;
}

void T1_Init()
{
	TMOD &= 0x0f; TMOD |= 0x10;//清第四位,并设置T0工作方式1
	ET1= 1; TR1 = 1;//开启T0
	
	TH1 = (65536 - 10000)%256;
	TH1 = (65536 - 10000)/256;
}

void IN0_fun()interrupt 0
{
	
	IN0_num++;
	P1_0 = 1;delay(100);P1_0 = 0;//每次切换菜单发出提示音
	
	if(P3_5 == 0)//两队数据交换
	{
		IN0_num--;
		
		P0 = 0x00;
		P1_0 = 1;delay(70);P1_0 = 0;delay(70);P1_0 = 1;delay(70);P1_0 = 0;//声音提醒
		
		cur = queue_1;queue_1 = queue_2;queue_2 = cur;//交换比分左右位置
		
		cur = war_1;war_1 = war_2;war_2 = cur;//交换犯规次数左右位置
	}
	if(IN0_num == 3)//数值控制在0~2
	{
		IN0_num = 0;
	}
}
void T1_fun()interrupt 3 //中断号3 , 默认使用第0组寄存器
{
	T1_num++;
	if(T1_num == 100 )
	{
		T1_num = 0;
	}
	TH1 = (65536 - 10000)/256;
	TL1 = (65536 - 10000)%256;
}
void T0_fun()interrupt 1 //中断号1 , 默认使用第0组寄存器
{
	
	T0_num++;
	if(T0_num == 100 )
	{
		T0_num = 0;
		time_24--;
		if(time_24 == -1)
		{
			time_24 = 0;
			P1_0 = 1;
			p10 = 1;
			TR0 = 0;//完成一次计时后暂停计时
		}
	}
	TH0 = (65536 - 10000)/256;
	TL0 = (65536 - 10000)%256;
}
#include"Interrupt.h"
void add(char* num , char i)
{
	*num += i;
}
void sub(char* num , char i)
{
	*num -= i;
}
void Led(unsigned int wei ,unsigned int duan )
{
		char sub = 0x10;
	  P2 = ~(sub<<wei);
	  P0 = arr[duan];//位选
		delay(1);
}
void Score(char* num )
{
	if(P3_1 == 0 && (P3_5 == 1 && *num < 99))
	{
		while(P3_1 == 0);
		add(num , 1);//加1分
	}
	else if(P3_3 == 0 && (P3_5 == 1 && *num < 98))
	{
		while(P3_3 == 0);
		add(num , 2);//加1分
	}
	else if(P3_4 == 0 && (P3_5 == 1 && *num < 97))
	{
		while(P3_4 == 0);
		add(num , 3);//加1分
	}
	
	if(P3_1 == 0 && (P3_5 == 0 && *num > 0))
	{
		while(P3_1 == 0);
		sub(num , 1);//减1分
	}
	else if(P3_3 == 0 && (P3_5 == 0 && *num > 1))
	{
		while(P3_3 == 0 );
		sub(num , 2);//减1分
	}
	else if(P3_4 == 0 && (P3_5 == 0 && *num > 2))
	{
		while(P3_4 == 0);
		sub(num , 3);//减1分
	}
}
void time_fun()
{
	char _T0 = (100 - T0_num);
	Led(0 , time_24/10);
	Led(1 , time_24%10);
	Led(1 , 10 );//小数点
	Led(2 , (_T0/10)%10 );//100%10会出现10,段码错误
  Led(3 , _T0% 10);
	
	if(P3_5 == 0)//复位
	{
		p10 = 0;
		P1_0 = 0;
		TR0 = 0;
		T0_num = 0;
		time_24 = 24;
		while(P3_5 == 0);
	}
	
	if(P3_6 == 0 && p10 != 1 )//暂停
	{
		if(time_24 == 24)
		{
			time_24 = 23;
		}
		TR0 = ~TR0;
		while(P3_6 == 0);
		delay(15);
	}
	
}
void queue_Ajust(char* num1 , char* num2 ,char c1)//c1 为0为比分 , 1为犯规
{
			if(pat == 0)//默认为左调整
			{
						Score(num1);
						P1_1 = 0;
					if(c1 == 0) P1_2 = 1;
					else P1_2 = (T1_num < 50);
			}
			else{
						Score(num2);	
						P1_2 = 0;
					if(c1 == 0) P1_1 = 1;
					else P1_1 = (T1_num < 50);
			}
			if(P3_6 == 0)//左右位选择
			{
					while(P3_6 == 0);
					pat = (pat+1)%2;//控制在0 ~ 1
			}
			/// 数码管显示
				Led(0 , *num1/10);//队1比分/犯规次数十位
	      Led(1 , *num1%10);//队1比分/犯规次数个位
	      Led(2 , *num2/10);//队2比分/犯规次数十位
	      Led(3 , *num2%10);//队2比分/犯规次数个位
}

void  main()
{
	ALM = 0;//高电平响
	T0_Init();IN0_Init();T1_Init();
	while(1)
	{
		if(IN0_num == 0)//比分加/减
		{
			queue_Ajust( &queue_1 , &queue_2 ,0 );
		}
		else if(IN0_num == 1)//犯规次数加/减
		{
			queue_Ajust( &war_1 , &war_2 ,1 );
		}
		else if(IN0_num == 2)//倒计时
		{
			P1_1 = 0;P1_2 = 0;
			time_fun();
		}
	}
}

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

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

相关文章

golang vscode环境报错gopls was not able to find modules in your workspace的解决方式

目录 错误提示 分析 解决方式 方法一&#xff1a;将workspace与项目路径保持一致 方案二&#xff1a;使用go work指明纳入工作区的的module 总结 错误提示 golang从老版本升级到go1.20.5后打开vscode&#xff0c;发现代码不能自动补全了&#xff0c;而且vscode跳出一下的…

dolphinscheduler创建创建租户错误

报错信息 [ERROR] 2023-06-17 17:04:10.282 org.apache.dolphinscheduler.api.exceptions.ApiExceptionHandler:[45] - 创建租户错误 org.apache.hadoop.security.AccessControlException: Permission denied: userhdfs, accessWRITE, inode"/":root:supergroup:drw…

搭建自己的 new bing网站----nginx反代(群晖,全docker版)

文章目录 1.前言&#xff1a;2. 部署过程&#xff1a;2.1.部署go-proxy-bing 项目&#xff1a;2.1.部署nginx反代&#xff1a;这两步完成实际上就可以访问了&#xff0c; 3.部署聊天服务器&#xff1a;代表链接成功&#xff01; 1.前言&#xff1a; 本篇教程全萌新向&#xff…

Qt for Android 调试遇到问题总结

一、首次编译Downloading “Gradle” 无法下载导致编译无法完成问题 解决办法&#xff1a; 1、通过地址&#xff1a;https://services.gradle.org/distributions/gradle-5.5.1-bin.zip单独下载 2、再将下载的gradle-5.5.1-bin.zip放到“C:\Users\hp\.gradle\wrapper\dists\gr…

软件工程导论期末急救包(上)

目录 什么是软件工程&#xff1f;它的目标和内容是什么&#xff1f; 软件文档作用及包含 软件过程模型 瀑布模型 快速原型模型 增量模型 螺旋模型 喷泉模型 软件生存周期 需求分析阶段的基本任务是什么&#xff1f; 可行性研究的任务是什么&#xff1f; 软件是什…

MySQL——MySQL的图形化界面工具安装与使用

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 写在前面&#xff1a; 一.DataGrip安装使用 1). 找到下载准备好的安装包&am…

2023 最新 1200 道 JAVA 面试题,囊括面试所有硬核技能

Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。现如今&#xff0c;Java 面试的本质就是八股文&#xff0c;把八股文面试题背好&#xff0c;面试才有可能表现好。…

power gating/power switch/level shift/IR-drop

目录 1.power gating 2.level shift 3.IR-drop 1.power gating power gating 的设计重点如下&#xff1a; 1)Power Switch的设计&#xff1b; 2)Power Gating controller的设计&#xff1b; 3)retention register和isolation cell的选择及插入&#xff1b; 4)Power Gati…

【Pandas】pandas用法解析(一)

目录 一、生成数据表 1.导入pandas库 2.导入CSV或者xlsx文件 3.用pandas创建数据表 二、数据表信息查看 1.维度查看 2.数据表基本信息&#xff08;维度、列名称、数据格式、所占空间等&#xff09; 3.每一列数据的格式 4.某一列格式 5.空值判断 6.查看某一列空值 7…

使用torch的自动微分实现自定义函数优化

前言 目的是利用torch已经有的自动微分机制&#xff0c;进行参数迭代更新&#xff0c;就不用自己写代码算了。 文章目录 前言1. 待优化函数1.1 解释 2. 代码3. 结果 1. 待优化函数 y 10 ( x 1 x 2 − 5 ) 2 ( x 1 − x 2 ) 2 y10\times(x_1x_2-5)^2(x_1-x_2)^2 y10(x1​x…

oracle中如何修改日期类型的字段值

系列文章目录 文章目录 系列文章目录前言一、数据库表方式进行修改二、sql方式步骤总结 前言 Oracle是一家全球领先的数据库管理系统&#xff08;DBMS&#xff09;和企业软件公司。Oracle Corporation成立于1977年&#xff0c;总部位于美国加利福尼亚州的红木城&#xff08;Re…

SpringBoot整合篇

SpringBoot整合第三方技术 1、整合缓存 何为缓存&#xff1f; 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质使用缓存可以有效的减少低速数据读取过程的次数&#xff08;例如磁盘IO&#xff09;&#xff0c;提高系统性能缓存不仅可以用于提高永久性存储介…

腾讯云最新社招面经出炉(面试原题+答案解析)

前言 大家好&#xff0c;今天给大家分享一篇腾讯云的面经&#xff0c;以下是面试题和答案。加油&#xff0c;一起卷。 聊聊项目&#xff0c;好的设计&#xff0c;好的代码 谈谈什么是零拷贝&#xff1f; 一共有几种 IO 模型&#xff1f;NIO 和多路复用的区别&#xff1f; F…

Get请求参数过多导致请求失败

1. 问题 系统正常使用没有问题&#xff0c;但是有极个别的用户出现系统异常&#xff0c;通过日志发现某个get请求&#xff0c;传入的城市list太多&#xff0c;就会抛出异常 java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map。 2. 排查过程 …

Elasticsearch 安装(Linux)

ElasticSearch 概念安装安装es 后台启动 & 停止启动nohup 记录pid 停止 其他启动错误max number of threads内存不足 Cannot allocate memoryfailed to obtain node locks 概念 ES是一款分布式全文搜索引擎&#xff0c;基于Lucene&#xff0c;进行了二次封装&#xff0c;更…

ElasticSearch笔记02-ElasticSearch入门

ElasticSearch安装 下载软件 ElasticSearch的官网&#xff0c;视频教程里用的Version是7.8.0&#xff0c;所以&#xff0c;我们也是用7.8.0版本的ElasticSearch。 下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff0c;然后搜索…

车载诊断协议 —— 诊断服务Service 11

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 在最艰难的时候,自己就别去幻想太远的将来,只要鼓励自己过好今天就行了! 这世间有太多的猝不及防,有些东西根本不配占有自己的情绪,人生就是一场体验,…

一种栅格数据的空间聚类方法(ACA-Cluster)

本文结合实例详细讲解了如何使用Python对栅格数据进行空间聚类&#xff0c;关注公众号GeodataAnalysis&#xff0c;回复20230616获取示例数据和代码&#xff0c;包含整体的写作思路&#xff0c;上手运行一下代码更容易弄懂。 带有非空间属性的空间数据聚类分析是空间聚类研究的…

English Learning - L3 作业打卡 Lesson6 Day43 2023.6.16 周五

English Learning - L3 作业打卡 Lesson6 Day43 2023.6.16 周五 引言&#x1f349;句1: Thousands of lanterns slowly drift out to sea guiding the dead on their return journey to the other world.成分划分弱读连读爆破语调 &#x1f349;句2: This is a moving spectacl…

炎炎夏日!东南亚LazadaShopee泳衣品类热销榜单来袭

6月商机无限&#xff0c;趁热打铁&#xff01;3大节庆即将来袭。小编特为卖家整理了6月最强爆单选品指南&#xff0c;揭秘东南亚泳衣市场。赶紧一睹为快吧&#xff01; 炎炎夏日&#xff0c;马上即将迎来暑假&#xff0c;海边游玩肯定成了小朋友即家长们的首选之地&#xff0c…