基于單片機(jī)的八路搶答器_第1頁(yè)
基于單片機(jī)的八路搶答器_第2頁(yè)
基于單片機(jī)的八路搶答器_第3頁(yè)
基于單片機(jī)的八路搶答器_第4頁(yè)
基于單片機(jī)的八路搶答器_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

..中國(guó)礦業(yè)大學(xué)2016-2017學(xué)年第一學(xué)期電氣工程專(zhuān)業(yè)"創(chuàng)新創(chuàng)業(yè)教育與實(shí)踐"總結(jié)報(bào)告班級(jí)XX學(xué)號(hào)成績(jī)基于單片機(jī)的八路搶答器一、方案比擬與選擇1、根據(jù)目前市場(chǎng)上搶答器的種類(lèi),搶答器的種類(lèi)可以大體分為三種:方案一:搶答器系統(tǒng)的各局部均采用中小規(guī)模集成數(shù)字電路,利用硬件電子元器件實(shí)現(xiàn),用機(jī)械開(kāi)關(guān)按鈕作為控制開(kāi)關(guān),完成搶答輸入信號(hào)的觸發(fā)。如采用74LS148優(yōu)先編碼器來(lái)實(shí)現(xiàn)搶答功能等。該方案的特點(diǎn)是中小規(guī)模集成電路應(yīng)用技術(shù)成熟,性能可靠,能方便地完成選手搶答的根本功能,沒(méi)有軟件的設(shè)計(jì)局部,不需要編程,但是電路構(gòu)造復(fù)雜,調(diào)試?yán)щy,涉及到的外圍元器件很多,造成搶答器的本錢(qián)較高,并且制作過(guò)程工序比擬煩瑣,不便于安裝與調(diào)試,給實(shí)際操作帶來(lái)很大的麻煩。方案二:系統(tǒng)設(shè)計(jì)主要基于可編程的PLC設(shè)計(jì),系統(tǒng)包括硬件和軟件兩大局部,依據(jù)控制系統(tǒng)的工作原理和技術(shù)性能,將硬件和軟件分開(kāi)設(shè)計(jì)。硬件設(shè)計(jì)局部包括電路原理圖、合理選擇元器件、繪制線路圖,然后對(duì)硬件進(jìn)展調(diào)試、測(cè)試,以到達(dá)設(shè)計(jì)要求。軟件設(shè)計(jì)局部,首先在總體設(shè)計(jì)中完成系統(tǒng)總框圖和各模塊的功能設(shè)計(jì),選擇適宜的編程語(yǔ)言和工具,進(jìn)展代碼設(shè)計(jì)等;最后是對(duì)軟件進(jìn)展調(diào)試、測(cè)試,到達(dá)所需功能要求。方案三:系統(tǒng)采用STC89C52單片機(jī)作為控制核心,其片帶有8KBflashROM,256B的RAM,以及32根I/O口線能滿足設(shè)計(jì)要求。該系統(tǒng)可以完成運(yùn)算控制、信號(hào)識(shí)別以及顯示功能的實(shí)現(xiàn)。利用單片機(jī)程序判斷選手按鍵是否有效,是否有選手違規(guī)搶答,利用程序顯示,啟動(dòng)蜂鳴器報(bào)警,告訴主持人有人違規(guī)操作,搶答無(wú)效。給出相應(yīng)的延時(shí),選手按正常的操作搶答,軟件倒計(jì)時(shí),利用數(shù)碼管的動(dòng)態(tài)掃描,實(shí)現(xiàn)倒計(jì)時(shí)顯示時(shí)間,到5秒相應(yīng)時(shí)間提醒選手時(shí)間快到了,要及時(shí)作答,并啟動(dòng)蜂鳴器。由于采用了單片機(jī),其技術(shù)比擬成熟,應(yīng)用起來(lái)方便、簡(jiǎn)單并且單片機(jī)周?chē)妮o助電路也比擬少,便于控制和實(shí)現(xiàn)。整個(gè)系統(tǒng)具有極其靈活的可編程性,能方便地對(duì)系統(tǒng)進(jìn)展功能的擴(kuò)和更改。2、方案比擬分析第一個(gè)方案中,搶答器由搶答電路、定時(shí)電路、報(bào)警電路和時(shí)序控制電路四個(gè)關(guān)鍵電路局部組成。擴(kuò)展電路是秒鐘脈沖信號(hào)產(chǎn)生電路、譯碼電路、顯示電路等,它的功能很齊全,設(shè)計(jì)的電路也很穩(wěn)定,但是本錢(qián)卻很高,所需集成電路非常多且連線復(fù)雜。而方案二采用可編程PLC設(shè)計(jì)搶答器,但該系統(tǒng)的投入本錢(qián)過(guò)于高昂,軟件編程過(guò)于繁瑣,對(duì)編程的語(yǔ)言掌握程度要求很高,而且PLC在該領(lǐng)域的應(yīng)用很少,普通人對(duì)PLC的理解及掌握都不是很深入,鑒于通用性和節(jié)省的原那么,我們不采用該方案。方案三以單片機(jī)為核心器件,外圍電路采用集成芯片,其可靠性好、構(gòu)造簡(jiǎn)單,不但從性能上優(yōu)于方案一和方案二,而且在使用及其功能的實(shí)現(xiàn)上都較其他方案簡(jiǎn)潔,并且由于單片機(jī)具有優(yōu)越的高集成電路性,使其工作速度更快、效率更高。另外單片機(jī)采用12MHz的晶振,提高了信號(hào)的測(cè)量精度,并且使該系統(tǒng)可以通過(guò)軟件改良來(lái)擴(kuò)功能,經(jīng)濟(jì)實(shí)用,所以我們選用基于單片機(jī)的方案。二、電路原理與設(shè)計(jì)設(shè)計(jì)要求:1、可同時(shí)提供最多包括8個(gè)人〔組〕的搶答數(shù)量。2、需由主持人按下開(kāi)場(chǎng)搶答按鍵后才視為搶答時(shí)間,在這個(gè)時(shí)間前搶答的,視為違規(guī)搶答,要求能顯示出違規(guī)搶答的選手編號(hào)。3、要求當(dāng)主持人按下開(kāi)場(chǎng)搶答的按鍵后,數(shù)碼管進(jìn)展搶答時(shí)間的倒計(jì)時(shí),在這個(gè)倒計(jì)時(shí)完畢后,假設(shè)無(wú)人搶答,蜂鳴器報(bào)警,提示本輪搶答完畢,且這個(gè)搶答時(shí)間可設(shè)置。4、要求具有搶答鎖定功能,即某一選手搶到后,其它選手的搶答功能被鎖定,無(wú)法進(jìn)展搶答,直至下一輪搶答開(kāi)場(chǎng)。5、對(duì)于搶到題目的選手,要求能顯示出該選手的編號(hào),并將其答題時(shí)間進(jìn)展倒計(jì)時(shí)顯示,在倒計(jì)時(shí)完畢后,蜂鳴器報(bào)警,提示本次答題時(shí)間到,且這個(gè)搶答時(shí)間可設(shè)置。6、原始狀態(tài)下?lián)尨饡r(shí)間為30s,答復(fù)下列問(wèn)題時(shí)間為15s。通過(guò)加鍵和減鍵修改上述時(shí)間,改完后再斷電、重新上電即可。1、系統(tǒng)概述整個(gè)系統(tǒng)以STC89C52單片機(jī)為核心器件,其它模塊圍繞著單片機(jī)展開(kāi)。輸入局部包括2個(gè)容,一個(gè)是選手的搶答輸入,另一個(gè)是主持人的控制輸入,由于這兩個(gè)容都是通過(guò)按鍵控制的,所以這里統(tǒng)一使用普通的輕觸開(kāi)關(guān)作為本設(shè)計(jì)的輸入模塊,一共包括8個(gè)選手輸入按鍵和2個(gè)主持人輸入按鍵。輸出局部那么采用蜂鳴器加四位共陽(yáng)數(shù)碼管進(jìn)展聲光的輸出,蜂鳴器主要起到報(bào)警的作用,這里主要有幾個(gè)需蜂鳴器發(fā)出報(bào)警的地方,如最后5秒仍無(wú)人搶答、答題剩余最后5秒、搶答時(shí)間完畢以及答題時(shí)間完畢等。而數(shù)碼管那么主要用于信息的輸出,包括當(dāng)主持人按下開(kāi)場(chǎng)搶答按鍵后,顯示30秒〔默認(rèn)〕的倒計(jì)時(shí),當(dāng)有選手違規(guī)搶答時(shí),顯示違規(guī)選手的編號(hào),有人搶到題目時(shí),顯示選手編號(hào)以及該選手剩余的答題時(shí)間。系統(tǒng)框圖:蜂鳴器報(bào)警模塊STC89C52最小系統(tǒng)蜂鳴器報(bào)警模塊STC89C52最小系統(tǒng)選手搶答輸入選手搶答輸入數(shù)碼管顯示模塊主持人控制輸入數(shù)碼管顯示模塊主持人控制輸入圖11〕、最小系統(tǒng)電路STC89C52的最小系統(tǒng)如圖2所示,整個(gè)最小系統(tǒng)由4個(gè)局部組成,晶振電路局部、復(fù)位電路局部、P0口上拉電路局部以及程序下載口局部。30pF的電容C4和C5以及12M的晶振X1構(gòu)成了單片機(jī)的晶振電路,2個(gè)小電容的作用是幫助X1起振。復(fù)位電路由10uF的電解電容C1和10K的電阻R2構(gòu)成,本復(fù)位電路包括上電自復(fù)位和按鍵復(fù)位2個(gè)功能。本設(shè)計(jì)將P0口用作數(shù)碼管的數(shù)據(jù)口,因此在P0口接了一個(gè)10K的排阻,使得P0口可以作為普通的I/O口使用,最后,為了方便調(diào)試和下載,還把P30、P31、GND和VCC這4個(gè)引腳通過(guò)排針引出來(lái)作為程序的下載口。圖22〕、鍵盤(pán)掃描電路鍵盤(pán)是人與單片機(jī)打交道的主要設(shè)備。站在系統(tǒng)監(jiān)控軟件設(shè)計(jì)的立場(chǎng)上來(lái)看,僅僅完成鍵盤(pán)掃描、讀取當(dāng)前時(shí)刻的鍵盤(pán)狀態(tài)是不夠的,還有不少問(wèn)題需要妥善解決,否那么在操作鍵盤(pán)時(shí)就會(huì)出現(xiàn)誤操作和操作失控現(xiàn)象。在單片機(jī)應(yīng)用中,鍵盤(pán)用得最多的形式是獨(dú)立鍵盤(pán)及矩陣鍵盤(pán)。它們各有自己的特點(diǎn),其中獨(dú)立鍵盤(pán)硬件電路簡(jiǎn)單,而且在程序設(shè)計(jì)上也不復(fù)雜,一般用在對(duì)硬件電路要求不高的簡(jiǎn)單電路中;矩陣鍵盤(pán)與獨(dú)立鍵盤(pán)有很大區(qū)別,首先在硬件電路上它要比獨(dú)立鍵盤(pán)復(fù)雜得多,而且在程序算法上比它要繁瑣,但它在節(jié)省端口資源上有優(yōu)勢(shì)得多,因此它更適合于多按鍵電路。其次就是消除在按鍵過(guò)程中產(chǎn)生的"毛刺〞現(xiàn)象。這里采用最常用的方法,即延時(shí)重復(fù)掃描法,延時(shí)法的原理為:因?yàn)?毛刺〞脈沖一般持續(xù)時(shí)間短,約為幾ms,而我們按鍵的時(shí)間一般遠(yuǎn)遠(yuǎn)大于這個(gè)時(shí)間,所以當(dāng)單片機(jī)檢測(cè)到有按鍵動(dòng)靜后再延時(shí)一段時(shí)間后再判斷此電平是否保持原狀態(tài),如果是那么為有效按鍵,否那么無(wú)效。本設(shè)計(jì)中采用了獨(dú)立鍵盤(pán)的方式,有8個(gè)搶答按鍵輸入、一個(gè)復(fù)位按鍵以及一個(gè)主持人使用的開(kāi)場(chǎng)搶答按鍵,同時(shí)為了簡(jiǎn)化電路設(shè)計(jì)、節(jié)約單片機(jī)的I/O口資源,將設(shè)置搶答時(shí)間和答題時(shí)間等這些功能按鍵復(fù)合到了8個(gè)選手的搶答按鍵中。圖33〕、蜂鳴器報(bào)警電路由于蜂鳴器工作時(shí)需要的電流比擬大,單片機(jī)的IO口輸出的電流又比擬小,所以這里利用三極管來(lái)控制蜂鳴器發(fā)音,本設(shè)計(jì)選用的三極管型號(hào)是PNP三極管S8550,而且本設(shè)計(jì)選用的蜂鳴器屬于有源蜂鳴器,即在蜂鳴器部已經(jīng)置了震蕩電路,單片機(jī)無(wú)需連續(xù)發(fā)出上下電平來(lái)驅(qū)動(dòng)它,而只要輸出高〔或低〕電平即可,這大大簡(jiǎn)化了單片機(jī)程序的設(shè)計(jì),由于選用的是PNP型而單片機(jī)上電IO口默認(rèn)是高電平的,所以上電時(shí)蜂鳴器是不會(huì)發(fā)出鳴叫的。蜂鳴器電路如圖4所示。圖44〕、數(shù)碼管顯示電路顯示功能與硬件關(guān)系極大,當(dāng)硬件固定后,如何在不引起操作者誤解的前提下提供盡可能豐富的信息全靠軟件來(lái)解決。在這里我們使用的是七段數(shù)碼管顯示,通常在顯示上我們采用的方法一般包括兩種:一種是靜態(tài)顯示,一種是動(dòng)態(tài)顯示。其中靜態(tài)顯示的特點(diǎn)是顯示穩(wěn)定不閃爍,程序編寫(xiě)簡(jiǎn)單,但占用端口資源多;動(dòng)態(tài)顯示的特點(diǎn)是顯示穩(wěn)定性沒(méi)靜態(tài)好,程序編寫(xiě)復(fù)雜,但是相對(duì)靜態(tài)顯示而言占用端口資源少。在本設(shè)計(jì)中根據(jù)實(shí)際情況采用的是動(dòng)態(tài)顯示方法。數(shù)碼管還分共陽(yáng)型和共陰型,本設(shè)計(jì)采用的是4位共陽(yáng)數(shù)碼管。通過(guò)查表法,將其在數(shù)碼管上顯示出來(lái),其中P0口為字型碼輸入端,P2口低4位為字選段輸入端。在這里我們通過(guò)查表將字型碼送給7段數(shù)碼管,4位七段數(shù)碼管顯示電路如圖5所示。其中A、B、C、D、E、F、G、DP段分別接到單片機(jī)的P0口,由單片機(jī)P0口輸出的數(shù)據(jù)來(lái)決定段碼值,位選碼W1、W2、W3、W4分別接到單片機(jī)的P2^0、P2^1、P2^2以及P2^3上,由單片機(jī)來(lái)決定當(dāng)前該顯示的是哪一位。由于單片機(jī)的I/O口驅(qū)動(dòng)電流不夠,這里還使用了4個(gè)NPN的三極管S8050對(duì)電流放大來(lái)驅(qū)動(dòng)數(shù)碼管的位選。圖5設(shè)計(jì)電路圖〔原理圖、PCB圖〕三、程序設(shè)計(jì)1、總體程序設(shè)計(jì)八路搶答器的整體程序流程圖如圖6所示,程序從定時(shí)器的初始化開(kāi)場(chǎng),這里用到了單片機(jī)的2個(gè)定時(shí)器,1個(gè)用于數(shù)碼管的動(dòng)態(tài)掃描,另一個(gè)用于答題時(shí)間的計(jì)時(shí)。接著程序開(kāi)場(chǎng)判斷是否進(jìn)入搶答時(shí)間設(shè)置,如果有那么進(jìn)入搶答時(shí)間設(shè)置模式,沒(méi)有那么繼續(xù)判斷是否進(jìn)入答題時(shí)間設(shè)置,如果有那么進(jìn)入答題時(shí)間設(shè)置模式,沒(méi)有那么跳出,進(jìn)入主程序的大循環(huán)。進(jìn)入大循環(huán)之后,就掃描是否有按鍵按下,有的話就判斷是哪個(gè)按鍵,如果是主持人按下了開(kāi)場(chǎng)搶答按鍵,那么進(jìn)入搶答模式,如果是選手按下了搶答鍵,那么蜂鳴器報(bào)警,此時(shí)有選手違規(guī)搶答〔即在主持人按下開(kāi)場(chǎng)搶答按鍵前就搶答了〕,同時(shí)將違規(guī)選手的編號(hào)顯示在數(shù)碼管上,直至主持人按下復(fù)位鍵,那么去除報(bào)警狀態(tài)。如果一直沒(méi)檢測(cè)到按鍵按下,那么一直在大循環(huán)里面掃描按鍵。進(jìn)入搶答模式后,數(shù)碼管開(kāi)場(chǎng)將搶答時(shí)間倒計(jì)時(shí)并顯示在數(shù)碼管上,如果在搶答時(shí)間無(wú)人搶答,那么在最后5秒蜂鳴器發(fā)出滴滴的報(bào)警聲,并且5秒完畢后,蜂鳴器一直鳴叫,表示此輪搶答完畢,并且數(shù)碼管顯示"----〞,直至主持人按下復(fù)位鍵退出報(bào)警。如果在搶答時(shí)間有選手搶答題目時(shí),那么在數(shù)碼管將選手的編號(hào)顯示出來(lái),并顯示答題時(shí)間的倒計(jì)時(shí),同搶答時(shí)間一樣,在最后5秒蜂鳴器會(huì)發(fā)出滴滴的報(bào)警聲,答題時(shí)間完畢后,蜂鳴器也會(huì)一直鳴叫,表示此輪搶答完畢,直至主持人按下復(fù)位鍵退出報(bào)警。開(kāi)場(chǎng)開(kāi)場(chǎng)是是否設(shè)置搶答時(shí)間是是否設(shè)置搶答時(shí)間設(shè)置搶答時(shí)間設(shè)置搶答時(shí)間否否是是設(shè)置答題時(shí)間是否設(shè)置答題時(shí)間設(shè)置答題時(shí)間是否設(shè)置答題時(shí)間否否等待按鍵按下等待按鍵按下是是是否違規(guī)搶答是否違規(guī)搶答否是發(fā)出警報(bào)完畢答題倒計(jì)時(shí)是否有選手搶答否否是發(fā)出警報(bào)完畢答題倒計(jì)時(shí)是否有選手搶答否圖61〕、搶答、答題時(shí)間設(shè)置為了簡(jiǎn)化搶答器的硬件電路,將搶答時(shí)間和答題時(shí)間的設(shè)置按鍵和搶答鍵合并到了一起。如需設(shè)置搶答時(shí)間,先斷開(kāi)搶答器的電源,然后按下按鍵一〔選手一的搶答鍵〕,然后上電,系統(tǒng)上電檢測(cè)到按鍵一被按下了,那么就進(jìn)入到搶答時(shí)間的設(shè)置,通過(guò)按鍵七〔減〕和按鍵八〔加〕來(lái)設(shè)置答題時(shí)間的大小。答題時(shí)間的設(shè)置也根本類(lèi)似,只不過(guò)是在上電前按下按鍵二而已。2〕、數(shù)碼管動(dòng)態(tài)掃描程序?yàn)榱撕?jiǎn)化程序、合理利用單片機(jī)的部資源,所以將數(shù)碼管的動(dòng)態(tài)掃描程序通過(guò)定時(shí)器來(lái)實(shí)現(xiàn)。本設(shè)計(jì)設(shè)置的定時(shí)器發(fā)生中斷的時(shí)間為2毫秒,每次顯示四位中的一位,因此完成四位數(shù)碼管的掃描需要8毫秒的時(shí)間,即發(fā)生四次定時(shí)器中斷。四、測(cè)試方案先在Proteus里畫(huà)好電路總體原理圖,再將寫(xiě)好的C程序文件用Keil編譯生成hex文件載入單片機(jī)里,需要仿真的功能同設(shè)計(jì)要求。五、系統(tǒng)調(diào)試焊接好實(shí)物,上電對(duì)所設(shè)計(jì)的功能進(jìn)展驗(yàn)證,記錄現(xiàn)場(chǎng)。六、仿真調(diào)試與事物驗(yàn)證1、仿真記錄1〕、搶答時(shí)間調(diào)整2〕、答題時(shí)間調(diào)整3〕、違規(guī)搶答4〕、正確搶答2、實(shí)物驗(yàn)證1〕、上電初始狀態(tài)2〕、正確搶答3〕、4號(hào)違規(guī)搶答4〕、搶答時(shí)間調(diào)整5〕、答題時(shí)間調(diào)整6〕、時(shí)間調(diào)整后8號(hào)正確搶答七、總結(jié)本次研究設(shè)計(jì)的八路搶答器利用STC89C52單片機(jī)及外圍接口實(shí)現(xiàn)各種功能,將軟硬件有機(jī)的結(jié)合起來(lái)。通過(guò)這次設(shè)計(jì),我們學(xué)會(huì)了如何將學(xué)到的知識(shí)化為自己的東西,學(xué)會(huì)了怎么更好的處理理論和實(shí)踐相結(jié)合的問(wèn)題,把握重點(diǎn)、攻克難關(guān)、活學(xué)活用。此外,還可以將設(shè)計(jì)的擴(kuò)展功能增強(qiáng):可以設(shè)計(jì)聲控裝置,在主持人說(shuō)"開(kāi)場(chǎng)"時(shí),系統(tǒng)自動(dòng)進(jìn)入搶答流程;增加計(jì)分模塊,可以設(shè)定初始分?jǐn)?shù)并記錄每次搶答完成后的總分;將搶答按鍵使用無(wú)線實(shí)現(xiàn),如紅外線,使搶答者可遠(yuǎn)距離進(jìn)展搶答,并簡(jiǎn)化按鍵模塊的線路布置。相信基于單片機(jī)的搶答器在市場(chǎng)上更有競(jìng)爭(zhēng)力和市場(chǎng)。八、參考文獻(xiàn)[1]平.單片機(jī)的原理與接口技術(shù)[M].:電子工業(yè),2006.[2]王忠民.微型計(jì)算機(jī)原理[M].:科技大學(xué),2003[3]紀(jì)宗南.單片機(jī)外圍器件使用手冊(cè)[M].:航空航天大學(xué)[4]余永權(quán).單片機(jī)在控制系統(tǒng)中的應(yīng)用[M].:電子工業(yè)[5]周潤(rùn)景,麗娜.基于PROTEUS的電路及單片機(jī)系統(tǒng)設(shè)計(jì)與仿真[M].:航空航天大學(xué)[6]唐俊翟.單片機(jī)原理與應(yīng)用[M].:冶金工業(yè):252-267[7]康華光.電子技術(shù)根底(數(shù)字局部)〔第四版〕[M].:高等教育,2003九、附錄程序#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsfrISP_DATA=0xe2; //數(shù)據(jù)存放器中sfrISP_ADDRH=0xe3; //地址存放器高八位sfrISP_ADDRL=0xe4; //地址存放器低八位sfrISP_CMD=0xe5; //命令存放器sfrISP_TRIG=0xe6; //命令觸發(fā)存放器sfrISP_CONTR=0xe7; //命令存放器sbitw1=P2^3; //定義了數(shù)碼管第1位的控制腳sbitw2=P2^2; //定義了數(shù)碼管第2位的控制腳sbitw3=P2^1; //定義了數(shù)碼管第3位的控制腳sbitw4=P2^0; //定義了數(shù)碼管第4位的控制腳sbitk1=P1^0; //定義了選手1的搶答按鍵〔可用于進(jìn)入設(shè)置時(shí)間〕sbitk2=P1^1; //定義了選手2的搶答按鍵〔可用于進(jìn)入設(shè)置時(shí)間〕sbitk3=P1^2; //定義了選手3的搶答按鍵sbitk4=P1^3; //定義了選手4的搶答按鍵sbitk5=P1^4; //定義了選手5的搶答按鍵sbitk6=P1^5; //定義了選手6的搶答按鍵sbitk7=P1^6; //定義了選手7的搶答按鍵〔設(shè)置時(shí)間時(shí),是"減〞的功能〕sbitk8=P1^7;//定義了選手8的搶答按鍵〔設(shè)置時(shí)間時(shí),是"加〞的功能〕sbitk9=P3^7; //定義了開(kāi)場(chǎng)搶答的按鍵sbitbp=P2^6; //定義蜂鳴器的控制引腳/*數(shù)碼管的顯示值:0123456789ABCDEF-*/ucharcodeShowDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};uchardig[4]; //dig[0]、dig[1]、dig[2]、dig[3]分別代表了四位數(shù)碼管顯示的容chargWaitTime,gAnswerTime; //gWaitTime是搶答等待時(shí)間,gAnswerTime是答題等待時(shí)間chargCount,gSecond; //gCount是用于計(jì)數(shù)的,gSecond是用于記錄當(dāng)前的剩余秒數(shù)的〔搶答時(shí)間和答題〕/*********************************************************///單片機(jī)部EEPROM不使能/*********************************************************/voidISP_Disable(){ISP_CONTR=0;ISP_ADDRH=0;ISP_ADDRL=0;}/*********************************************************///從單片機(jī)部EEPROM讀一個(gè)字節(jié),從0x2000地址開(kāi)場(chǎng)/*********************************************************/unsignedcharByte_Read(unsignedintadd){ISP_DATA=0x00;ISP_CONTR=0x83;ISP_CMD=0x01;ISP_ADDRH=(unsignedchar)(add>>8);ISP_ADDRL=(unsignedchar)(add&0xff);ISP_TRIG=0x46; //對(duì)STC89C51系列來(lái)說(shuō),每次要寫(xiě)入0x46,ISP_TRIG=0xB9; //再寫(xiě)入0xB9,ISP/IAP才會(huì)生效_nop_();ISP_Disable();return(ISP_DATA); //將讀出的數(shù)據(jù)作為函數(shù)的返回值}/*********************************************************///往單片機(jī)部EEPROM寫(xiě)一個(gè)字節(jié),從0x2000地址開(kāi)場(chǎng)/*********************************************************/voidByte_Program(unsignedintadd,unsignedcharch){ISP_CONTR=0x83;ISP_CMD=0x02;ISP_ADDRH=(unsignedchar)(add>>8);ISP_ADDRL=(unsignedchar)(add&0xff);ISP_DATA=ch;ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_();ISP_Disable();}/*********************************************************///擦除單片機(jī)部EEPROM的一個(gè)扇區(qū),寫(xiě)8個(gè)扇區(qū)中隨便一個(gè)的//地址,便將該扇區(qū)整個(gè)擦除,寫(xiě)入數(shù)據(jù)前要先擦除/*********************************************************/voidSector_Erase(unsignedintadd) //{ISP_CONTR=0x83;ISP_CMD=0x03;ISP_ADDRH=(unsignedchar)(add>>8);ISP_ADDRL=(unsignedchar)(add&0xff);ISP_TRIG=0x46;ISP_TRIG=0xB9;_nop_();ISP_Disable();}/*********************************************************///毫秒級(jí)延時(shí)函數(shù)/*********************************************************/voidDelayMs(uintn){uintx,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}/*********************************************************///定時(shí)器初始化/*********************************************************/voidTimerInit(){TMOD=0x11; //定時(shí)器0用于數(shù)碼管的動(dòng)態(tài)掃描,定時(shí)器1用于秒數(shù)的計(jì)時(shí)TH0=(65536-1000)/256; //給定時(shí)器0的TH0裝初值TL0=(65536-1000)%256; //給定時(shí)器0的TL0裝初值TH1=(65536-50000)/256; //給定時(shí)器1的TH1裝初值TL1=(65536-50000)%256; //給定時(shí)器1的TL1裝初值TR0=1; //啟動(dòng)定時(shí)器0〔開(kāi)場(chǎng)動(dòng)態(tài)掃描數(shù)碼管〕ET0=1; //定時(shí)器0中斷使能ET1=1; //定時(shí)器1中斷使能EA=1; //翻開(kāi)總中斷}/*********************************************************///判斷是否進(jìn)入等待時(shí)間設(shè)置/*********************************************************/voidWaitTimeSet(void){if(k1==0) //判斷按鍵1是否有按下,等于0代表按鍵按下了,那么進(jìn)入搶答時(shí)間設(shè)置模式 { //數(shù)碼管顯示"EEEE〞dig[0]=ShowDig[14];dig[1]=ShowDig[14];dig[2]=ShowDig[14];dig[3]=ShowDig[14];while(!k1); //等待按鍵釋放DelayMs(500); //利用延時(shí)去抖dig[1]=ShowDig[17]; //數(shù)碼管顯示"EEE〞dig[2]=ShowDig[gWaitTime/10]; //數(shù)碼管顯示"E30〞〔30就是要設(shè)置搶答時(shí)間,30只是個(gè)例子,具體數(shù)字視具體情況而定〕dig[3]=ShowDig[gWaitTime%10];while(k1) //當(dāng)再次按下按鍵1時(shí),退出搶答時(shí)間設(shè)置模式,否那么一直掃描"加〞、"減〞按鍵 {if(k8==0) //判斷"加〞按鍵是否被按下 {DelayMs(250); //利用延時(shí)去抖gWaitTime++; //當(dāng)前要設(shè)置的秒數(shù)自加1if(gWaitTime==100) //當(dāng)自加到100時(shí),自動(dòng)清零gWaitTime=0; Sector_Erase(0x2000); //擦除部EEPROM〔寫(xiě)入之前必須先擦除〕Byte_Program(0x2000,gWaitTime); //將新設(shè)置的等待時(shí)間寫(xiě)入到部EEPROM的0x2000這個(gè)地址Byte_Program(0x2001,gAnswerTime); //將答題時(shí)間寫(xiě)入到部EEPROM的0x2001這個(gè)地址dig[2]=ShowDig[gWaitTime/10]; //更新數(shù)碼管的秒數(shù)顯式〔十位〕dig[3]=ShowDig[gWaitTime%10]; //更新數(shù)碼管的秒數(shù)顯式〔個(gè)位〕 }if(k7==0) //判斷"減〞按鍵是否被按下 {DelayMs(250); //利用延時(shí)去抖gWaitTime--; //當(dāng)前要設(shè)置的秒數(shù)自減1if(gWaitTime==-1) //當(dāng)自減到-1時(shí),自動(dòng)變成99gWaitTime=99; Sector_Erase(0x2000); //擦除部EEPROM〔寫(xiě)入之前必須先擦除〕Byte_Program(0x2000,gWaitTime); //將新設(shè)置的等待時(shí)間寫(xiě)入到部EEPROM的0x2000這個(gè)地址Byte_Program(0x2001,gAnswerTime); //將答題時(shí)間寫(xiě)入到部EEPROM的0x2001這個(gè)地址dig[2]=ShowDig[gWaitTime/10]; //更新數(shù)碼管的秒數(shù)顯式〔十位〕dig[3]=ShowDig[gWaitTime%10]; //更新數(shù)碼管的秒數(shù)顯式〔個(gè)位〕 } }while(!k1);DelayMs(500); }}/*********************************************************///判斷是否進(jìn)入答題時(shí)間設(shè)置/*********************************************************/voidAnswerTimeSet(void){ if(k2==0) //判斷按鍵2是否有按下,等于0代表按鍵按下了,那么進(jìn)入答題時(shí)間設(shè)置模式 { //數(shù)碼管顯示"FFFF〞dig[0]=ShowDig[15];dig[1]=ShowDig[15];dig[2]=ShowDig[15];dig[3]=ShowDig[15];while(!k2); //等待按鍵釋放DelayMs(500); //利用延時(shí)去抖dig[1]=ShowDig[17]; //數(shù)碼管顯示"FFF〞dig[2]=ShowDig[gAnswerTime/10]; //數(shù)碼管顯示"F15〞〔15就是要設(shè)置答題時(shí)間,15只是個(gè)例子,具體數(shù)字視具體情況而定〕dig[3]=ShowDig[gAnswerTime%10];while(k2) //當(dāng)再次按下按鍵2時(shí),退出搶答時(shí)間設(shè)置模式,否那么一直掃描"加〞、"減〞按鍵 {if(k8==0) {DelayMs(250); //利用延時(shí)去抖gAnswerTime++; //當(dāng)前要設(shè)置的秒數(shù)自加1if(gAnswerTime==100) //當(dāng)自加到100時(shí),自動(dòng)清零gAnswerTime=0; Sector_Erase(0x2000); //擦除部EEPROM〔寫(xiě)入之前必須先擦除〕Byte_Program(0x2000,gWaitTime); //將等待時(shí)間寫(xiě)入到部EEPROM的0x2000這個(gè)地址Byte_Program(0x2001,gAnswerTime); //將新設(shè)置的答題時(shí)間寫(xiě)入到部EEPROM的0x2001這個(gè)地址dig[2]=ShowDig[gAnswerTime/10]; //更新數(shù)碼管的秒數(shù)顯式〔十位〕dig[3]=ShowDig[gAnswerTime%10]; //更新數(shù)碼管的秒數(shù)顯式〔個(gè)位〕 }if(k7==0) //判斷"減〞按鍵是否被按下 {DelayMs(250); //利用延時(shí)去抖gAnswerTime--; //當(dāng)前要設(shè)置的秒數(shù)自減1if(gAnswerTime==-1) //當(dāng)自減到-1時(shí),自動(dòng)變成99gAnswerTime=99; Sector_Erase(0x2000); //擦除部EEPROM〔寫(xiě)入之前必須先擦除〕Byte_Program(0x2000,gWaitTime); //將等待時(shí)間寫(xiě)入到部EEPROM的0x2000這個(gè)地址Byte_Program(0x2001,gAnswerTime); //將新設(shè)置的答題時(shí)間寫(xiě)入到部EEPROM的0x2001這個(gè)地址dig[2]=ShowDig[gAnswerTime/10]; //更新數(shù)碼管的秒數(shù)顯式〔十位〕dig[3]=ShowDig[gAnswerTime%10]; //更新數(shù)碼管的秒數(shù)顯式〔個(gè)位〕 } }while(!k2); //等待按鍵釋放DelayMs(500); //利用延時(shí)去抖 }}/*********************************************************///按鍵掃描程序,如果檢測(cè)到?jīng)]有按鍵按下,那么返回0/*********************************************************/ucharKeyScanf(void){if(k1==0) //選手1按下,返回1return1;if(k2==0) //選手2按下,返回2return2;if(k3==0) //選手3按下,返回3return3;if(k4==0) //選手4按下,返回4return4;if(k5==0) //選手5按下,返回5return5;if(k6==0) //選手6按下,返回6return6;if(k7==0) //選手7按下,返回7return7;if(k8==0) //選手8按下,返回8return8;if(k9==0) //開(kāi)場(chǎng)搶答按鍵按下,返回9return9;return0; }/*********************************************************///主函數(shù)/*********************************************************/voidmain(void){ ucharret; //ret用于保存按鍵掃描程序的返回值TimerInit();//新單片機(jī)下載程序請(qǐng)翻開(kāi),因?yàn)镋EPROM的部數(shù)據(jù)讀取出來(lái)是亂碼,下載完第一次之后就可以注釋掉這3行代碼// Sector_Erase(0x2000); // Byte_Program(0x2000,30);// Byte_Program(0x2001,15);gWaitTime=Byte_Read(0x2000); //讀取EEPROM中設(shè)置溫度上限的報(bào)警值,并賦給全局變量gAnswerTime=Byte_Read(0x2001); //讀取EEPROM中設(shè)置溫度下限的報(bào)警值,并賦給全局變量WaitTimeSet(); //判斷是否要進(jìn)入等待時(shí)間設(shè)置模式AnswerTimeSet(); //判斷是否要進(jìn)入答題時(shí)間設(shè)置模式dig[0]=ShowDig[0]; //數(shù)碼管顯示"0000〞dig[1]=ShowDig[0];dig[2]=ShowDig[0];dig[3]=ShowDig[0];while(1) {if(KeyScanf()!=0) //當(dāng)按鍵掃描程序的返回值不是0時(shí),代表有按鍵被按下 {ret=KeyScanf(); //保存按鍵掃描程序的返回值while(KeyScanf()); //等待按鍵釋放DelayMs(500); //利用延時(shí)去抖if(ret==9) //如果是開(kāi)場(chǎng)搶答按鍵被按下 {TR1=1; //啟動(dòng)定時(shí)器,即開(kāi)場(chǎng)秒數(shù)的倒計(jì)時(shí)dig[0]=ShowDig[17]; //數(shù)碼管顯示"00〞dig[1]=ShowDig[17];gSecond=gWaitTime; //此時(shí),gSecond代表了具體有多少秒需要倒計(jì)時(shí)while(!KeyScanf()) //如果一直沒(méi)有人按鍵,那么一直判斷秒數(shù)是不是計(jì)到0了 {if(gSecond==0) //如果計(jì)數(shù)到0了,數(shù)碼管顯示"----〞,表示此輪搶答完畢 {dig[2]=ShowDig[16];dig[3]=ShowDig[16]; }else //如果沒(méi)有計(jì)到0,那么數(shù)碼管一直顯示當(dāng)前倒數(shù)的秒數(shù) {dig[2]=ShowDig[gSecond/10];dig[3]=ShowDig[gSecond%10]; } }ret=KeyScanf(); //保存按鍵掃描程序的返回值dig[0]=ShowDig[ret]; //數(shù)碼管第一位顯示搶到答題權(quán)限的選手的編號(hào)dig[1]=ShowDig[16]; //數(shù)碼管第二位顯示"-〞gSecond=gAnswerTime; //gSecond代表了答題的時(shí)間〔之前是代表?yè)尨饡r(shí)間〕while(1) //一直判斷秒數(shù)是不是計(jì)到0了 {if(gSecond==0) //如果計(jì)數(shù)到0了,數(shù)碼管顯示"----〞,表示此輪搶答完畢 {dig[2]=ShowDig[16];dig[3]=ShowDig[16];

溫馨提示

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

評(píng)論

0/150

提交評(píng)論