适合普中的51开发板,也可以用与自己的课设,工程链接失效了记得1185956143@qq.com

 代码,原理图PCB链接

http://链接:https://pan.baidu.com/s/1wlO2PWfKxHYvJptkxQI93w 提取码:2uhq --来自百度网盘超级会员V3的分享

篮球场计分板
要求:
开机1602显示:

两个按键实现A队的分数加减
两个按键实现B队的分数加减
一个启动键一个暂停键一个按键控制节数一个复位键
(1)开机数码管显示单节比赛时间12分00秒;
(2)矩阵键盘,sw1负责启动,倒计时开始; sw2暂停,sw3清零,清零后显示比赛时间12分00秒,LED显示也清零。
(3)设定每队每次进攻时间为24秒时间,当24秒时间到,进攻方违例,报警LED1~LED3闪烁三次,比赛时间暂停,换方开球进攻并启动计时时间;
(4)单节比赛结束4位数码管闪烁。
(5)进球:分A、B两队进球,两个按键分别表示得分,例如当A队进分球则按下A-SW三下分数加3分,当B队进分球则按下B-SW两下分数加2分 有问题可以加Q3492181286

主函数

#include <REGX52.H>
#include "Delay.h"                    //包含Delay头文件
#include "Nixie.h"                    //包含数码管头文件
#include "MatrixKey.h"            //矩阵按键头文件
#include "LCD1602.h"            //液晶屏头文件
#define NixieTable                 //定义数码管unsigned int a=0,i,b=0;           //a,b分别为A,B队分数,i为节数
unsigned char KeyNum;             //键盘
int min=12;sec=0;sec_24=24;  //开机显示void Timer1Init()                            //定时器方式1
{TMOD|=0X10;TH1=0XFC;TL1=0X18;    ET1=1;EA=1;TR1=1;
}
void main()
{Timer1Init();                          //定时器初始化LCD_Init();                                        //LCD初始化LCD_ShowChar(1,2,'A');                //在1行1列显示字符ALCD_ShowString(1,8,"VS");            //在1行8列显示字符串VSLCD_ShowChar(1,15,'B');                //在1行14列显示字符BLCD_ShowNum(2,14,b,3);                //在LCD的2行14列显示b,长度为3位LCD_ShowNum(2,1,a,3);                    //在LCD的2行14列显示a,长度为3位LCD_ShowNum(2,8,i,1);                    //在LCD的2行8列显示i,长度为1位TR1=0;while(1){        Nixie(1,min/10);        //在数码管的第1位置显示1Nixie(2,min%10);        //在数码管的第2位置显示2    Nixie(3,sec/10);        //在数码管的第3位置显示0Nixie(4,sec%10);        //在数码管的第4位置显示0    Nixie(5,sec_24/10);    //在数码管的第5位置显示2Nixie(6,sec_24%10);    //在数码管的第6位置显示4KeyNum=MatrixKey();if(KeyNum){if(KeyNum==1)    //启动{TR1=1;}if(KeyNum==2)   //按键2按下比赛时间暂停{TR1=0;        }if(KeyNum==3)  //按键3按下比赛时间复位{min=12;sec=0;sec_24=24;}if(KeyNum==5)   //按键5按下A队分数加1{LCD_ShowNum(2,1,a=a+1,3);}while(KeyNum==5);if(KeyNum==6)   //按键6按下B队分数加1{LCD_ShowNum(2,14,b=b+1,3);}while(KeyNum==6);if(KeyNum==4)   //按键4按下节数1{LCD_ShowNum(2,8,i=i+1,1);}while(KeyNum==4);                                }if(sec_24==0)        //24秒违规后led闪烁三次{TR1=0;sec_24=24;P2_3=1;P2_1=1;P2_2=1;Delay(500);P2_3=0;P2_1=0;P2_2=0;Delay(500);P2_3=1;P2_1=1;P2_2=1;Delay(500);P2_3=0;P2_1=0;P2_2=0;Delay(500);P2_3=1;P2_1=1;P2_2=1;Delay(500);P2_3=0;P2_1=0;P2_2=0;Delay(500);}    if(min==0)         //12分钟后lcd清零{LCD_ShowNum(2,1,0,3);LCD_ShowNum(2,14,0,3);LCD_ShowNum(2,8,0,1);P0=0;P0=1;Delay(500);P0=0;P0=1;Delay(500);}}
}void Timer1() interrupt 3    //实现数码管时间变化
{    unsigned int i;TH1=0XFC;    TL1=0X18;i++;                 //以上四行为一秒的函数if(i==1000)          //1000次计次时间为1秒{i=0;sec--;sec_24--;    //秒自减}    if(sec==0)  {sec=59;min--;    //分自减}
}

