- /******************************************************************
- ***************************篮球计时计分系统************************
- *************************本系统满足以下几点要求********************
- *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]);
|