找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13436|回复: 18
收起左侧

单片机篮球比赛计时计分器程序、仿真、原理图 程序流程图 LCD1602显示

  [复制链接]
ID:524923 发表于 2021-12-19 17:43 | 显示全部楼层 |阅读模式
计分系统:
(1)分为“A队”和“B队”的“3分”,“2分”,“1分”各六个按键输入部分,以及两队比分的LED显示部分。在每次增加分数的同时,“24秒”计时恢复为初始值,“12分钟”计时暂停,等待比赛的继续进行
计时系统:
(1)比赛开始/继续:当“比赛开始/继续”键按下后,“24s”和“12分钟”计时器开始倒计时;
(2)手动24s复位:当“24s复位” 键按下后,“24s”倒计时恢复初始值,“12分钟”倒计时暂停,等待比赛的继续;
(3)比赛暂停:“比赛暂停”键按下后,“24s”倒计时和“12分钟”倒计时均暂停,等待比赛的继续进行;
(4)自动增加比赛节数:当“12分钟”倒计时完成后,判断当前节数是否为最后一节,若不是,则节数自动增加,并“12分钟”和“24s”均恢复默认值,等待下一节比赛的进行。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.gif

仿真图

仿真图


程序例程图:
按键控制部分流程图.png 计时部分流程图.png 主程序流程图.png

