基于單片機的籃球比賽計分器設(shè)計_第1頁
基于單片機的籃球比賽計分器設(shè)計_第2頁
基于單片機的籃球比賽計分器設(shè)計_第3頁
基于單片機的籃球比賽計分器設(shè)計_第4頁
基于單片機的籃球比賽計分器設(shè)計_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

摘要本設(shè)計以基本籃球規(guī)則為依據(jù),可對籃球比賽實現(xiàn)實時控制。設(shè)計包括五個模塊。他們是24秒顯示,計時器,記分器,計節(jié)器,每節(jié)節(jié)計時器。24秒顯示能按鍵控制24秒計時器,當(dāng)控球時間即將超過24秒時,可發(fā)出報警信號。計時器,可按鍵調(diào)節(jié)??梢噪S時暫停計時,暫停比賽,在每節(jié)即將結(jié)束和全場即將結(jié)束時報警。記分器記錄兩隊的積累分?jǐn)?shù),可通過按鍵分別對A、B兩隊進行加1、2、3分、減1、2、3分。關(guān)鍵詞:單片機,LCD1602,計分,報警;Abstract Thisdesignwasbasedonthebasicrulesofbasketball,canrealizereal-timecontrolinthebasketballmatch.Designincludesfivemodules.Theyare24seconds,accordingtothetimer,,metersection,eachtimer.24secondsdisplaycanbuttoncontrol24secondstimer,whentheballismorethan24seconds,cansendoutalarmsignal.Thetimer,canadjustthekeys.Canatanytimesuspendtime,suspendedthegameandattheendofeachsectioniscomingtoanendandthepolice.Canrecordtheaccumulationoftwoteamsscore,canthroughthekeysforA,Btwoteamsrespectivelytowakeplus1,2,3points,minus1,2,3points.Keywords:singlechipmicrocomputer,LCD1602,scoring,alarm;概述單片機把我們帶入了智能化的電子領(lǐng)域,許多繁瑣的系統(tǒng)若由單片機進行設(shè)計,便能收到電路更簡單、功能更齊全的良好效果。若把經(jīng)典的電子系統(tǒng)當(dāng)作一個僵死的電子系統(tǒng),那么智能化的現(xiàn)代電子系統(tǒng)則是一個具有“生命”的電子系統(tǒng)。而隨著技術(shù)的進步,單片機與串口通信的結(jié)合更多地應(yīng)用到各個電子系統(tǒng)中已成一種趨勢。 單片機具有體積小、功能強、應(yīng)用面廣等優(yōu)點,目前正以前所未見的速度取代著傳統(tǒng)電子線路構(gòu)成的經(jīng)典系統(tǒng),蠶食著傳統(tǒng)數(shù)字電路與模擬電路固有的領(lǐng)地。同時,一個學(xué)習(xí)與應(yīng)用單片機的新高潮正在大規(guī)模地興起。 但是,單片機并不像傳統(tǒng)數(shù)字電路或模擬電路那樣直觀,原因是除了“硬件”之外,還存在一個“軟件”的因素。正是這個“軟件”因素的存在,使得許多初學(xué)者怎么也弄不懂單片機的工作過程,怎么也不明白為什么將幾個數(shù)送來送去,就能控制一盞燈亮/滅,就能控制一個電機變速。本設(shè)計是由一種由STC89C52RC編程控制LCD1602做顯示的球賽計時計分系統(tǒng)。本系統(tǒng)具有賽程定時設(shè)置、賽程時間暫停、A、B雙方的比分以及比賽節(jié)數(shù)。它具有價格低廉、性能穩(wěn)定、操作方便且易攜帶等特點、廣泛適合各類學(xué)校和小團體作為賽程計時計分。 本設(shè)計就是基于單片機設(shè)計時計分系統(tǒng),通過串口通信動態(tài)傳輸數(shù)據(jù),使計時計分系統(tǒng)有了更多更完善的功能。單片機系統(tǒng)的硬件結(jié)構(gòu)給予了籃球計分器系統(tǒng)“身軀”,而單片機的應(yīng)用程序賦予了其新的“生命”,使其在傳統(tǒng)的籃球計時計分器面前具有電路簡單、成本低、運行可靠等特色。第一章系統(tǒng)設(shè)計方案隨著單片機在各個領(lǐng)域的廣泛應(yīng)用,許多用單片機作控制的球賽計時計分系統(tǒng)也應(yīng)時產(chǎn)生,如用單片機控制LCD液晶顯示器計時計分器,用單片機控制LED七段顯示器計時計分器等。本設(shè)計由STC89C52RC編程控制LCD液晶顯示器作球賽計時計分系統(tǒng)具有賽程定時設(shè)置、賽程時間暫停、性能穩(wěn)定、操作方便且易攜帶等特點??蓮V泛適合各類學(xué)校和小團體作為賽程計時計分。1.1系統(tǒng)構(gòu)成框圖基于單片機系統(tǒng)的籃球計時計分器的系統(tǒng)構(gòu)成框圖如圖1-1所示。圖1-1系統(tǒng)構(gòu)成框圖本系統(tǒng)采用單片機STC89C52RC作為本設(shè)計的核心元件。利用LCD1602作為顯示器件,第一行顯示雙方比賽總分?jǐn)?shù),第二行依次顯示節(jié)數(shù),每節(jié)倒計時時間,24秒倒計時。賽程計時采用倒計時方式。即比賽前將時間設(shè)置好,比賽開始時啟動計時,直到計時到零為至。每一節(jié)12分鐘,一共四節(jié)。其次,為了配合計時器和計分器校正、調(diào)整時間和比分,我們在設(shè)計中設(shè)立了12個按鍵。分別用于A、B兩隊的分?jǐn)?shù)加;另外也可用計時的暫停與啟動、24秒進攻時間刷新(分為計時與不計時兩種)、計時重置。再次,我們還設(shè)計了報警系統(tǒng),24秒倒計時為3秒時,通過蜂鳴器發(fā)出報警聲,提示進攻時間即將結(jié)束。 1.2基本功能介紹1.2.1按鍵功能在計時電路中,按鍵開關(guān)K1、K10、K11、K12用來控制計時時間的重置、暫停/啟動、進攻時間的重置與啟動。比如:當(dāng)進行一場新的比賽時,可以通過K1按鍵重置計時與部分內(nèi)容。當(dāng)某個球隊進球后,可以通過K11與K12重置進攻時間。還有當(dāng)比賽過程中有隊員犯規(guī)或需要暫停比賽時,可以通過K10控制計時的暫停與啟動。并且系統(tǒng)具有掉電保存工作。當(dāng)比賽規(guī)定時間結(jié)束時,雙方分?jǐn)?shù)仍然相同,這時系統(tǒng)默認(rèn)再進行5分鐘加時賽。1.2.2賽程時間啟/停設(shè)置比賽開始可以通過K10按鍵進行開始比賽計時,倒計時開始后再按一次,比賽時間暫停??呻S時進行時間暫停。1.2.3比分刷新控制由于在比賽中,A、B兩隊的比分是不斷變化的,所以需設(shè)置比分刷新控制裝置;此功能由K2-K9按鍵完成:K2鍵:設(shè)置A隊加分設(shè)置K3鍵:設(shè)置B隊加分設(shè)置K4鍵:選著對應(yīng)的隊加1分K5鍵:選著對應(yīng)的隊加2分K6鍵:選著對應(yīng)的隊加3分K7鍵:選著對應(yīng)的隊減1分K8鍵:選著對應(yīng)的隊減2分K9鍵:選著對應(yīng)的隊減3分1.2.4賽程結(jié)束報警當(dāng)比賽即將結(jié)束時,系統(tǒng)會自動發(fā)出報警聲,提示裁判比賽結(jié)束,之后報警結(jié)束。1.3籃球計時計分器的工作過程整個籃球比賽計時計分器的工作過程如下:首先在比賽之前,接通電源,系統(tǒng)自動復(fù)位,此時第一行顯示雙方總分?jǐn)?shù)為000和000;第二行依次顯示:節(jié)數(shù)、節(jié)倒計時時間、24秒倒計時時間。時間計時與比分可以通過K1進行重置。2.進入比賽界面后,按K10開始計時比賽,可以加1分、2分和3分,分?jǐn)?shù)累加。24秒內(nèi)如果沒有加分,進攻違例報警2秒,按K10繼續(xù)開始比賽。如果四節(jié)比賽時間到后比分相同自動進入加時賽。加時賽5分鐘。如果在比賽過程中,一方教練申請暫停時,經(jīng)裁判批準(zhǔn),我們立即按下K10鍵,即可以暫停計時,暫停時間到時,再按K10鍵繼續(xù)計時,直至本場比賽結(jié)束,蜂鳴器會發(fā)出2秒鐘響聲,表示比賽結(jié)束。第二章系統(tǒng)硬件設(shè)計2.1系統(tǒng)硬件部分組成:系統(tǒng)硬件主要是由單片機STC89C52RC、顯示電路、報警電路和按鍵開關(guān)四個部分組成。2.2器件的選擇本系統(tǒng)在設(shè)計過程中主要選取了以下一些器件:單片機:STC89C52RC。顯示器件:LCD1602顯示器。報警器件:5V有源蜂鳴器。按鍵:獨立式按鍵。2.3顯示部分硬件的設(shè)計LCM1602的接口信號說明如表3:表3LCM1602的接口信號編號引腳符號功能說明編號引腳符號功能說明1VSS電源地9D2DATAI/O2VDD電源正極10D3DATAI/O3VL液晶顯示偏壓信號11D4DATAI/O4RS數(shù)據(jù)/命令選擇端(H/L)12D5DATAI/O5R/W讀/寫選擇端(H/L)13D6DATAI/O6E使能信號14D7DATAI/O7D0DATAI/O15BLA背光正極8D1DATAI/O16BLK背光負(fù)極2、基本操作時序如下:1)讀狀態(tài):RS=L,RW=H,E=H2)寫指令:RS=L,RW=L,D0~D7=指令碼,E=高脈沖3)讀數(shù)據(jù):RS=H,RW=H,E=H4)寫數(shù)據(jù):RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖3、初始化設(shè)置1)顯示模式設(shè)置如表4:表4顯示模式設(shè)置2)顯示開/關(guān)及光標(biāo)設(shè)置如表5:2.4STC89C52RC單片機的結(jié)構(gòu)2.4.1STC89C52RC單片機的結(jié)構(gòu)STC89C52RC單片機是以51內(nèi)核為主的系列單片機,STC單片機是宏晶生產(chǎn)的單時鐘/機器周期的單片機,是高速、低功耗、超強抗干擾的新一代8051單片機,指令代碼完全兼容傳統(tǒng)8051,但速度快8—12倍,內(nèi)部集成MAX810專用復(fù)位電路。4路PWM8路高速10位A、D轉(zhuǎn)換,針對電機控制,強干擾場合。STC89C52RC單片機引腳如下圖:STC89C52RC單片機主要性能●高速:1個時鐘/機器周期,增強型8051內(nèi)核,速度比普通8051快8~12倍●寬電壓:5.5~3.8V,2.4~3.8V(STC12LE5410AD系列)●低功耗設(shè)計:空閑模式,掉電模式(可由外部中斷喚醒)●工作頻率:0~35MHz,相當(dāng)于普通8051:0~420MHz實際可到48MHz,相當(dāng)于8051:0~576MHz●時鐘:外部晶體或內(nèi)部RC振蕩器可選,在ISP下載編程用戶程序時設(shè)置●16K字節(jié)片內(nèi)Flash程序存儲器,擦寫次數(shù)10萬次以上●512字節(jié)片內(nèi)RAM數(shù)據(jù)存儲器●芯片內(nèi)EEPROM功能●ISP/IAP,在系統(tǒng)可編程/在應(yīng)用可編程,無需編程器/仿真器●10位ADC,8通道,STC12C5A16S2系列為8位ADC。4路PWM還可當(dāng)4路D/A使用●2個硬件16位定時器,兼容普通8051的定時器。4路PCA還可再實現(xiàn)4個定時器●硬件看門狗(WDT)●高速SPI通信端口●全雙工異步串行口(UART),兼容普通8051的串口●先進的指令集結(jié)構(gòu),兼容普通8051指令集4組8個8位通用工作寄存器(共32個通用寄存器)有硬件乘法/除法指令●通用I/O口(27/23/15個),復(fù)位后為:準(zhǔn)雙向口/弱上拉(普通8051傳統(tǒng)I/O口)可設(shè)置成四種模式:準(zhǔn)雙向口/弱上拉,推挽/強上拉,僅為輸入/高阻,開漏每個I/O口驅(qū)動能力均可達到20mA,但整個芯片最大不得超過55mA。第三章系統(tǒng)軟件設(shè)計顯示部分軟件的設(shè)計根據(jù)硬件單位連接然后進行軟件的編寫。開關(guān)電路時間長短與開關(guān)的機械性有關(guān),一般為5-10ms。單片機對非編碼鍵盤的控制方式:獨立式鍵盤的編程。復(fù)位電路:復(fù)位的作用是使中央處理器CPU以及其他功能部件都恢復(fù)到一個確定的初始狀態(tài),并從這個狀態(tài)重新開始工作。圖3-1系統(tǒng)方框圖3.1主程序設(shè)計根據(jù)上述內(nèi)容的描述,先進行主程序流程圖的構(gòu)思:主程序流程圖如圖3-2所示:圖3-2主程序路程圖3.2顯示部分軟件的設(shè)計有了硬件的基礎(chǔ),軟件部分就比較容易了,那就是根據(jù)硬件單位連接然后進行軟件的編寫。液晶顯示電路如圖3-3所示:圖3-3液晶顯示電路圖程序如下列所示:/*********************************************************************名稱:LCD1602_write(ucharorder,dat)*功能:1602寫如數(shù)據(jù)函數(shù)*輸入:輸入的命令值*輸出:無***********************************************************************/voidLCD1602_write(ucharorder,dat) //1602一個字節(jié)處理 order為命令與數(shù)據(jù)選擇dat為寫的數(shù)據(jù)內(nèi)容{LCD1602_e=0;LCD1602_rs=order;LCD1602_dat=dat;LCD1602_rw=0;LCD1602_e=1;delay(1);LCD1602_e=0; }/*********************************************************************名稱:LCD1602_writebye(uchar*prointer)*功能:1602寫入數(shù)據(jù)函數(shù)指針式*輸入:輸入的命令值*輸出:無***********************************************************************/voidLCD1602_writebyte(uchar*prointer) //1602字符串處理{while(*prointer!='\0'){LCD1602_write(1,*prointer);prointer++; }}/*********************************************************************名稱:init_1602()*功能:初始化1602液晶*輸入:無*輸出:無***********************************************************************/voidLCD1602_cls() //1602初始化{LCD1602_write(0,0x01);//1602清屏指令 delay(1500);LCD1602_write(0,0x38);//功能設(shè)置8位、5*7點陣 delay(1500);LCD1602_write(0,0x0c);//設(shè)置光標(biāo)不顯示開關(guān)、不顯示光標(biāo)、字符不閃爍LCD1602_write(0,0x06);LCD1602_write(0,0xd0); delay(1500);}voidshow() //1602顯示內(nèi)容部分{ if(seg<3) { LCD1602_write(0,0x81); //A隊得分情況 LCD1602_writebyte("A:"); if(A_dat>99) { LCD1602_write(1,0x30+A_dat/100%10); LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); }elseif(A_dat>9) { LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } LCD1602_write(0,0x89); LCD1602_writebyte("B:"); //B隊得分情況 if(B_dat>99) { LCD1602_write(1,0x30+B_dat/100%10); LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); }elseif(B_dat>9) { LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } }else //后半場A、B對分情況反過來顯示 { LCD1602_write(0,0x89); LCD1602_writebyte("A:"); if(A_dat>99) { LCD1602_write(1,0x30+A_dat/100%10); LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); }elseif(A_dat>9) { LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } LCD1602_write(0,0x81); LCD1602_writebyte("B:"); if(B_dat>99) { LCD1602_write(1,0x30+B_dat/100%10); LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); }elseif(B_dat>9) { LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } } LCD1602_write(0,0xc0); switch(seg) { case1: LCD1602_writebyte("1ST"); //籃球比賽的四節(jié)顯示 break; case2: LCD1602_writebyte("2ND"); break; case3: LCD1602_writebyte("3RD"); break; case4: LCD1602_writebyte("4TH"); break; case5: LCD1602_writebyte("OT"); break; } min=time/60; sec=time%60; LCD1602_write(0,0xc5); if(min>9)LCD1602_write(1,0x30+min/10%10); elseLCD1602_writebyte(""); LCD1602_write(1,0x30+min%10); LCD1602_writebyte(":"); LCD1602_write(1,0x30+sec/10%10); LCD1602_write(1,0x30+sec%10); LCD1602_writebyte(""); LCD1602_write(0,0xc0+12); if(time_24>9)LCD1602_write(1,0x30+time_24/10%10); elseLCD1602_writebyte(""); LCD1602_write(1,0x30+time_24%10);}3.3按鍵電路3.3.1鍵盤接口工作原理:在單片機應(yīng)用系統(tǒng)中,常用鍵盤作為輸入設(shè)備,通過它將數(shù)據(jù)、內(nèi)存地址、命令及指令等輸入到系統(tǒng)中,來實現(xiàn)簡單的人機通信。鍵盤是一組按鍵的組合,通常有數(shù)據(jù)鍵和功能鍵組成。計算機所用的鍵盤有編碼鍵盤和非編碼鍵盤兩種。編碼鍵盤采用硬件電路來實現(xiàn)鍵的編碼,每按下一個鍵,鍵盤就能自動產(chǎn)生鍵代碼,去除抖動等功能。這種鍵盤使用方便,但需要較多的硬件,價格較貴,一般的單片機應(yīng)用系統(tǒng)較少采用。非編碼鍵盤僅提供鍵的開關(guān)狀態(tài),依靠程序來識別閉合按鍵。并具有去處抖動產(chǎn)生鍵的代碼并轉(zhuǎn)入執(zhí)行該鍵的處理等功能。因此,非編碼鍵盤硬件電路簡單成本低,但占用CPU的時間較長。目前在單片機應(yīng)用系統(tǒng)中多采用這種鍵盤。我們這里主要討論非編碼鍵盤接口。(1)鍵輸入原理在單片機應(yīng)用系統(tǒng)中,除了復(fù)位鍵有專門的復(fù)位電路及專一的復(fù)位功能外,其他按鍵都是以開關(guān)狀態(tài)來設(shè)置控制功能或輸入數(shù)據(jù)的。當(dāng)所設(shè)置的功能鍵或數(shù)字鍵被按下時,計算機應(yīng)用系統(tǒng)應(yīng)完成該按鍵所設(shè)定的功能。其過程是:首先CPU采用查詢或中斷方式了解有無鍵輸入并檢查是哪一個鍵被按下,然后將該鍵號送入累加器A,再通過散轉(zhuǎn)指令JMP@A+DPTR轉(zhuǎn)入執(zhí)行該鍵的功能程序,執(zhí)行完后返回到主程序。按鍵開關(guān)的去除抖動功能目前, 單片機應(yīng)用系統(tǒng)上的按鍵常采用機械點式按間,它在開關(guān)、閉合是輸入電壓波形如圖3-4所示??梢钥闯鰴C械點在閉和及斷開瞬間均有抖動過程,時間長短與開關(guān)的機械性有關(guān),一般為5-10ms。由于抖動,會造成被查詢的開關(guān)狀態(tài)無法準(zhǔn)確讀出。例如,一次按鍵產(chǎn)生的正確開關(guān)狀態(tài),由于鍵的抖動,CPU多次采集到底電平信號,會被誤認(rèn)為按鍵被多次按下,就會多次進行鍵輸入操作,這是不允許的。為了保證CPU對鍵的一次閉合僅在按鍵穩(wěn)定時作一次鍵輸入處理,必須消除產(chǎn)生的前沿(后沿)抖動影響。圖3-4按鍵過程通常消除抖動影響的方法有硬件、軟件兩種。在按鍵較少時,可采用硬件方法消除抖動。如圖3-5所示,在鍵輸出端加R-S觸發(fā)器構(gòu)成消除抖動電路,可確保每按下一次鍵,只會產(chǎn)生一次低電平輸出。在按鍵較多時,可采用軟件方法消除抖動。根據(jù)按鍵的抖動時間為5-10ms,穩(wěn)定閉合時間一般為十分之幾秒時間的特點,采用軟件消除抖動的方法是:在檢測到有鍵按下時,執(zhí)行一個10ms左右的延時程序,而后,在確認(rèn)該鍵電平是否仍保持閉合狀態(tài)電平,若仍保持為閉合狀態(tài)電平,則確認(rèn)為該鍵處于閉合狀態(tài),這實際上是避開了按鍵按下時的抖動時間。同理,在檢測到該鍵釋放后,也采用相同的步驟進行確認(rèn),從而可消除抖動的影響。圖3-5去抖動開關(guān)電路(3).鍵盤控制程序應(yīng)完成的功能a.監(jiān)測有無鍵按下。b.有鍵按下后,在無硬件消除抖動電路情況下,應(yīng)用軟件延時方法消除抖動影響。c.有可靠的邏輯處理辦法。每次只處理一個按鍵,其間任何按下又松開的鍵不產(chǎn)生影響,不管一次按鍵持續(xù)有多長時間,僅執(zhí)行一次按鍵功能程序。d.輸出確定的鍵號以滿足散轉(zhuǎn)指令的要求。3.4單片機對非編碼鍵盤的控制方式獨立式鍵盤的接口電路及編程(1)獨立式鍵盤的接口電路:在單片機應(yīng)用系統(tǒng)中,有時只需要幾個簡單的按鍵向系統(tǒng)輸入信息。這時,可將每個按鍵直接接在一根I/O接口線上,這種連接方式的鍵盤稱為獨立式鍵盤。每個獨立按鍵單獨占有一根I/O接口線,每根I/O接口線的工作狀態(tài)不會影響到其他I/O接口線。這種按鍵接口電路配置靈活,硬件結(jié)構(gòu)簡單,但每個按鍵必須占用一根I/O線,I/O接口線浪費較大。故只在按鍵數(shù)量不多時采用這種按鍵電路。在此電路中,按鍵輸入都采用低電平有效。上拉電阻保證了按鍵斷開時,I/O接口線有確定的高電平。當(dāng)I/O接口內(nèi)部有上拉電阻時,外電路可以不配置上拉電阻。獨立式鍵盤的編程:獨立式鍵盤的編程常采用查詢式結(jié)構(gòu)。先逐位查詢每根I/O接口線的輸入狀態(tài),如某一根I/O接口線輸入為低電平,則可確認(rèn)該I/O接口線所對應(yīng)的按鍵已按下,然后,再轉(zhuǎn)向該鍵的功能處理程序。3.5矩陣式按鍵方式該系統(tǒng)中我們運用的是3*4的矩陣按鍵,最常見的鍵盤布局如圖3-6所示。一般由16個按鍵組成,在單片機中正好可以用一組I/O口實現(xiàn)16個按鍵功能,這也是在單片機系統(tǒng)中最常用的形式,本設(shè)計就采用這個鍵盤模式3*4的矩陣按鍵。圖3-6按鍵布局根據(jù)上述按鍵的按鍵處理過程列出按鍵處理流程圖,流程圖如下:圖3-7按鍵處理流程圖按鍵程序設(shè)計部分參考:附錄3:程序源代碼.3.6復(fù)位電路單片機在開機時或在工作中因干擾而使程序失控,或工作中程序處于某種死循環(huán)狀態(tài),在這種情況下都需要復(fù)位。復(fù)位的作用是使中央處理器CPU以及其他功能部件都恢復(fù)到一個確定的初始狀態(tài),并從這個狀態(tài)重新開始工作。單片機的復(fù)位靠外部電路實現(xiàn),信號由RESET(RST)引腳輸入,高電平有效,在振蕩器工作時,只要保持RST引腳高電平兩個機器周期,單片機即復(fù)位。復(fù)位后,PC程序計數(shù)器的內(nèi)容為0000H,其他特殊功能寄存器的復(fù)位狀態(tài)如表3.3所示。片內(nèi)RAM中內(nèi)容不變。復(fù)位電路一般有上電復(fù)位、手動開關(guān)復(fù)位和自動復(fù)位電路3種,本設(shè)計采用上電復(fù)位。結(jié)論本次設(shè)計敘述了籃球計時計分器的基本原理及使用方法,給出了一種籃球計時計分器的設(shè)計方案。利用單片機程序設(shè)計原理,來實現(xiàn)籃球計時計分器的各項功能。此次設(shè)計的籃球計時計分器,電路簡單,而且易懂,使操作使用者使用非常方便,成本較低,靈敏可靠,計錄準(zhǔn)確,連接簡單,具有非常高的使用價值。設(shè)計內(nèi)容包括計時器、計分器、到時報警、比分顯示等部分,可以使參加比賽的成員、裁判和觀眾一目了然的看到所有參加者的成績,以最快的速度評出結(jié)果.該籃球計時計分器還能廣泛應(yīng)用于各類知識競賽。本設(shè)計由STC89C52RC編程控制LCD1602作球賽計時計分系統(tǒng)具有賽程定時設(shè)置、賽程時間暫停、性能穩(wěn)定、操作方便且易攜帶等特點??蓮V泛適合各類學(xué)校和小團體作為賽程計時計分。

