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

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使