主函数程序如下
  1. #include"KeyBord.h"
  2. #include"LCD1602.h"
  3. #include"Timer.h"

  4. sbit Beep = P1^5;

  5. char rule_time = 24;   //24S规则

  6. unsigned int A_Score = 0;       //A队分数
  7. unsigned int B_Score = 0;       //B队分数
  8. unsigned char match = 1;        //比赛节数
  9. unsigned char rule_flag = 0;    //记录24S规则是否启用
  10. unsigned char Beep_flag =0 ;    //判断蜂鸣器是否报警
  11. unsigned char Start_flag = 0;   //开始标志位

  12. unsigned char Time_Data[4];    //数组用于存放处理的设定时间
  13. unsigned char Score[6];        //用于存储处理的比赛分数
  14. unsigned char Temp[4];         //用于存储处理的比赛节数和24S规则

  15. void Key_Control();

  16. void main()
  17. {  
  18.     Beep_flag = 1;            //蜂鸣器报警启用
  19.         LCD_Init();
  20.     Timer0_Init();

  21.     while(1)
  22.     {
  23.         Key_Control();

  24.         Time_Data[0] = '0' + minute / 10;     //赛程时间 分 十位
  25.         Time_Data[1] = '0' + minute % 10;     //赛程时间 分 个位
  26.         Time_Data[2] = '0' + second / 10;     //赛程时间 秒 十位
  27.         Time_Data[3] = '0' + second % 10;     //赛程时间 秒 个位

  28.         Temp[0] = '0' + match / 10;           //赛程节数   十位
  29.         Temp[1] = '0' + match % 10;           //赛程节数   个位
  30.         Temp[2] = '0' + rule_time / 10;       //24秒倒计时 十位
  31.         Temp[3] = '0' + rule_time % 10;       //24秒倒计时 个位

  32.         Score[0] = '0' + A_Score / 100;         //A队分数 百位
  33.         Score[1] = '0' + A_Score % 100 / 10;    //A队分数 十位
  34.         Score[2] = '0' + A_Score % 100 % 10;    //A队分数 个位
  35.         Score[3] = '0' + B_Score / 100;         //B队分数 百位
  36.         Score[4] = '0' + B_Score % 100 / 10;    //B队分数 十位
  37.         Score[5] = '0' + B_Score % 100 % 10;    //B队分数 个位

  38.         LCD_Write_Str(1,0,"H.T");               //对应的位置显示
  39.         LCD_Write_Char(5,0,Score[0]);
  40.         LCD_Write_Char(6,0,Score[1]);
  41.         LCD_Write_Char(7,0,Score[2]);
  42.         LCD_Write_Str(8,0,":");
  43.         LCD_Write_Char(9,0,Score[3]);
  44.         LCD_Write_Char(10,0,Score[4]);
  45.         LCD_Write_Char(11,0,Score[5]);
  46.         LCD_Write_Str(13,0,"R.T");

  47.         LCD_Write_Char(0,1,Time_Data[0]);
  48.         LCD_Write_Char(1,1,Time_Data[1]);
  49.         LCD_Write_Str(2,1,":");
  50.         LCD_Write_Char(3,1,Time_Data[2]);
  51.         LCD_Write_Char(4,1,Time_Data[3]);
  52.         LCD_Write_Str(6,1,"SEC-");
  53.         LCD_Write_Char(10,1,Temp[0]);
  54.         LCD_Write_Char(11,1,Temp[1]);
  55.         LCD_Write_Char(13,1,Temp[2]);
  56.         LCD_Write_Char(14,1,Temp[3]);

  57.         if(second < 0)
  58.         {
  59.             if(minute == 0)       //判断某节点是否结束
  60.             {
  61.                 if(match < MATCH)      //判断是否为最后一节比赛
  62.                 {
  63.                     //计时系统恢复为默认值,比赛节数加一
  64.                     match++;      
  65.                     minute = SET_TIME;
  66.                     rule_time = RULE_TIME;     
  67.                     second = 0;
  68.                 }
  69.                 else
  70.                 {
  71.                     second = 0;
  72.                 }
  73.                 TR0 = 0;     //停止时钟,等待下一次比赛开始

  74.                 while(Beep_flag)
  75.                 {
  76.                     Key_Control();
  77.                     Beep = ~Beep;    //板子为无源蜂鸣器
  78.                     DelayUs2x(10);
  79.                 }
  80.   
  81.             }
  82.             else
  83.             {
  84.                 second = 59;
  85.                 minute--;
  86.             }
  87.         }
  88.         
  89.         if(rule_time < 0 && rule_flag)      //24秒结束,球未出手,计时器暂停,24秒复位
  90.         {
  91.             TR0 = 0;
  92.             rule_time = RULE_TIME;
  93.         }
  94.     }
  95. }

  96. /*========================================
  97. 函数名称:Key_Control
  98. 函数功能:按键控制,每个按键对应功能
  99. =========================================*/
  100. void Key_Control()
  101. {
  102.         switch(KeyScan())
  103.         {
  104.                 case 0x77:            //比赛开始/继续
  105.             TR0 = 1;             //定时器开关打开,开始计时
  106.             rule_flag = 1;      //24S规则启用
  107.             Beep_flag = 1;      //蜂鸣器报警启用
  108.             break;

  109.                 case 0xb7:            //比赛暂停
  110.             TR0 = 0;          //定时器开关打开,停止计时
  111.             break;

  112.                 case 0x7b:             //手动24S倒计时复位
  113.             if(TR0 == 1)
  114.             {
  115.                 rule_time = 0;      //24秒清零,等待下次球权
  116.                 rule_flag = 0;      //24秒功能停用

  117.             }
  118.             else
  119.             {
  120.                 rule_flag = 0;      ////24秒功能停用

  121.             }
  122.             break;

  123.                 case 0xbb:             //增加比赛节数,同时总计时器和24秒复位
  124.             if((match >= MATCH) && (minute == 0))     //判断比赛结束是否超过四节以及此节比赛是否结束
  125.             {  
  126.                 TR0 = 0;                   //定时器停止
  127.                 match++;                   //赛程节数加一
  128.                 minute = 5;                //加时赛赛程时间设置 5分钟
  129.                 second = 0;
  130.                 rule_time = RULE_TIME;     //24秒恢复初值
  131.                 rule_flag = 0;

  132.             }
  133.             break;

  134.                 case 0xdb:
  135.             Beep_flag = 0;      //关闭蜂鸣器
  136.             break;
  137.                                            //每队加分后赛程停止计时,24秒恢复初值,等待比赛继续开始
  138.                 case 0x7d:                         //A队加3分
  139.             TR0 = 0;
  140.             A_Score += 3;                 
  141.             rule_time = RULE_TIME;
  142.             rule_flag = 0;
  143.             break;

  144.                 case 0xbd:                         //A队加2分
  145.             TR0 = 0;
  146.             A_Score += 2;
  147.             rule_time = RULE_TIME;
  148.             rule_flag = 0;
  149.             break;   
  150.                                  
  151.                 case 0xdd:                         //A队加1分
  152.             TR0 = 0;
  153.             A_Score += 1;
  154.             rule_time = RULE_TIME;
  155.             rule_flag = 0;
  156.             break;

  157.                 case 0x7e:                         //B队加3分
  158.             TR0 = 0;
  159.             B_Score += 3;
  160.             rule_time = RULE_TIME;
  161.             rule_flag = 0;
  162.             break;

  163.                 case 0xbe:                         //B队加2分
  164.             TR0 = 0;
  165.             B_Score += 2;
  166.             rule_time = RULE_TIME;
  167.             rule_flag = 0;
  168.             break;

  169.                 case 0xde:                         //B队加1分
  170.             TR0 = 0;
  171.             B_Score += 1;
  172.             rule_time = RULE_TIME;
  173.             rule_flag = 0;
  174.             break;

  175.                 default:break;      
  176.         }
  177. }
复制代码

Keil代码与Proteus仿真下载: 篮球计时计分器.7z (479.77 KB, 下载次数: 276)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1043798 发表于 2022-9-4 21:37 | 显示全部楼层
为什么仿真启动了,但是屏幕还是不显示数字呀
2022-09-04 (1).png
回复

