51单片机编程应用(C语言):篮球比赛计分器

2024-02-09 06:52

本文主要是介绍51单片机编程应用(C语言):篮球比赛计分器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设计思路

1.LCD1602显示A 000:B 000     右下角显示24的数字,显示一节时间12:00.

2.规定矩阵键盘每一位表示的含义

s1按下,A队加一分     s2按下,A队加两分   s3按下,A队加三分    s4按下,A队减一分

如果加错了,减分修改错误计分,一分一分修改。

s5按下,B队加一分     s6按下,B队加两分   s7按下,B队加三分    s8按下,B队减一分

如果加错了,减分修改错误计分,一分一分修改。

S9:    控制比赛计时时间,第一次按下,比赛开始,再一次按下,时间暂停。(篮球比赛是不是可以叫暂停,暂停时比赛时间是不能计时的)

S10: 按下24秒重新开始计时(暂停时,我想要变回24s)

3.定时器中断,控制24秒一秒一秒减。,一节时间也是一秒一秒的减少。12:00—11:59—10:00—09:59.........

4.篮球比赛进球了,此时24秒无论计时到多少是不是要重新变成24秒。也就是S1--S8按下,24秒重新计时。

看一下任务要求:

 具体任务要求:

1、能显示2个队的当前比分;(完成)

2、根据各自得分情况进行加1、2、3分,可按键修改错误计分(如2分被计为3分);(完成)

3、显示当前进攻队的进攻时间倒计(24秒);(完成)

4、计时归零时候,鸣响。(要用蜂鸣器)(完成一半)24秒计完时会鸣叫,但是时间计完时加入蜂鸣器鸣叫后出现了问题,很奇怪的bug,直接加了00在秒个后面,所以这一部分我暂时没有添加,后面我再想清楚原因弄好后再添加。

蜂鸣器

 根据蜂鸣器发声方式不同,主要分为压电式(无源)和电磁式(有源)。同时根据蜂鸣器结构,分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器自带震荡电路,接通电源即可发声。无源没有震荡电路

振荡器电路的作用:产生脉冲信号。

无源蜂鸣器 需要提供一定频率的脉冲信号才能发声,频率一般在 1.5-5KHZ

通过调节脉冲频率可改变音调(音色),通过改变高低电平占空比可以调节音量。

51单片机使用的是无源蜂鸣器。

蜂鸣器原理图

通过C51芯片的P15引脚持续输出脉冲信号(即高低电平交替),经过ULN2003D芯片放大电流从BEEP引脚输出到蜂鸣器即可发声 

注意P2^5引脚同时控制着LED6,当脉冲信号在一定频率时,可以观察到LED6的闪烁,这就是为什么在LED实验中会有滴答滴答的声音。

实验:

让蜂鸣器发出声音,一段时间后再关闭,即让管脚输出一定频率的脉冲信号(高低电平)控制无源蜂鸣器。

代码如下:

#include <REGX52.H>typedef unsigned char u8;
typedef unsigned int u16;sbit BEEP=P2^5;void delay_10us(u16 i)//i为1时,大约延时10us
{while(i--);
}void main()
{u16 i=2000;while(1){while(i--){BEEP=!BEEP;delay_10us(100);}i=0;//结束循环BEEP=1;//关闭第六个LED}
}

篮球计分器总代码

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"
sbit BEEP=P2^5;
unsigned char number=24;//24秒倒计时
unsigned char min_shi=1;    //一节12分钟,分钟的十位
unsigned char min_ge=2 ;   //一节12分钟,分钟的个位
unsigned char miao_shi=0 ;   //一节12分钟,秒钟的十位
unsigned char miao_ge=0;    //一节12分钟,秒钟的个位
unsigned char keyNumber;    //接收矩阵键盘返回的值
unsigned char score_A;    //A队的分数,3位
unsigned char score_B;    //B队的分数,3位
unsigned char Mode=1;    //Mode=1,比赛暂停,Mode=0,比赛开始。
unsigned int i=2000;    //蜂鸣器报警时长。
void main()
{Timer0Init();LCD_Init();LCD_ShowChar(1,1,'A');LCD_ShowChar(1,2,' ');LCD_ShowChar(1,6,':');LCD_ShowChar(1,7,'B');LCD_ShowChar(1,8,' ');LCD_ShowChar(2,3,':');while(1){keyNumber=MatrixKey();LCD_ShowNum(1,3,score_A,3);LCD_ShowNum(1,9,score_B,3);LCD_ShowNum(2,15,number,2);LCD_ShowNum(2,1,min_shi,1);LCD_ShowNum(2,2,min_ge,1);LCD_ShowNum(2,4,miao_shi,1);LCD_ShowNum(2,5,miao_ge,1);if(keyNumber){if(keyNumber==1)//s1按下,A队加一分{score_A++;number=24;LCD_ShowNum(1,3,score_A,3);//更新显示LCD_ShowNum(2,15,number,2);//更新显示}if(keyNumber==2)//s2按下,A队加两分{score_A=score_A+2;number=24;LCD_ShowNum(1,3,score_A,3);//更新显示LCD_ShowNum(2,15,number,2);//更新显示}if(keyNumber==3)//s3按下,A队加三分{number=24;score_A=score_A+3;LCD_ShowNum(1,3,score_A,3);//更新显示LCD_ShowNum(2,15,number,2);//更新显示}if(keyNumber==4)//s4按下,A队减一分   如果加错了,减分修改错误计分,一分一分修改{score_A=score_A-1;LCD_ShowNum(1,3,score_A,3);//更新显示}if(keyNumber==5)//s1按下,B队加一分{number=24;score_B++;LCD_ShowNum(1,9,score_B,3);//更新显示LCD_ShowNum(2,15,number,2);//更新显示}if(keyNumber==6)//s2按下,A队加两分{number=24;score_B=score_B+2;LCD_ShowNum(1,9,score_B,3);//更新显示LCD_ShowNum(2,15,number,2);//更新显示}if(keyNumber==7)//s3按下,A队加三分{number=24;score_B=score_B+3;LCD_ShowNum(1,9,score_B,3);//更新显示LCD_ShowNum(2,15,number,2);//更新显示}if(keyNumber==8)//s3按下,A队减一分   如果加错了,减分修改错误计分,一分一分修改{score_B=score_B-1;LCD_ShowNum(1,9,score_B,3);//更新显示}if(keyNumber==9){Mode++;if(Mode>=2)Mode=0;}if(keyNumber==10){number=24;LCD_ShowNum(1,9,score_B,3);//更新显示}}}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18;		//设置定时初值TH0 = 0xFC;		//设置定时初值T0Count++;if(T0Count>=1000)	//定时器分频,1s{T0Count=0;//number=number-1;if(Mode==0){if(number==0){number=25;while(i--){BEEP=!BEEP;Delay(1);}i=2000;BEEP=1;//关闭第六个LED}number=number-1;if(miao_ge==0){miao_ge=10;if(miao_shi==0){if(min_ge==0){min_shi=0;  min_ge=10;}min_ge=min_ge-1;miao_shi=6;}miao_shi=miao_shi-1;}miao_ge= miao_ge-1;}}
}

除了main函数外,其他函数都是模块化编程好的,都在我写过的易于模块化编程函数里面直接复制粘贴就OK了,如:

实验现象我会录制视频,请在视频观看 

这篇关于51单片机编程应用(C语言):篮球比赛计分器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693450

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em