找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6907|回复: 8
打印 上一主题 下一主题
收起左侧

单片机篮球计时计分系统仿真及程序 我的单片机课程设计

  [复制链接]
跳转到指定楼层
楼主
ID:201545 发表于 2017-5-17 17:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机新手来看看我做的课程设计, 篮球计时计分系统的proteus仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机篮球计时计分器源程序如下:
  1. /******************************************************************
  2. ***************************篮球计时计分系统************************
  3. *************************本系统满足以下几点要求********************
  4. *1、能设置整个赛程的比赛时间,在比赛过程中能根据需要暂停和开始计时*
  5. *2、能根据比赛情况刷新比赛双方的比分*******************************
  6. *3、中场交换比赛场地时,能交换A、B两队比分的位置*******************
  7. *4、比赛结束时,能发出报警声***************************************
  8. ******************************************************************/

  9. #include<reg52.h>
  10. #include<intrins.h>

  11. #define uchar                 unsigned char
  12. #define uint                 unsigned int

  13. uchar code HC595_ScanDATE[]=                //定义数码管位数组
  14. {
  15.         0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
  16. };

  17. unsigned char code LED_DATE [] =                //定义数码管段数组
  18. {
  19.         0XC0,        // 0
  20.         0XF9,        // 1
  21.         0XA4,        // 2
  22.         0XB0,        // 3        
  23.         0X99,        // 4
  24.         0X92,        // 5
  25.         0X82,        // 6        
  26.         0XF8,        // 7
  27.         0X80,        // 8
  28.         0X90        // 9
  29. };

  30. sbit DS                =P2^0;                        //74HC595各I/O口定义
  31. sbit SHCP        =P2^1;
  32. sbit STCP        =P2^2;

  33. sbit S2                =P3^2;                           //赛前设定比赛时间按键
  34. sbit S3                =P1^0;                        //加1分按键                                                                  
  35. sbit S4                =P1^1;                         //加2分按键
  36. sbit S5                =P1^2;                          //减1分按键
  37. sbit S6                =P1^3;                        //半场换分按键
  38. sbit S7                =P1^4;                          //停止蜂鸣器按键
  39. sbit S8                =P1^5;                         //开始按键
  40. sbit S9                =P1^6;                           //暂停/继续按键
  41. sbit S10        =P1^7;                          //加分减分队伍选择按键

  42. sbit LED2        =P3^5;        //A队指示灯
  43. sbit LED3        =P3^6;        //B队指示灯

  44. sbit BUZZ        =P3^7;
  45. bit Flag_Score=0;                //加分减分队伍选择标志位


  46. void Display();
  47. void HC595(uchar a);
  48. void Delay_MS(uint ms);
  49. void KEY();
  50. void Init();

  51. uint time=1200;                //初始时间20分钟
  52. uchar A_Score=0;                //A队得分
  53. uchar B_Score=0;                //B队得分
  54. uchar Time_bit=0;        //用于定时器溢出标志

  55. void main()
  56. {
  57.         Init();
  58.         while(1)
  59.                 {
  60.                         Display();
  61.                         KEY();
  62.                 }
  63. }

  64. void Init()                                         //初始化函数
  65. {
  66.         LED2=0;                                          
  67.         TMOD=0x01;                                //定时器0 第一种工作方式
  68.         TH0=(65536-50000)/256;        //装初值,定时50ms
  69.         TL0=(65536-50000)%256;
  70.         EA=1;                                        //开总中断
  71.         ET0=1;                                        //打开定时器0        
  72. }

  73. void Timer() interrupt 1           //定时器函数,时间处理
  74. {
  75.         Time_bit++;
  76.         if(Time_bit==20)                        //溢出20次,定时1秒
  77.                 {
  78.                         Time_bit=0;
  79.                         if(time==0)                //当比赛结束时,停止计时,并发出警报
  80.                                 {
  81.                                         BUZZ=0;
  82.                                         //time=0;
  83.                                         TR0=0;
  84.                                 }
  85.                         else
  86.                                 time--;
  87.                 }
  88.         TH0=(65536-50000)/256;        //重装初值,定时50ms
  89.         TL0=(65536-50000)%256;
  90. }

  91. void KEY()
  92. {
  93.         uchar Transposition_Scores=0;                //半场换分使用的缓存数据变量

  94.         if(S2==0)        //比赛时间设定,按一次加5分钟
  95.                 {
  96.                         Delay_MS(1000);
  97.                         if(S2==0)        
  98.                                 {
  99.                                         while(!S2);
  100.                                         if(TR0==0)        //判断是否开始,以免已经开始有误按
  101.                                                 {
  102.                                                         time=time+300;
  103.                                                         if(time>2700)                //如果时间超过45分钟,重新赋值20分钟
  104.                                                                 time=1200;
  105.                                                 }
  106.                                 }
  107.                 }

  108.         if(S3==0)        //加1分按键
  109.                 {
  110.                         Delay_MS(1000);
  111.                         if(S3==0)
  112.                                 {
  113.                                         if(TR0==1)                //判断是否开始,以免还未开始有误按
  114.                                                 {
  115.                                                         while(!S3);
  116.                                                         if(Flag_Score==0)
  117.                                                                         A_Score++;
  118.                                                         else
  119.                                                                         B_Score++;
  120.                                                 }
  121.                                 }
  122.                 }

  123.         if(S4==0)        //加2分按键
  124.                 {
  125.                         if(TR0==1)                //判断是否开始,以免还未开始有误按
  126.                                 {
  127.                                         Delay_MS(1000);
  128.                                         if(S4==0)
  129.                                                 {
  130.                                                         while(!S4);
  131.                                                         if(Flag_Score==0)
  132.                                                                         A_Score=A_Score+2;
  133.                                                         else
  134.                                                                         B_Score=B_Score+2;
  135.                                                 }
  136.                                 }
  137.                 }

  138.         if(S5==0)        //减1分按键
  139.                 {
  140.                         if(TR0==1)                //判断是否开始,以免还未开始有误按
  141.                                 {
  142.                                         Delay_MS(1000);
  143.                                         if(S5==0)
  144.                                                 {
  145.                                                         while(!S5);
  146.                                                         if(Flag_Score==0)
  147.                                                                 {
  148.                                                                         if(A_Score==0)                //防止分数是0时乱码
  149.                                                                                 A_Score=0;
  150.                                                                         else
  151.                                                                                 A_Score--;
  152.                                                                 }
  153.                                                         else
  154.                                                                 {
  155.                                                                         if(B_Score==0)                //防止分数是0时乱码
  156.                                                                                 B_Score=0;
  157.                                                                         else
  158.                                                                                 B_Score--;
  159.                                                                 }
  160.                                                 }
  161.                                 }
  162.                 }
  163.         
  164.         if(S6==0)        //半场换分
  165.                 {
  166.                         Delay_MS(1000);
  167.                         if(S6==0)
  168.                                 {
  169.                                         while(!S6);
  170.                                         Transposition_Scores=A_Score;        //A队的得分先赋给缓存变量
  171.                                         A_Score=B_Score;                                //将B队的得分赋给A队
  172.                                         B_Score=Transposition_Scores;        //再把缓存变量的值(也就是原先A队的得分)赋给B队
  173.                                 }
  174.                 }
  175.         
  176.         if(S7==0)        //停蜂鸣器
  177.                 {
  178.                         Delay_MS(1000);
  179.                         if(S7==0)
  180.                                 {
  181.                                         while(!S7);
  182.                                         BUZZ=1;
  183.                                 }
  184.                 }

  185.         if(S8==0)        //开始
  186.                 {
  187.                         Delay_MS(1000);
  188.                         if(S8==0)
  189.                                 {
  190.                                         while(!S8);
  191.                                         if(time==0)
  192.                                                 time=1200;        //一轮比赛结束后重新给时间赋值
  193.                                         TR0=1;                        //定时器开始工作
  194.                                 }
  195.                 }

  196.         if(S9==0)        //暂停继续
  197.                 {
  198.                         Delay_MS(1000);
  199.                         if(S9==0)
  200.                                 {
  201.                                         while(!S9);
  202.                                         TR0=~TR0;                        //定时器暂停/继续工作
  203.                                 }
  204.                 }

  205.         if(S10==0)        //切换加分减分队伍
  206.                 {
  207.                         Delay_MS(1000);
  208.                         if(S10==0)
  209.                                 {
  210.                                         while(!S10);
  211.                                         Flag_Score=~Flag_Score;
  212.                                         if(Flag_Score==0)
  213.                                                 {
  214.                                                         LED2=0;
  215.                                                         LED3=1;
  216.                                                 }
  217.                                         else
  218.                                                 {
  219.                                                         LED2=1;
  220.                                                         LED3=0;
  221.                                                 }
  222.                                 }
  223.                 }
  224.         
  225.         
  226. }


  227. void Display()        //显示函数
  228. {
  229.         P0=LED_DATE[time/1000];                //得出时间千位
  230.         HC595(HC595_ScanDATE[0]);
  231.         Delay_MS(500);
  232.         P0=0xff;                                //消隐
  233.         P0=LED_DATE[time%1000/100];        //得出时间百位
  234.         HC595(HC595_ScanDATE[1]);
  235.         Delay_MS(500);
  236.         P0=0xff;                                //消隐
  237.         P0=LED_DATE[time%100/10];                //得出时间十位
  238.         HC595(HC595_ScanDATE[2]);
  239.         Delay_MS(500);
  240.         P0=0xff;                                //消隐
  241.         P0=LED_DATE[time%10];                        //得出时间最个位
  242.         HC595(HC595_ScanDATE[3]);
  243.         Delay_MS(500);
  244.         P0=0xff;                                //消隐

  245.         P0=LED_DATE[A_Score/10];                //得出A队得分十位
  246.         HC595(HC595_ScanDATE[4]);
  247.         Delay_MS(500);
  248.         P0=0xff;                                //消隐
  249.         P0=LED_DATE[A_Score%10];                //得出A队得分个位
  250.         HC595(HC595_ScanDATE[5]);
  251.         Delay_MS(500);
  252.         P0=0xff;                                //消隐

  253.         P0=LED_DATE[B_Score/10];                //得出B队得分十位
  254.         HC595(HC595_ScanDATE[6]);
  255. ……………………

  256. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载(带仿真图与源码):
篮球计分系统.zip (104.14 KB, 下载次数: 162)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:207654 发表于 2017-6-6 22:48 来自手机 | 只看该作者
太棒了 解压来就可以用 帮我解决了大问题呢  不过对我而言好难呀 程序解读都有问题
已经做出实物详见:http://www.51hei.com/bbs/dpj-88757-1.html

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:261201 发表于 2017-12-18 19:46 | 只看该作者
楼主,这个倒数  不是一分钟倒数。。1200之后它就是1199了,应该是1159才对。你设置的TIME没有除以60分钟来算

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:386553 发表于 2018-10-7 18:32 | 只看该作者
楼主,DSN文件打不开
回复

使用道具 举报

5#
ID:447027 发表于 2018-12-15 23:31 | 只看该作者
出现了Time :undefine identifier报错该怎么办啊
回复

使用道具 举报

6#
ID:565728 发表于 2019-6-18 15:40 | 只看该作者
怎么修改时间 从1199 改成1159啊
回复

使用道具 举报

7#
ID:756455 发表于 2020-6-7 21:05 | 只看该作者
怎么修改时间 从1199 改成1159啊
回复

使用道具 举报

8#
ID:1079527 发表于 2023-5-24 10:36 | 只看该作者

楼主,DSN文件打不开
回复

使用道具 举报

9#
ID:262 发表于 2023-5-24 15:42 | 只看该作者
xiangruyimo 发表于 2023-5-24 10:36
楼主,DSN文件打不开

Proteus8.13版本的工程.7z (24.26 KB, 下载次数: 4)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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