使用道具 举报

ID:262 发表于 2022-9-4 22:19 | 显示全部楼层
回楼上,需要用Proteus8.8来打开仿真工程,你看我的打开效果
51hei.png
回复

使用道具 举报

ID:1043798 发表于 2022-9-5 10:23 | 显示全部楼层
heicad 发表于 2022-9-4 22:19
回楼上,需要用Proteus8.8来打开仿真工程,你看我的打开效果

Proteus8.9可以吗
回复

使用道具 举报

ID:348664 发表于 2022-9-6 10:41 | 显示全部楼层
heicad 发表于 2022-9-4 22:19
回楼上,需要用Proteus8.8来打开仿真工程,你看我的打开效果

我也是8.8的,但是遇到了不显示同样的问题
回复

使用道具 举报

ID:348664 发表于 2022-9-6 10:51 | 显示全部楼层
abc4 发表于 2022-9-5 10:23
Proteus8.9可以吗

好了,我解决了,因为我也是刚开始看,估计有个编译的东西,一直没找到,然后发现左下角有个开始运行的开关
回复

使用道具 举报

ID:1019424 发表于 2022-12-5 18:52 | 显示全部楼层
为什么我下进了开发板内,没法用?
回复

使用道具 举报

ID:262 发表于 2022-12-5 21:40 | 显示全部楼层
六六哥 发表于 2022-12-5 18:52
为什么我下进了开发板内,没法用?

你的电路有问题吧,以仿真电路为准 改造你的单片机开发板,错一根线都不行的....再就是每一个厂家的1602的延时可能不同 修改你的延时 慢慢调试
回复

使用道具 举报

ID:1019424 发表于 2022-12-6 15:47 | 显示全部楼层
heicad 发表于 2022-12-5 21:40
你的电路有问题吧,以仿真电路为准 改造你的单片机开发板,错一根线都不行的....再就是每一个厂家的1602的 ...

里面有那个引脚接线图,跟我开发板一样,就是不好用,160什么也不显示
回复

使用道具 举报

ID:1019424 发表于 2022-12-6 16:19 | 显示全部楼层
92A1A16B800FF14B0AA2990EB13B7FBA.jpg RDWX)WG0G$OK)$U6[S{_]0X.png 这是我的开发板实物跟原理图,哪位大佬帮忙检查一下。
回复

使用道具 举报

ID:1019424 发表于 2022-12-6 16:20 | 显示全部楼层
heicad 发表于 2022-12-5 21:40
你的电路有问题吧,以仿真电路为准 改造你的单片机开发板,错一根线都不行的....再就是每一个厂家的1602的 ...

大佬教一下,该怎么搞
回复

使用道具 举报

ID:262 发表于 2022-12-6 16:22 | 显示全部楼层
仿真通过基本可以排除是软件问题
既然你确定你的接线和延时没有问题 那就只有一个可能:硬件坏掉了 用替换法 逐个排除掉
开发板不适合初学者做板载例程以外的其他项目,因为线太多容易搞错,器件相互串扰,影响 还未入门的初学者难以察觉..  你用最小系统重做一个吧,我还是怀疑你电路接线和楼主不同,因为从概率上来说,遇到一模一样电路的可能性微乎其微,一般运气没这么好到爆棚的
回复

使用道具 举报

ID:1056078 发表于 2022-12-6 17:24 | 显示全部楼层
为什么我下进51中,显示有问题
回复

使用道具 举报

ID:1076156 发表于 2023-5-8 21:17 | 显示全部楼层
hiccup 发表于 2022-9-6 10:41
我也是8.8的,但是遇到了不显示同样的问题

我的也不显示,可以教我一下吗
回复

使用道具 举报

ID:1097248 发表于 2023-11-10 15:16 | 显示全部楼层
为什么用protues8.9版本,蜂鸣器不响?有大佬可以解释一下吗?
回复

使用道具 举报

ID:1101896 发表于 2023-12-3 11:57 | 显示全部楼层
为什么我用8.0点进去就闪退啊
回复

使用道具 举报

ID:1104747 发表于 2023-12-24 21:21 | 显示全部楼层
我的也显示不了,8.9的是不是不行丫
回复

使用道具 举报

ID:1107170 发表于 2023-12-30 16:07 来自触屏版 | 显示全部楼层
为什么代码一样,但第一行就报错了,sbit Beep=P1^5,P1未定义
回复

使用道具 举报

ID:1124247 发表于 2024-6-8 15:17 来自触屏版 | 显示全部楼层
hiccup 发表于 2022-9-6 10:51
好了,我解决了,因为我也是刚开始看,估计有个编译的东西,一直没找到,然后发现左下角有个开始运行的开 ...

怎么整得,我也是能运行不显示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表