|
計(jì)分系統(tǒng):
(1)分為“A隊(duì)”和“B隊(duì)”的“3分”,“2分”,“1分”各六個(gè)按鍵輸入部分,以及兩隊(duì)比分的LED顯示部分。在每次增加分?jǐn)?shù)的同時(shí),“24秒”計(jì)時(shí)恢復(fù)為初始值,“12分鐘”計(jì)時(shí)暫停,等待比賽的繼續(xù)進(jìn)行
計(jì)時(shí)系統(tǒng):
(1)比賽開始/繼續(xù):當(dāng)“比賽開始/繼續(xù)”鍵按下后,“24s”和“12分鐘”計(jì)時(shí)器開始倒計(jì)時(shí);
(2)手動(dòng)24s復(fù)位:當(dāng)“24s復(fù)位” 鍵按下后,“24s”倒計(jì)時(shí)恢復(fù)初始值,“12分鐘”倒計(jì)時(shí)暫停,等待比賽的繼續(xù);
(3)比賽暫停:“比賽暫停”鍵按下后,“24s”倒計(jì)時(shí)和“12分鐘”倒計(jì)時(shí)均暫停,等待比賽的繼續(xù)進(jìn)行;
(4)自動(dòng)增加比賽節(jié)數(shù):當(dāng)“12分鐘”倒計(jì)時(shí)完成后,判斷當(dāng)前節(jié)數(shù)是否為最后一節(jié),若不是,則節(jié)數(shù)自動(dòng)增加,并“12分鐘”和“24s”均恢復(fù)默認(rèn)值,等待下一節(jié)比賽的進(jìn)行。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真圖
程序例程圖:
主函數(shù)程序如下
- #include"KeyBord.h"
- #include"LCD1602.h"
- #include"Timer.h"
- sbit Beep = P1^5;
- char rule_time = 24; //24S規(guī)則
- unsigned int A_Score = 0; //A隊(duì)分?jǐn)?shù)
- unsigned int B_Score = 0; //B隊(duì)分?jǐn)?shù)
- unsigned char match = 1; //比賽節(jié)數(shù)
- unsigned char rule_flag = 0; //記錄24S規(guī)則是否啟用
- unsigned char Beep_flag =0 ; //判斷蜂鳴器是否報(bào)警
- unsigned char Start_flag = 0; //開始標(biāo)志位
- unsigned char Time_Data[4]; //數(shù)組用于存放處理的設(shè)定時(shí)間
- unsigned char Score[6]; //用于存儲(chǔ)處理的比賽分?jǐn)?shù)
- unsigned char Temp[4]; //用于存儲(chǔ)處理的比賽節(jié)數(shù)和24S規(guī)則
- void Key_Control();
- void main()
- {
- Beep_flag = 1; //蜂鳴器報(bào)警啟用
- LCD_Init();
- Timer0_Init();
- while(1)
- {
- Key_Control();
- Time_Data[0] = '0' + minute / 10; //賽程時(shí)間 分 十位
- Time_Data[1] = '0' + minute % 10; //賽程時(shí)間 分 個(gè)位
- Time_Data[2] = '0' + second / 10; //賽程時(shí)間 秒 十位
- Time_Data[3] = '0' + second % 10; //賽程時(shí)間 秒 個(gè)位
- Temp[0] = '0' + match / 10; //賽程節(jié)數(shù) 十位
- Temp[1] = '0' + match % 10; //賽程節(jié)數(shù) 個(gè)位
- Temp[2] = '0' + rule_time / 10; //24秒倒計(jì)時(shí) 十位
- Temp[3] = '0' + rule_time % 10; //24秒倒計(jì)時(shí) 個(gè)位
- Score[0] = '0' + A_Score / 100; //A隊(duì)分?jǐn)?shù) 百位
- Score[1] = '0' + A_Score % 100 / 10; //A隊(duì)分?jǐn)?shù) 十位
- Score[2] = '0' + A_Score % 100 % 10; //A隊(duì)分?jǐn)?shù) 個(gè)位
- Score[3] = '0' + B_Score / 100; //B隊(duì)分?jǐn)?shù) 百位
- Score[4] = '0' + B_Score % 100 / 10; //B隊(duì)分?jǐn)?shù) 十位
- Score[5] = '0' + B_Score % 100 % 10; //B隊(duì)分?jǐn)?shù) 個(gè)位
- LCD_Write_Str(1,0,"H.T"); //對(duì)應(yīng)的位置顯示
- 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) //判斷某節(jié)點(diǎn)是否結(jié)束
- {
- if(match < MATCH) //判斷是否為最后一節(jié)比賽
- {
- //計(jì)時(shí)系統(tǒng)恢復(fù)為默認(rèn)值,比賽節(jié)數(shù)加一
- match++;
- minute = SET_TIME;
- rule_time = RULE_TIME;
- second = 0;
- }
- else
- {
- second = 0;
- }
- TR0 = 0; //停止時(shí)鐘,等待下一次比賽開始
- while(Beep_flag)
- {
- Key_Control();
- Beep = ~Beep; //板子為無源蜂鳴器
- DelayUs2x(10);
- }
-
- }
- else
- {
- second = 59;
- minute--;
- }
- }
-
- if(rule_time < 0 && rule_flag) //24秒結(jié)束,球未出手,計(jì)時(shí)器暫停,24秒復(fù)位
- {
- TR0 = 0;
- rule_time = RULE_TIME;
- }
- }
- }
- /*========================================
- 函數(shù)名稱:Key_Control
- 函數(shù)功能:按鍵控制,每個(gè)按鍵對(duì)應(yīng)功能
- =========================================*/
- void Key_Control()
- {
- switch(KeyScan())
- {
- case 0x77: //比賽開始/繼續(xù)
- TR0 = 1; //定時(shí)器開關(guān)打開,開始計(jì)時(shí)
- rule_flag = 1; //24S規(guī)則啟用
- Beep_flag = 1; //蜂鳴器報(bào)警啟用
- break;
- case 0xb7: //比賽暫停
- TR0 = 0; //定時(shí)器開關(guān)打開,停止計(jì)時(shí)
- break;
- case 0x7b: //手動(dòng)24S倒計(jì)時(shí)復(fù)位
- if(TR0 == 1)
- {
- rule_time = 0; //24秒清零,等待下次球權(quán)
- rule_flag = 0; //24秒功能停用
- }
- else
- {
- rule_flag = 0; ////24秒功能停用
- }
- break;
- case 0xbb: //增加比賽節(jié)數(shù),同時(shí)總計(jì)時(shí)器和24秒復(fù)位
- if((match >= MATCH) && (minute == 0)) //判斷比賽結(jié)束是否超過四節(jié)以及此節(jié)比賽是否結(jié)束
- {
- TR0 = 0; //定時(shí)器停止
- match++; //賽程節(jié)數(shù)加一
- minute = 5; //加時(shí)賽賽程時(shí)間設(shè)置 5分鐘
- second = 0;
- rule_time = RULE_TIME; //24秒恢復(fù)初值
- rule_flag = 0;
- }
- break;
- case 0xdb:
- Beep_flag = 0; //關(guān)閉蜂鳴器
- break;
- //每隊(duì)加分后賽程停止計(jì)時(shí),24秒恢復(fù)初值,等待比賽繼續(xù)開始
- case 0x7d: //A隊(duì)加3分
- TR0 = 0;
- A_Score += 3;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0xbd: //A隊(duì)加2分
- TR0 = 0;
- A_Score += 2;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
-
- case 0xdd: //A隊(duì)加1分
- TR0 = 0;
- A_Score += 1;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0x7e: //B隊(duì)加3分
- TR0 = 0;
- B_Score += 3;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0xbe: //B隊(duì)加2分
- TR0 = 0;
- B_Score += 2;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- case 0xde: //B隊(duì)加1分
- TR0 = 0;
- B_Score += 1;
- rule_time = RULE_TIME;
- rule_flag = 0;
- break;
- default:break;
- }
- }
復(fù)制代碼
Keil代碼與Proteus仿真下載:
籃球計(jì)時(shí)計(jì)分器.7z
(479.77 KB, 下載次數(shù): 276)
2021-12-19 18:11 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|