籃球賽電子記分牌 摘要:籃球賽電子計時記分牌是根據籃球比賽特點設計的獨立的信息采集、分配、評判和顯示的系統,能實現比賽時間和分數的實時、準確、快捷處理和呈現。本設計原理簡單,主要采用AT89C51單片機作為微控制器,集合控制器、lCD液晶顯示和報警,控制器控制記分牌的工作狀態,通過lCD液晶顯示和報警來反饋信息。本設計在充分考慮了籃球比賽的實際情況基礎上設計,具有友好的人機交互接口,并且可以防止人為誤操作造成的不良后果,具有一定的實用性。 目錄 1緒論 1.1課題背景及研究意義 1.2設計任務與要求 1.3 單片機在體育賽事計分的應用 1.4方案設計說明 2系統概述 2.1顯示模塊 2.2 按鍵控制模塊 2.3 報警模式 2.4 總體硬件組成框圖 3系統硬件設計 3.1 主控電路設計 3.2 LCD1602顯示模塊的硬件設計 3.2 按鍵控制模塊 3.3 蜂鳴器報警模塊的硬件設計 4 軟件控制系統 4.1主程序設計 4.2仿真結果 5 結論 參考文獻 附錄1: 附錄2: 1緒論1.1課題背景及研究意義目前球場記分牌在傳統操作模式下,采用記分員手動翻動記分牌記分,工作方式單一。由于種種弊端,電子記分板已經開始在一些大型的體育場流行起來,不僅發展速度迅猛并會逐漸取代傳統的電子記分牌。電子記分板根據籃球比賽的特點,采用單片機為核心控制LED數碼管,具有亮度高、可視性好、功耗小、使用壽命長等優點;具有性能穩定,尺寸適中,運輸安裝方式靈活,物美價廉等特點,特別適用于小型籃球體育館和露天運動場。 1.2設計任務與要求 設計題目:籃球賽電子記分牌 設計要求: (1)分別設計籃球比賽甲乙兩個隊的記分牌; (2)能實現兩張記分牌的切換; (3)能按照籃球賽記分規則記分并顯示; (4)將原有的一個指示燈基礎上進一步改進為兩個指示燈,作分別指示。 1.3 單片機在體育賽事計分的應用 傳統的籃球比賽計分是由工作人員人工翻動記分牌實現的,而比賽的時間則由工作人員計表控制。由于人為因素,人工操作的比賽計分板難免會出現誤差。而作為微型控制系統的單片機具有集成度高,功能強,通用性好,特別是它具有體積小,重量輕,能耗低,價格便宜,可靠性高,抗干擾能力強和使用方便等獨特的優點,使單片機迅速得到了推廣應用,目前已經成為測量控制應用系統中的 優選機種和新電子產品的關鍵部位。] 3[因此單片機在體育比賽記分牌的應用也成 為了一種不可避免的趨勢。 1.4方案設計說明 設計方案之前,得先分解設計任務。本次的設計任務是籃球記分牌,據常識,籃球記分牌應有分別給兩隊加分,暫停,顯示屏既要顯示時間又要顯示分數。在進行設計之前,應自己提出幾個問題,待問題回答之后。基本功、的設計方案就出來了。在設計之前我提出了一下幾個問題: a:硬件部分如何控制給A對B對加分,如何控制時間與分數的顯示?場地交換的時候又是如何實現分數顯示交換的?應該如何連接硬件,在硬件上設置控制端,控制端與單片機各引腳之間的連,如何選擇? b:單片機只有一個CPU,如何實現即要掃描按鍵,又要顯示比分,顯示時間。數碼管工作的本質是將要顯示的數據的字型碼送給他,如何采集到變化的分數和時間并送給數碼管。用查表嗎? c:分數時間顯示都應該有對應的液晶顯示,如何控制液晶顯示,使時間和分數都顯示在相對應的液晶顯示屏上?加分與倒計時在程序中最本質的東西是什么,如何用程序來說明這樣的事件,各事件之間又是如何聯系的。 雖然這些問題看似很普通,似乎在設計過程中都要面對這樣的問題,何不事先就解決這些問題呢,在逐一回答這些問題的同時,該任務的設計方案已見雛形。以下就是該方案的詳細內容以及我問題的答案。 2系統概述本系統采用單片機AT89C51為控制核心,系統主要包括顯示模塊、按鍵控制模塊、報警模塊等; 2.1顯示模塊 方案一:采用七段碼數碼管顯示。數碼管是指將所有發光二極管的一極接到一起形成公共極,因此數碼管有共陰共陽之分。以共陽數碼管為例,共陽數碼管在應用時應將公共極接到+5V,當某一字段發光二極管的陰極為低電平時,相應字段就點亮。當某一字段的陰極為高電平時,相應字段就不亮。因此每個數碼管有9個接口。數碼管的驅動方式有靜態掃描和動態掃描兩種形式。靜態掃描編程簡單,但電路復雜;動態掃描變成復雜,而且還需要使用其他芯片。 方案二:采用1602液晶顯示。液晶的物理特性是:當通電時導通,排列變得有秩序,是光線容易通過,不通電時排列混亂,阻止光線通過。相比于數碼管,LCD1602不僅可以顯示的圖形符號更豐富,而且具有輕薄、無輻射等優點。 比較以上兩種方案,系統設計中采用方案二。
2.2 按鍵控制模塊 方案一:采用矩陣鍵盤。矩陣鍵盤的長各分接口分別于單片機的I/O口連接,可以通過連接數量較少的I/O口,擴展出多個按鍵。但其缺點是電路更復雜,編程更麻煩。 方案二:采用獨立按鍵。每個獨立按鍵與單片機I/O連接,雖然不能節省I/O口,但電路簡單、編程容易 比較以上兩種方案,由于本系統只需要4個按鍵,因此選者方案二。 2.3 報警模式 報警模塊中,信號由單片機輸出經PNP型三極管放大后進入蜂鳴器發出聲響進行比賽時間的提示功能。 2.4 總體硬件組成框圖
圖1-1 系統基本方框圖 3系統硬件設計3.1 主控電路設計AT89S51為 ATMEL 所生產的一種低功耗、高性能CMOS8位微控制器,在本系統中,AT89S51單片機內部的功能單元已經能夠滿足系統設計需要,不需要系統擴展。 AT89S51具有以下的特點: - CPU與MCS-51 兼容
- 1000寫/擦循環
- 8K字節可編程FLASH存儲器
- 全靜態工作:0--33MHz
- 三級加密程序存儲器
- 256*8位內部RAM
- 32個可編程I/O線
- 三個16位定時器/計數器
- 8個中斷源
- 可編程串行通道
3.2 LCD1602顯示模塊的硬件設計 1602液晶也叫1602字符型液晶它是一種專門用來顯示字母、數字、符號等的點陣型液晶模塊它有若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符。1602LCD是指顯示的內容為16X2,即可以顯示兩行,每行16個字符液晶模塊 圖1-2液晶顯示模塊電路 其中A代表的是甲隊記分牌、B代表乙隊記分牌 3.2 按鍵控制模塊 按鍵控制模塊采用4個獨立按鍵,K1、K2、K3、K4分別于單片機的P1^0、P1^1 P1^2、P1^3連接,每個按鍵的另一端直接與地相連接,因此是低電平有效。其中K1、K2、K3、K4表示暫停、刷新24秒、A加1分、B加1分 圖1-3按鍵控制模塊電路圖 3.3 蜂鳴器報警模塊的硬件設計 蜂鳴器報警模塊由一個蜂鳴器和一個PNP型的三極管組成,接單片機的P2^7 圖1-4報警模塊模塊電路圖 4 軟件控制系統4.1主程序設計本系統中單片機的主要功能就是利用內部的定時器計時,并隨時接受控制模塊的信息,將比賽的得分和剩余時間顯示在1602液晶上。 程序流程圖: 圖1-5程序流程圖 4.2仿真結果1.如圖4-3所示。點擊K3表示給A加分 按下K4表示給B加分 5 結論這一次的課程設計,我的課題是《籃球賽電子計時記分牌》。由于這一系統包含單片機基礎、數碼管動態顯示、矩陣鍵盤掃描、定時器和中斷等知識體系,涉及面較廣,通過這一課程設計,可以更好地檢測和鞏固學到的知識,加深自己對電子世界的認識。 在本次的設計中,針對每一個模塊都曾有好幾個方案,在反復比較論證之后,才得出最佳方案并應用于系統。在各個模塊的設計中,我除了得到了正確的結果之外,更多的是面對錯誤和失敗,而這些錯誤大多數是由于自己對該部分電路原理掌握的不夠透徹而造成的。通過查閱資料,連接、調試電路和程序,我得出了一下幾條心得體會,以后在設計過程中可以借鑒: 在Proteus里,電路狀態不正常且不易發現問題時,使用電流計和電壓計可直觀檢測電路動態變化,這也是Proteus里非常好用的一個功能;
附錄1: 仿真效果圖 PBC效果 三維效果圖 附錄2:
單片機源程序如下: - #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code tab1[]="A :";
- uchar code tab2[]="B";
- uchar code tab3[]=" GAME OVER "; //比賽結束時顯示
- uchar code tab4[]=" A B "; //比賽結束時顯示
- sbit lcden=P2^2;
- sbit lcdrw=P2^1; //1602液晶的3個端口
- sbit lcdrs=P2^0;
- sbit key1=P1^0;
- sbit key2=P1^1; //四個按鍵
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit Bell=P2^7; //蜂鳴器
- uint keyflag,flag; //標志位
- uchar i,num,count;
- uchar sec,min,miao;
- uchar Ascore,Bscore; //兩隊得分
- /*******************液晶函數****************************/
- void delay(uint z) //液晶延時函數
- { uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com) //命令子函數
- { lcdrs=0; //接受指令
- P0=com; //給P0口送指令碼
- delay(5);
- lcden=1; //E變為高電平
- delay(5); //在此延遲期間,將指令送入
- lcden=0; //E變為低電平,高脈沖結束
- }
- void write_dat(uchar date) //數據子函數data
- {
- lcdrs=1; //接受數據
- P0=date; //給P0口送數據
- delay(5);
- lcden=1; //E變為高電平
- delay(5); //在此延遲期間,將數據送入
- lcden=0; //E變為低電平,高脈沖結束
- }
- void write_time(uchar add,uchar date) //寫入時間函數
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+add);
- write_dat(0x30+shi);
- write_dat(0x30+ge);
- }
- void write_miao(uchar add,uchar date) //寫入24秒函數
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_dat(0x30+shi);
- write_dat(0x30+ge);
- }
- void write_Ascore(uchar add,uchar date) //寫入A隊得分函數
- {
- uchar bai,shi,ge;
- bai=date/100;
- shi=date/10%10;
- ge=date%10;
- write_com(0x80+add);
- write_dat(0x30+bai);
- write_dat(0x30+shi);
- write_dat(0x30+ge);
- }
- void write_Bscore(uchar add,uchar date) //寫入B隊得分函數
- {
- uchar bai,shi,ge;
- bai=date/100;
- shi=date/10%10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_dat(0x30+bai);
- write_dat(0x30+shi);
- write_dat(0x30+ge);
- }
- void write_score(uchar add,uchar date) //比賽結束寫入得分函數
- { uchar bai,shi,ge;
- bai=date/100;
- shi=date/10%10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_dat(0x30+bai);
- write_dat(0x30+shi);
- write_dat(0x30+ge);
- }
- void delay_Bell(uint z) //蜂鳴器延時函數
- {
- uint x,y; for(x=z;x>0;x--) for(y=255;y>0;y--);
- }
- void init() //初始化函數
- {
- Bell=1;
- keyflag=0;
- flag=0;
- min=12;
- sec=0;
- miao=25;
- Ascore=0;
- Bscore=0;
- lcdrw=0;
- lcden=0; //E的初始值為低電平,后面的程序給高電平從而滿足E為高脈沖
- write_com(0x38); //寫入顯示模式指令
- write_com(0x0e); //顯示是否打開以及光標的設置
- write_com(0x06); //地址指針的加減和整屏是否移動
- write_com(0x01); //清屏指令
- write_com(0x80+0x00); //顯示字符的初始位置
- for(num=0;num<16;num++)
- { write_dat(tab1[num]); }
- write_com(0x80+0x40); //起始地址為53,將字符調到了第二行
- for(num=0;num<2;num++)
- { write_dat(tab2[num]); }
- write_Ascore(2,Ascore);
- write_Bscore(2,Bscore);
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1; ET0=1;
- TR0=1; //開定時器
- }
- void keyscan() //按鍵函數
- { if(key1==0)
- { delay(10);
- if(key1==0)
- { keyflag++; //鍵一按下,標志位加一
- while(!key1);
- if(keyflag==1)
- { TR0=0; } //關中斷
- if(keyflag==2)
- { TR0=1; keyflag=0;
- }
- }
- }
- if(key2==0) //刷新24秒
- { delay(5);
- if(key2==0)
- { while(!key2);
- miao=25;
- }
- }
- if(key3==0)
- { delay(5);
- if(key3==0)
- { while(!key3);
- Ascore++; write_Ascore(2,Ascore);
- } //寫入A隊得分
- }
- if(key4==0)
- { delay(5);
- if(key4==0)
- {
- while(!key4);
- Bscore++; write_Bscore(2,Bscore);
- } //寫入B隊得分
- }
- }
- void main()
- {
- init();
- while(1)
- {
- keyscan();
- if(flag==0)
- {
- write_com(0x80+0x40+7); //寫入第一節 FIR
- write_dat('F');
- write_dat('I');
- write_dat('R');
- }
- if(flag==1)
- {
- write_com(0x80+0x40+7); //寫入第二節 SEC
- write_dat('S');
- write_dat('E');
- write_dat('C');
- }
-
- if(flag==2)
- {
- write_com(0x80+0x40+7); //寫入第三節 THR
- write_dat('T');
- write_dat('H');
- write_dat('R');
- }
- if(flag==3)
- {
- write_com(0x80+0x40+7); //寫入第四節 FOU
- write_dat('F');
- write_dat('O');
- write_dat('U');
- }
- if(flag==4) //比賽結束顯示”GAME OVER“和兩隊比分
- {
-
- TR0=0;
- write_com(0x80);
- for(i=0;i<16;i++)
- {
- write_dat(tab3[i]); //"GAME OVER"字符串數組
- }
- write_com(0x80+0x40); //起始地址為53,將字符調到了第二行
- for(i=0;i<16;i++)
- {
- write_dat(tab4[i]);
- }
-
- write_score(5,Ascore); //比賽結束寫入兩隊比分
- write_score(11,Bscore);
- }
- if(miao>=4&&miao<=5) //若只剩5秒,蜂鳴器響1秒
- { Bell=0; delay_Bell(510);
- Bell=1; delay_Bell(510);
- }
- }
- }
- void timer0() interrupt 1 //定時器
- {
- TH0=(65536-50000)/256;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
電子記分牌說明書.doc
(563.37 KB, 下載次數: 21)
2018-4-9 20:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|