延时函数<Delay.c>

//延时子函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}

<Delay.h>

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

数码管配置函数<Nixie.c>

#include <REGX52.H>
#include "Delay.h"    //包含Delay头文件//数码管段码表
unsigned char NixieTable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管显示子函数
void Nixie(unsigned char Location,Number)
{switch(Location)        //位码输出{case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];    //段码输出Delay(1);                //显示一段时间P0=0x00;                //段码清0,消影
}

<Nixie.h>

#ifndef __NIXIE_H__
#define __NIXIE_H__void Nixie(unsigned char Location,Number);#endif

矩阵按键<Key.c>

#include <REGX52.H>
#include "Delay.h"/*** @brief  矩阵键盘读取按键键码* @param  无* @retval KeyNumber 按下按键的键码值如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0*/
unsigned char MatrixKey()
{unsigned char KeyNumber=0;P1=0xFF;P1_3=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}P1=0xFF;P1_2=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}P1=0xFF;P1_1=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}P1=0xFF;P1_0=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}return KeyNumber;
}

<Key.h>

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif

LCD1602.c

#include <REGX52.H>//引脚定义
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DataPort P0/*** @brief  LCD1602延时函数,12MHz调用可延时1ms* @param  无* @retval 无*/
void LCD_Delay()        //@12.000MHz 1ms
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief  LCD1602写命令* @param  Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief  LCD1602写数据* @param  Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_E=1;LCD_Delay();LCD_E=0;LCD_Delay();
}/*** @brief  LCD1602初始化函数* @param  无* @retval 无*/
void LCD_Init(void)
{LCD_WriteCommand(0x38);LCD_WriteCommand(0x0C);LCD_WriteCommand(0x06);LCD_WriteCommand(0x01);
}/*** @brief  LCD1602设置光标位置* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else{LCD_WriteCommand(0x80|(Column-1)+0x40);}
}/*** @brief  在LCD1602指定位置上显示一个字符* @param  Line 行位置,范围:1~2* @param  Column 列位置,范围:1~16* @param  Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief  在LCD1602指定位置开始显示所给字符串* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief  返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief  在LCD1602指定位置开始显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~65535* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);}
}/*** @brief  在LCD1602指定位置开始以有符号十进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:-32768~32767* @param  Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);}
}/*** @brief  在LCD1602指定位置开始以十六进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~0xFFFF* @param  Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;unsigned char SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData('0'+SingleNumber);}else{LCD_WriteData('A'+SingleNumber-10);}}
}/*** @brief  在LCD1602指定位置开始以二进制显示所给数字* @param  Line 起始行位置,范围:1~2* @param  Column 起始列位置,范围:1~16* @param  Number 要显示的数字,范围:0~1111 1111 1111 1111* @param  Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);}
}

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__void LCD_Init(void);
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endif

篮球计分板课设,模块化LCD1602,数码管,矩阵按键,方便移植,使得主函数简洁明了相关推荐

  1. 计组课设:单周期31条MIPS指令CPU设计(含代码)

    多周期54条CPU:计组课设:多周期54条MIPS指令CPU设计(含代码)_孔艺菲的博客-CSDN博客 单周期CPU源码:while-TuRe/Single-cycle-CPU31 (github.c ...

  2. 记大学计网课设——基于B/S架构的视频点播系统设计

    中南大学 计算机网络课程设计报告 题    目 基于WEB的视频点播系统设计 学生姓名 指导教师 学    院 信息科学与工程学院 专业班级 二○一七 年 九 月 目录 一.需求分析...5 1.题目 ...

  3. 电子邮件客户端程序设计与实现 c++ 计网课设

    电子邮件客户端程序设计与实现 C++实现 telnet功能启用 用telnet发送电子邮件 总结一下这次课设,内附代码. 这次课设尝试过一些别人的代码,一些是不能自定义标题和内容, 有一些更直接,连发 ...

  4. 计网课设 模拟实验拓扑

    一:前言 幸福的是考完两科了,抽出时间赶紧赶赶课设,两周遇到了好多事,开心的,烦心的,一堆堆的压过来,但庆幸自己迷失不太久,又能继续学习了 二:实验概览 1:实验拓扑图 2:实验要求 要求:route ...

  5. 【计网课设】---网络工程方向---医院局域网规划方案

    前言: 自己大二做的课程设计,用了Cisco Packet Tracer画拓扑图,用画图工具亿图绘制网络地图,excel记录了一些IP地址等信息,word记录课设总结.一些地方也不是很完善,不能符合实 ...

  6. 2022山东大学软件学院计算机组成与课程设计(计组课设)分享防踩坑

    目录 课程主要内容 课程时间: 学分: 小Tips: 经验分享: 关于地址写入的简单介绍 关于脉冲速度调节 关于清零端的问题 踩坑注意事项: 一些具体实验器件的介绍: 总图的介绍: 选择器: IR指令 ...

  7. Android jetpack 篮球计分板的实现

    使用到了DataBinding+ViewModel+LiveData 这里是分数 小小遗憾就是撤回也只能撤回上一次的数据 但是完善这个功能不是重点 重点是..jetpack的使用 package co ...

  8. 超超超超超详细的计网课设报告-简单电子邮件客户端的设计与实现

    简单电子邮件客户端的设计与实现 目录 题 目: 简单电子邮件客户端的设计与实现- 1 一. 设计背景- 1 二. 设计内容及目的- 1 三. 设计环境- 2 四. 预备知识- 2 五. 设计思路- 6 ...

  9. 计网课设(智能酒店客房)

    网盘源码超链接,提取码:jw67 题目要求: 实现一个基于socket的物联网服务器,接收来自客户端的数据.实现一个物联网客户 端,模拟设备.客户端产生数据,发送至服务器, 服务器根据协议对数据作出处 ...

最新文章

  1. 优秀的数据分析师应该具备哪些技能和特质?
  2. java set第n位_Java学习路线:float在内存中的存储
  3. redis主从复制部署策略+jedis设置主从
  4. 数据结构 —— 树状数组
  5. 模块(module)
  6. Go实现简单负载均衡
  7. 万字长文,SpringSecurity
  8. ajax中data传参报错
  9. 【es】es 写入流程
  10. OC高效率52之提供“全能初始化”方法
  11. Linux内核中的信号量解析
  12. Java前端如何发送date类型的参数给后端
  13. 在Android的Termux超级终端下进行内网穿透
  14. AndroidSDK和ADT下载地址
  15. 烽火服务器查询服务器型号,烽火服务器应该起的进程
  16. 静态路由配置(目的下一跳)
  17. openbsd mysql_在OpenBSD上运行MyDNSNameservers(MySQL / PHP + MyDNS + MyDNSConfig)
  18. JavaScript 之 学习网站推荐 强推【javascript.info】
  19. 这是一份优秀的餐饮行业微信营销解决方案
  20. 补天漏洞响应平台基本介绍

热门文章

  1. 云米冰箱能控制扫地机器人_在云米的大屏冰箱就能操控其他智能家电?一起到京东618了解更多...
  2. isis-概述及实验
  3. 数字电路实验怎么接线视频讲解_时间继电器怎么看图接线?这可是星三角接触器接线必备元件...
  4. VS Code-SynthWave '84主题与字体霓虹灯(发光)效果 小白安装教程
  5. MDK5 Kil5中STM32工程的建立过程
  6. mysql中ddl和ddm_对话DDM:分布式数据库中间件全解析
  7. PHP正则中的i,m,s,x,e分别表示什么
  8. java zip 压缩工具类
  9. 零点城市社交电商v2.1.8.0
  10. 论文写作步骤和技巧梳理