計分系統:
(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)
2021-12-19 18:11 上傳
點擊文件名下載附件
|