致謝短暫幾個月的畢業(yè)設(shè)計即將結(jié)束,在此,我首先感謝我的母校,在我們即將步入社會,走向工作崗位之際為我提供了這樣一個良好的學(xué)習(xí)知識與動手操作的機會,并為我提供了先進實驗設(shè)備。通過本次畢業(yè)設(shè)計我受益匪淺,不僅使我學(xué)會了用單片機編寫程序的方法,而且對學(xué)過的相關(guān)知識得到了進一步的鞏固和提高,通過閱讀相關(guān)專業(yè)書籍掌握了一些以前未了解的知識;同時也熟悉了很多的硬件設(shè)備,更重要的是使我在學(xué)習(xí)和掌握這些知識的同時,能夠在思維上得到提高和升華,在分析問題和解決問題的能力上得到培養(yǎng)和提高。這次畢業(yè)設(shè)計使我完善了知識結(jié)構(gòu)、拓寬了知識面,開闊了眼界、提高了對各科知識綜合應(yīng)用的能力;同時也鍛煉和培養(yǎng)了我的基本素質(zhì),它使我更加耐心、謹(jǐn)慎、細(xì)致。在這次畢業(yè)設(shè)計期間,指導(dǎo)老師老師給予了我耐心的輔導(dǎo)和熱情的幫助。對于一些疑難問題老師更是很有耐心、不厭其煩的給予解答,并且在百忙之中對本論文進行了仔細(xì)的審閱,提出了極為寶貴的修改意見和建議,保證了論文的質(zhì)量。使我在畢業(yè)之際為學(xué)校交上了一份滿意的答卷。在此對老師表示衷心的感謝和崇高的敬意。參考文獻[1]康華光。電子技術(shù)基礎(chǔ)(模擬部分)(第四版)。高等教育出版社。北京:1999年。[2]、康華光。電子技術(shù)基礎(chǔ)(數(shù)字部分)(第三版)。高等教育出版社。北京:1999年。[3]趙保經(jīng),中國集成電路大全——CMOS集成電路(第一版)。北京:國防工業(yè)出版社出版。2004[4]彭介華,電子技術(shù)課程設(shè)計指。長沙:高等教育出版社。2001[5]曾祥富,張龍興,童士寬。電子技術(shù)基礎(chǔ)(第一版)。北京:高等教育出版社,2003[6]中國集成電路大全編寫委員會編中國集成電路大全——TTL集成電路(第一版)。北京:國防工業(yè)出版社出版,1985[7]梁宗善.電子技術(shù)基礎(chǔ)課程設(shè)計——中大規(guī)模集成電路應(yīng)用(第一版)。武漢:華中理工大學(xué)出版社。1995

