找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机篮球计分器

[复制链接]
跳转到指定楼层
楼主
ID:205021 发表于 2017-5-26 10:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • /******************************************************************
  • ***************************篮球计时计分系统************************
  • *************************本系统满足以下几点要求********************
  • *1、能设置整个赛程的比赛时间,在比赛过程中能根据需要暂停和开始计时*
  • *2、能根据比赛情况刷新比赛双方的比分*******************************
  • *3、中场交换比赛场地时,能交换A、B两队比分的位置*******************
  • *4、比赛结束时,能发出报警声***************************************
  • ******************************************************************/
  • #include<reg52.h>
  • #include<intrins.h>
  • #define uchar                 unsigned char
  • #define uint                 unsigned int
  • uchar code HC595_ScanDATE[]=                //定义数码管位数组
  • {
  •         0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
  • };
  • unsigned char code LED_DATE [] =                //定义数码管段数组
  • {
  •         0XC0,        // 0
  •         0XF9,        // 1
  •         0XA4,        // 2
  •         0XB0,        // 3
  •         0X99,        // 4
  •         0X92,        // 5
  •         0X82,        // 6
  •         0XF8,        // 7
  •         0X80,        // 8
  •         0X90        // 9
  • };
  • sbit DS                =P2^0;                        //74HC595各I/O口定义
  • sbit SHCP        =P2^1;
  • sbit STCP        =P2^2;
  • sbit S2                =P3^2;                           //赛前设定比赛时间按键
  • sbit S3                =P1^0;                        //加1分按键
  • sbit S4                =P1^1;                         //加2分按键
  • sbit S5                =P1^2;                          //减1分按键
  • sbit S6                =P1^3;                        //半场换分按键
  • sbit S7                =P1^4;                          //停止蜂鸣器按键
  • sbit S8                =P1^5;                         //开始按键
  • sbit S9                =P1^6;                           //暂停/继续按键
  • sbit S10        =P1^7;                          //加分减分队伍选择按键
  • sbit LED2        =P3^5;        //A队指示灯
  • sbit LED3        =P3^6;        //B队指示灯
  • sbit BUZZ        =P3^7;
  • bit Flag_Score=0;                //加分减分队伍选择标志位
  • void Display();
  • void HC595(uchar a);
  • void Delay_MS(uint ms);
  • void KEY();
  • void Init();
  • uint time=1200;                //初始时间20分钟
  • uchar A_Score=0;                //A队得分
  • uchar B_Score=0;                //B队得分
  • uchar Time_bit=0;        //用于定时器溢出标志
  • void main()
  • {
  •         Init();
  •         while(1)
  •                 {
  •                         Display();
  •                         KEY();
  •                 }
  • }
  • void Init()                                         //初始化函数
  • {
  •         LED2=0;
  •         TMOD=0x01;                                //定时器0 第一种工作方式
  •         TH0=(65536-50000)/256;        //装初值,定时50ms
  •         TL0=(65536-50000)%256;
  •         EA=1;                                        //开总中断
  •         ET0=1;                                        //打开定时器0
  • }
  • void Timer() interrupt 1           //定时器函数,时间处理
  • {
  •         Time_bit++;
  •         if(Time_bit==20)                        //溢出20次,定时1秒
  •                 {
  •                         Time_bit=0;
  •                         if(time==0)                //当比赛结束时,停止计时,并发出警报
  •                                 {
  •                                         BUZZ=0;
  •                                         //time=0;
  •                                         TR0=0;
  •                                 }
  •                         else
  •                                 time--;
  •                 }
  •         TH0=(65536-50000)/256;        //重装初值,定时50ms
  •         TL0=(65536-50000)%256;
  • }
  • void KEY()
  • {
  •         uchar Transposition_Scores=0;                //半场换分使用的缓存数据变量
  •         if(S2==0)        //比赛时间设定,按一次加5分钟
  •                 {
  •                         Delay_MS(1000);
  •                         if(S2==0)
  •                                 {
  •                                         while(!S2);
  •                                         if(TR0==0)        //判断是否开始,以免已经开始有误按
  •                                                 {
  •                                                         time=time+300;
  •                                                         if(time>2700)                //如果时间超过45分钟,重新赋值20分钟
  •                                                                 time=1200;
  •                                                 }
  •                                 }
  •                 }
  •         if(S3==0)        //加1分按键
  •                 {
  •                         Delay_MS(1000);
  •                         if(S3==0)
  •                                 {
  •                                         if(TR0==1)                //判断是否开始,以免还未开始有误按
  •                                                 {
  •                                                         while(!S3);
  •                                                         if(Flag_Score==0)
  •                                                                         A_Score++;
  •                                                         else
  •                                                                         B_Score++;
  •                                                 }
  •                                 }
  •                 }
  •         if(S4==0)        //加2分按键
  •                 {
  •                         if(TR0==1)                //判断是否开始,以免还未开始有误按
  •                                 {
  •                                         Delay_MS(1000);
  •                                         if(S4==0)
  •                                                 {
  •                                                         while(!S4);
  •                                                         if(Flag_Score==0)
  •                                                                         A_Score=A_Score+2;
  •                                                         else
  •                                                                         B_Score=B_Score+2;
  •                                                 }
  •                                 }
  •                 }
  •         if(S5==0)        //减1分按键
  •                 {
  •                         if(TR0==1)                //判断是否开始,以免还未开始有误按
  •                                 {
  •                                         Delay_MS(1000);
  •                                         if(S5==0)
  •                                                 {
  •                                                         while(!S5);
  •                                                         if(Flag_Score==0)
  •                                                                 {
  •                                                                         if(A_Score==0)                //防止分数是0时乱码
  •                                                                                 A_Score=0;
  •                                                                         else
  •                                                                                 A_Score--;
  •                                                                 }
  •                                                         else
  •                                                                 {
  •                                                                         if(B_Score==0)                //防止分数是0时乱码
  •                                                                                 B_Score=0;
  •                                                                         else
  •                                                                                 B_Score--;
  •                                                                 }
  •                                                 }
  •                                 }
  •                 }
  •         if(S6==0)        //半场换分
  •                 {
  •                         Delay_MS(1000);
  •                         if(S6==0)
  •                                 {
  •                                         while(!S6);
  •                                         Transposition_Scores=A_Score;        //A队的得分先赋给缓存变量
  •                                         A_Score=B_Score;                                //将B队的得分赋给A队
  •                                         B_Score=Transposition_Scores;        //再把缓存变量的值(也就是原先A队的得分)赋给B队
  •                                 }
  •                 }
  •         if(S7==0)        //停蜂鸣器
  •                 {
  •                         Delay_MS(1000);
  •                         if(S7==0)
  •                                 {
  •                                         while(!S7);
  •                                         BUZZ=1;
  •                                 }
  •                 }
  •         if(S8==0)        //开始
  •                 {
  •                         Delay_MS(1000);
  •                         if(S8==0)
  •                                 {
  •                                         while(!S8);
  •                                         if(time==0)
  •                                                 time=1200;        //一轮比赛结束后重新给时间赋值
  •                                         TR0=1;                        //定时器开始工作
  •                                 }
  •                 }
  •         if(S9==0)        //暂停继续
  •                 {
  •                         Delay_MS(1000);
  •                         if(S9==0)
  •                                 {
  •                                         while(!S9);
  •                                         TR0=~TR0;                        //定时器暂停/继续工作
  •                                 }
  •                 }
  •         if(S10==0)        //切换加分减分队伍
  •                 {
  •                         Delay_MS(1000);
  •                         if(S10==0)
  •                                 {
  •                                         while(!S10);
  •                                         Flag_Score=~Flag_Score;
  •                                         if(Flag_Score==0)
  •                                                 {
  •                                                         LED2=0;
  •                                                         LED3=1;
  •                                                 }
  •                                         else
  •                                                 {
  •                                                         LED2=1;
  •                                                         LED3=0;
  •                                                 }
  •                                 }
  •                 }
  • }
  • void Display()        //显示函数
  • {
  •         P0=LED_DATE[time/1000];                //得出时间千位
  •         HC595(HC595_ScanDATE[0]);
  •         Delay_MS(500);
  •         P0=0xff;                                //消隐
  •         P0=LED_DATE[time%1000/100];        //得出时间百位
  •         HC595(HC595_ScanDATE[1]);
  •         Delay_MS(500);
  •         P0=0xff;                                //消隐
  •         P0=LED_DATE[time%100/10];                //得出时间十位
  •         HC595(HC595_ScanDATE[2]);
  •         Delay_MS(500);
  •         P0=0xff;                                //消隐
  •         P0=LED_DATE[time%10];                        //得出时间最个位
  •         HC595(HC595_ScanDATE[3]);
  •         Delay_MS(500);
  •         P0=0xff;                                //消隐
  •         P0=LED_DATE[A_Score/10];                //得出A队得分十位
  •         HC595(HC595_ScanDATE[4]);
  •         Delay_MS(500);
  •         P0=0xff;                                //消隐
  •         P0=LED_DATE[A_Score%10];                //得出A队得分个位
  •         HC595(HC595_ScanDATE[5]);
  •         Delay_MS(500);
  •         P0=0xff;                                //消隐
  •         P0=LED_DATE[B_Score/10];                //得出B队得分十位
  •         HC595(HC595_ScanDATE[6]);

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

使用道具 举报

沙发
ID:429157 发表于 2018-11-27 21:03 | 只看该作者
楼主能私发给我吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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