计分系统:
(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仿真工程文件可到本帖附件中下载)
仿真图
程序例程图:
主函数程序如下
- #include"KeyBord.h"
- #include"LCD1602.h"
- #include"Timer.h"
- sbit Beep = P1^5;
- char rule_time = 24; //24S规则
- unsigned int A_Score = 0; //A队分数
- unsigned int B_Score = 0; //B队分数
- unsigned char match = 1; //比赛节数
- unsigned char rule_flag = 0; //记录24S规则是否启用
- unsigned char Beep_flag =0 ; //判断蜂鸣器是否报警
- unsigned char Start_flag = 0; //开始标志位
- unsigned char Time_Data[4]; //数组用于存放处理的设定时间
- unsigned char Score[6]; //用于存储处理的比赛分数
- unsigned char Temp[4]; //用于存储处理的比赛节数和24S规则
- void Key_Control();
- void main()
- {
- Beep_flag = 1; //蜂鸣器报警启用
- LCD_Init();
- Timer0_Init();
- while(1)
- {
- Key_Control();
- Time_Data[0] = '0' + minute / 10; //赛程时间 分 十位
- Time_Data[1] = '0' + minute % 10; //赛程时间 分 个位
- Time_Data[2] = '0' + second / 10; //赛程时间 秒 十位
- Time_Data[3] = '0' + second % 10; //赛程时间 秒 个位
- Temp[0] = '0' + match / 10; //赛程节数 十位
- Temp[1] = '0' + match % 10; //赛程节数 个位
- Temp[2] = '0' + rule_time / 10; //24秒倒计时 十位
- Temp[3] = '0' + rule_time % 10; //24秒倒计时 个位
- Score[0] = '0' + A_Score / 100; //A队分数 百位
- Score[1] = '0' + A_Score % 100 / 10; //A队分数 十位
- Score[2] = '0' + A_Score % 100 % 10; //A队分数 个位
- Score[3] = '0' + B_Score / 100; //B队分数 百位
- Score[4] = '0' + B_Score % 100 / 10; //B队分数 十位
- Score[5] = '0' + B_Score % 100 % 10; //B队分数 个位
- LCD_Write_Str(1,0,"H.T"); //对应的位置显示
- LCD_Write_Char(5,0,Score[0]);
- LCD_Write_Char(6,0,Score[1]);
- LCD_Write_Char(7,0,Score[2]);
- LCD_Write_Str(8,0,":");
- LCD_Write_Char(9,0,Score[3]);
- LCD_Write_Char(10,0,Score[4]);
- LCD_Write_Char(11,0,Score[5]);
- LCD_Write_Str(13,0,"R.T");
- LCD_Write_Char(0,1,Time_Data[0]);
- LCD_Write_Char(1,1,Time_Data[1]);
- LCD_Write_Str(2,1,":");
- LCD_Write_Char(3,1,Time_Data[2]);
- LCD_Write_Char(4,1,Time_Data[3]);
- LCD_Write_Str(6,1,"SEC-");
- LCD_Write_Char(10,1,Temp[0]);
- LCD_Write_Char(11,1,Temp[1]);
- LCD_Write_Char(13,1,Temp[2]);
- LCD_Write_Char(14,1,Temp[3]);
- if(second < 0)
- {
- if(minute == 0) //判断某节点是否结束
- {
- if(match < MATCH) //判断是否为最后一节比赛
- {
- //计时系统恢复为默认值,比赛节数加一
- match++;
- minute = SET_TIME;
- rule_time = RULE_TIME;
- second = 0;
- }
- else
- {
- second = 0;
- }
- TR0 = 0; //停止时钟,等待下一次比赛开始
- while(Beep_flag)
- {
- Key_Control();
- Beep = ~Beep; //板子为无源蜂鸣器
- DelayUs2x(10);
- }
-
- }
- else
- {
- second = 59;
- minute--;
- }
- }
-
- if(rule_time < 0 && rule_flag) //24秒结束,球未出手,计时器暂停,24秒复位
- {
- TR0 = 0;
- rule_time = RULE_TIME;
- }
- }
- }
- /*========================================
- 函数名称:Key_Control
- 函数功能:按键控制,每个按键对应功能
- =========================================*/
- void Key_Control()
- {
- switch(KeyScan())
- {
- case 0x77: //比赛开始/继续
- TR0 = 1; //定时器开关打开,开始计时
- rule_flag = 1; //24S规则启用
- Beep_flag = 1; //蜂鸣器报警启用
- break;
- case 0xb7: //比赛暂停
- TR0 = 0; //定时器开关打开,停止计时
- break;
- case 0x7b: //手动24S倒计时复位
- if(TR0 == 1)
- {
- rule_time = 0; //24秒清零,等待下次球权
- rule_flag = 0; //24秒功能停用
- }
- else
- {
- rule_flag = 0; ////24秒功能停用
- }
- break;
- case 0xbb: //增加比赛节数,同时总计时器和24秒复位
- if((match >= MATCH) && (minute == 0)) //判断比赛结束是否超过四节以及此节比赛是否结束
- {
- TR0 = 0; //定时器停止
- match++; //赛程节数加一
- minute = 5; //加时赛赛程时间设置 5分钟
- second = 0;
- rule_time = RULE_TIME; //24秒恢复初值
- rule_flag = 0;
- }
- break;
- case 0xdb:
- Beep_flag = 0; //关闭蜂鸣器
- break;
- //每队加分后赛程停止计时,24秒恢复初值,等待比赛继续开始
- case 0x7d: //A队加3分
- TR0 = 0;
- A_Score += 3;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0xbd: //A队加2分
- TR0 = 0;
- A_Score += 2;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
-
- case 0xdd: //A队加1分
- TR0 = 0;
- A_Score += 1;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0x7e: //B队加3分
- TR0 = 0;
- B_Score += 3;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0xbe: //B队加2分
- TR0 = 0;
- B_Score += 2;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0xde: //B队加1分
- TR0 = 0;
- B_Score += 1;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- default:break;
- }
- }
复制代码
Keil代码与Proteus仿真下载:
篮球计时计分器.7z
(479.77 KB, 下载次数: 276)
|