附錄1:系統(tǒng)完整原理圖附錄2:系統(tǒng)完整PCB圖附錄3:系統(tǒng)源代碼#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineLCD1602_datP0 //LCD1602數(shù)據(jù)腳#defineRdCommand0x01//定義ISP的操作命令#definePrgCommand0x02#defineEraseCommand0x03#defineError1#defineOk0#defineWaitTime0x01//定義CPU的等待時間sfrISP_DATA=0xe2;//寄存器申明sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;sbitLCD1602_rs=P2^5; //LCD1602控制腳sbitLCD1602_rw=P2^6;sbitLCD1602_e=P2^7;sbitbeep=P2^0;uintA_dat,B_dat,time=720,time_24=24;ucharseg=1,ms,shu;uintmin,sec;bitstate,time_flag;/*********************************************************************名稱:delay()*功能:小延時。*輸入:無*輸出:無***********************************************************************/voiddelay(uintT){ while(T--);}/*================打開ISP,IAP功能=================*/voidISP_IAP_enable(void){EA=0;/*關(guān)中斷*/ISP_CONTR=ISP_CONTR&0x18;/*0001,1000*/ISP_CONTR=ISP_CONTR|WaitTime;/*寫入硬件延時*/ISP_CONTR=ISP_CONTR|0x80;/*ISPEN=1*/}/*===============關(guān)閉ISP,IAP功能==================*/voidISP_IAP_disable(void){ISP_CONTR=ISP_CONTR&0x7f;/*ISPEN=0*/ISP_TRIG=0x00;EA=1;/*開中斷*/}/*================公用的觸發(fā)代碼====================*/voidISPgoon(void){ISP_IAP_enable();/*打開ISP,IAP功能*/ISP_TRIG=0x46;/*觸發(fā)ISP_IAP命令字節(jié)1*/ISP_TRIG=0xb9;/*觸發(fā)ISP_IAP命令字節(jié)2*/_nop_();}/*====================字節(jié)讀========================*/unsignedcharbyte_read(unsignedintbyte_addr){ISP_ADDRH=(unsignedchar)(byte_addr>>8);/*地址賦值*/ISP_ADDRL=(unsignedchar)(byte_addr&0x00ff);ISP_CMD=ISP_CMD&0xf8;/*清除低3位*/ISP_CMD=ISP_CMD|RdCommand;/*寫入讀命令*/ISPgoon();/*觸發(fā)執(zhí)行*/ISP_IAP_disable();/*關(guān)閉ISP,IAP功能*/return(ISP_DATA);/*返回讀到的數(shù)據(jù)*/}/*==================扇區(qū)擦除========================*/voidSectorErase(unsignedintsector_addr){unsignedintiSectorAddr;iSectorAddr=(sector_addr&0xfe00);/*取扇區(qū)地址*/ISP_ADDRH=(unsignedchar)(iSectorAddr>>8);ISP_ADDRL=0x00;ISP_CMD=ISP_CMD&0xf8;/*清空低3位*/ISP_CMD=ISP_CMD|EraseCommand;/*擦除命令3*/ISPgoon();/*觸發(fā)執(zhí)行*/ISP_IAP_disable();/*關(guān)閉ISP,IAP功能*/}/*====================字節(jié)寫========================*/voidbyte_write(unsignedintbyte_addr,unsignedcharoriginal_data){ISP_ADDRH=(unsignedchar)(byte_addr>>8);/*取地址*/ISP_ADDRL=(unsignedchar)(byte_addr&0x00ff);ISP_CMD=ISP_CMD&0xf8;/*清低3位*/ISP_CMD=ISP_CMD|PrgCommand;/*寫命令2*/ISP_DATA=original_data;/*寫入數(shù)據(jù)準(zhǔn)備*/ISPgoon();/*觸發(fā)執(zhí)行*/ISP_IAP_disable();/*關(guān)閉IAP功能*/}voidread_dat() //將掉電保存到單片機EEPROM中的數(shù)據(jù)讀取出來{ uinti; i=byte_read(0x2000); A_dat=i*256+byte_read(0x2001); i=byte_read(0x2200); B_dat=i*256+byte_read(0x2201); i=byte_read(0x2400); time=i*256+byte_read(0x2401); time_24=byte_read(0x2402); seg=byte_read(0x2403); time_flag=byte_read(0x2404);}/*********************************************************************名稱:LCD1602_write(ucharorder,dat)*功能:1602寫如數(shù)據(jù)函數(shù)*輸入:輸入的命令值*輸出:無***********************************************************************/voidLCD1602_write(ucharorder,dat) //1602一個字節(jié)處理 order為命令與數(shù)據(jù)選擇dat為寫的數(shù)據(jù)內(nèi)容{LCD1602_e=0;LCD1602_rs=order;LCD1602_dat=dat;LCD1602_rw=0;LCD1602_e=1;delay(1);LCD1602_e=0; }/*********************************************************************名稱:LCD1602_writebye(uchar*prointer)*功能:1602寫入數(shù)據(jù)函數(shù)指針式*輸入:輸入的命令值*輸出:無***********************************************************************/voidLCD1602_writebyte(uchar*prointer) //1602字符串處理{while(*prointer!='\0'){LCD1602_write(1,*prointer);prointer++; }}/*********************************************************************名稱:init_1602()*功能:初始化1602液晶*輸入:無*輸出:無***********************************************************************/voidLCD1602_cls() //1602初始化{LCD1602_write(0,0x01);//1602清屏指令 delay(1500);LCD1602_write(0,0x38);//功能設(shè)置8位、5*7點陣 delay(1500);LCD1602_write(0,0x0c);//設(shè)置光標(biāo)不顯示開關(guān)、不顯示光標(biāo)、字符不閃爍LCD1602_write(0,0x06);LCD1602_write(0,0xd0); delay(1500);}voidshow() //1602顯示內(nèi)容部分{ if(seg<3) { LCD1602_write(0,0x81); //A隊得分情況 LCD1602_writebyte("A:"); if(A_dat>99) { LCD1602_write(1,0x30+A_dat/100%10); LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); }elseif(A_dat>9) { LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } LCD1602_write(0,0x89); LCD1602_writebyte("B:"); //B隊得分情況 if(B_dat>99) { LCD1602_write(1,0x30+B_dat/100%10); LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); }elseif(B_dat>9) { LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } }else //后半場A、B對分情況反過來顯示 { LCD1602_write(0,0x89); LCD1602_writebyte("A:"); if(A_dat>99) { LCD1602_write(1,0x30+A_dat/100%10); LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); }elseif(A_dat>9) { LCD1602_write(1,0x30+A_dat/10%10); LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+A_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } LCD1602_write(0,0x81); LCD1602_writebyte("B:"); if(B_dat>99) { LCD1602_write(1,0x30+B_dat/100%10); LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); }elseif(B_dat>9) { LCD1602_write(1,0x30+B_dat/10%10); LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); }else { LCD1602_write(1,0x30+B_dat%10); LCD1602_writebyte(""); LCD1602_writebyte(""); } } LCD1602_write(0,0xc0); switch(seg) { case1: LCD1602_writebyte("1ST"); //籃球比賽的四節(jié)顯示 break; case2: LCD1602_writebyte("2ND"); break; case3: LCD1602_writebyte("3RD"); break; case4: LCD1602_writebyte("4TH"); break; case5: LCD1602_writebyte("OT"); break; case6: LCD1602_writebyte("FINAL"); break; } min=time/60; sec=time%60; LCD1602_write(0,0xc5); if(min>9)LCD1602_write(1,0x30+min/10%10); elseLCD1602_writebyte(""); LCD1602_write(1,0x30+min%10); LCD1602_writebyte(":"); LCD1602_write(1,0x30+sec/10%10); LCD1602_write(1,0x30+sec%10); LCD1602_writebyte(""); LCD1602_write(0,0xc0+12); if(time_24>9)LCD1602_write(1,0x30+time_24/10%10); elseLCD1602_writebyte(""); LCD1602_write(1,0x30+time_24%10);}voidkey() //矩陣按鍵處理程序{ ucharptem; P3=0x0f; if(P3!=0x0f) { delay(1000); //去抖 P3=0x0f; if(P3!=0x0f) { ptem=P3; //將處理好的按鍵地址存入ptem局部變量中 P3=0xf0; ptem=ptem|P3; P3=0x0f; while(P3!=0x0f) //等待釋放 { show(); } switch(ptem) //按鍵地址處理內(nèi)容 { case0xed: A_dat=B_dat=0; time=720; time_24=24; seg=1; time_flag=0; SectorErase(0x2000); byte_write(0x2000,A_dat/256); byte_write(0x2001,A_dat%256); SectorErase(0x2200); byte_write(0x2200,B_dat/256); byte_write(0x2201,B_dat%256); SectorErase(0x2400); byte_write(0x2400,time/256); byte_write(0x2401,time%256); byte_write(0x2402,time_24); byte_write(0x2403,seg); byte_write(0x2404,time_flag); break; case0xeb: state=0; break; case0xe7: state=1; break; case0xdd: if(state==0) { A_dat+=1; SectorErase(0x2000); byte_write(0x2000,A_dat/256); byte_write(0x2001,A_dat%256); }else { B_dat+=1; SectorErase(0x2200); byte_write(0x2200,B_dat/256); byte_write(0x2201,B_dat%256); } break; case0xdb: if(state==0) { A_dat+=2; SectorErase(0x2000); byte_write(0x2000,A_dat/256); byte_write(0x2001,A_dat%256); }else { B_dat+=2; SectorErase(0x2200); byte_write(0x2200,B_dat/256); byte_write(0x2201,B_dat%256); } break; case0xd7: if(state==0) { A_dat+=3; SectorErase(0x2000); byte_write(0x2000,A_dat/256); byte_write(0x2001,A_dat%256); }else { B_dat+=3; SectorErase(0x2200); byte_write(0x2200,B_dat/256); byte_write(0x2201,B_dat%256); } break; case0xbd: if(state==0) { if(A_dat>0)A_dat-=1; SectorErase(0x2000); byte_write(0x2000,A_dat/256); byte_write(0x2001,A_dat%256); }else { if(B_dat>0)B_dat-=1; SectorErase(0x2200); byte_write(0x2200,B_dat/256); byte_write(0x2201,B_dat%256); } break; case0xbb: if(state==0) { if(A_dat>1)A_dat-=2; SectorErase(0x2000); byte_write(0x2000,A_dat/256); byte_write(0x2001,A_dat%256); }else { if(B_dat>1)B_dat-=2; SectorErase(0x2200); byte_write(0x2200,B_dat/256); byte_write(0x2201,B_dat%256); } break; case0xb7: if(state==0) { if(A_dat>2)A_dat-=3; SectorErase(0x2000); byte_write(0x2000,A_dat/256); byte_write(0x2001,A_dat%256); }else { if(B_dat>2)B_dat-=3; SectorErase(0x2200); byte_write(0x2200,B_dat/256); byte_write(0x2201,B_dat%256); } break; case0x7d: if(time!=0) { time_flag=!time_flag; SectorErase(0x2400); byte_write(0x2400,time/256); byte_write(0x2401,time%256); byte_write(0x2402,time_24); byte_write(0x2403,seg); byte_write(0x2404,time_flag); } break; case0x7b: if(time_flag==1) { time_flag=0; if(time>24) { time_24=24; }else { time_24=time; } SectorErase(0x2400); byte_write(0x2400,time/256); byte_write(0x2401,time%256); byte_write(0x2402,time_24); byte_write(0x2403,seg); byte_write(0x2404,time_flag); ms=0; } break; case0x77: if(time_flag==1) { if(time>24) { time_24=24; }else { time_24=time; } SectorErase(0x2400); byte_write(0x2400,time/256); byte_write(0x2401,time%256); byte_write(0x2402,time_24); byte_write(0x2403,seg); byte_write(0x2404,time_flag); ms=0; } break; } } }}/********************************************** 主程序***********************************************/voidmain(void) { TMOD=0x01; //打開定時器0 TH0=0x3c; TL0=0xb0; IE=0x82; TR0=1; read_dat(); LCD1602_cls(); //系統(tǒng)初始化 while(1) { show(); //調(diào)用子函數(shù) key(); }}voidinit_1()interrupt1 //中斷服務(wù)程序處理倒計時情況{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論