基于51單片機(jī)八路搶答器的設(shè)計(jì).doc
《基于51單片機(jī)八路搶答器的設(shè)計(jì).doc》由會員分享,可在線閱讀,更多相關(guān)《基于51單片機(jī)八路搶答器的設(shè)計(jì).doc(60頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
畢業(yè)設(shè)計(jì)(論文) 題 目: 基于51單片機(jī)的搶答器系統(tǒng)設(shè)計(jì) 函授站點(diǎn): 中國礦業(yè)大學(xué)繼續(xù)教育學(xué)院 學(xué)習(xí)層次: ??? 班級名稱: 徐工技師學(xué)院 函機(jī)電2015班 姓名: 彭乾坤 學(xué)號: 中國礦業(yè)大學(xué)繼續(xù)教育學(xué)院 20 年 月 日 摘 要 隨著科學(xué)技術(shù)的發(fā)展和普及,各種各樣的競賽越來越多,其中搶答器的作用也就顯而易見。目前很多搶答器基本上采用小規(guī)模數(shù)字集成電路設(shè)計(jì),使用起來不夠理想。因此設(shè)計(jì)一更易于使用和區(qū)分度高的搶答器成了非常迫切的任務(wù)?,F(xiàn)在單片機(jī)已進(jìn)入各個領(lǐng)域,以其功耗小、智能化而著稱,所以若利用單片機(jī)來設(shè)計(jì)搶答器,便使以上問題得以解決.針對以上情況,本文設(shè)計(jì)出以STC89C52RC單片機(jī)為核心的八路搶答器。我們采用了數(shù)字顯示器直接指示,自動鎖存顯示結(jié)果,并自動復(fù)位的設(shè)計(jì)思想,它能根據(jù)不同的搶答輸入信號,經(jīng)過單片機(jī)的控制處理并產(chǎn)生不同的與輸入信號相對應(yīng)的輸出信號,最后通過LED數(shù)碼管顯示相應(yīng)的路數(shù),即使兩組的搶答時間相差幾微秒,也可分辨出是哪組優(yōu)先按下的按鍵,它充分利用了單片機(jī)系統(tǒng)的優(yōu)點(diǎn),具有結(jié)構(gòu)簡單、功能強(qiáng)大、可靠性好、實(shí)用性強(qiáng)的特點(diǎn)。 本設(shè)計(jì)是以八路搶答為基本理念??紤]到依需設(shè)定限時回答的功能,利用51單片機(jī)及外圍接口實(shí)現(xiàn)的搶答系統(tǒng),利用單片機(jī)的定時器/計(jì)數(shù)器定時和記數(shù)的原理,將軟、硬件有機(jī)地結(jié)合起來,使得系統(tǒng)能夠正確地進(jìn)行計(jì)時,同時使數(shù)碼管能夠正確地顯示時間。用開關(guān)做鍵盤輸出,揚(yáng)聲器發(fā)生提示。同時系統(tǒng)能夠?qū)崿F(xiàn):在搶答中,只有開始后搶答才有效,如果在開始搶答前搶答為犯規(guī);滿時后系統(tǒng)計(jì)時自動復(fù)位及主控強(qiáng)制復(fù)位;按鍵鎖定,在有效狀態(tài)下,按鍵無效非法。 關(guān)鍵詞:STC89C52RC; 共陰數(shù)碼管; 按鍵 ;蜂鳴器 目 錄 前 言 1 第一章 工作原理 2 1.1設(shè)計(jì)目標(biāo) 2 1.1.1基本功能 2 1.1.2主要技術(shù)參數(shù) 2 第二章 硬件設(shè)計(jì)與原理 3 2.1 總設(shè)計(jì)框圖 3 2.2 硬件設(shè)計(jì)分析 3 2.2.1 電源的設(shè)計(jì) 3 2.2.2 單片機(jī)最小系統(tǒng) 4 2.2.3 數(shù)碼管顯示電路 10 2.2.4 按鍵輸入電路 11 2.2.5 報(bào)警與指示電路 14 第三章 軟件設(shè)計(jì)與分析 15 3.1 軟件設(shè)計(jì)的組成 15 3.2 各部分軟件分析 15 3.2.1 延時子函數(shù) 15 3.2.2 初始化子函數(shù) 15 3.2.3 開始鍵掃描子函數(shù) 16 3.2.4 選手搶答按鍵掃描子函數(shù) 17 3.2.5 顯示子函數(shù) 20 3.2.6 調(diào)整時間鍵掃描子函數(shù) 24 3.2.7 定時器0中斷子函數(shù) 26 3.2.8 定時器1中斷子函數(shù) 27 3.2.9 主函數(shù) 28 3.3 總源程序 30 第四章 軟件仿真 46 4.1 PROTEUS簡介 46 4.2仿真圖 48 4.3原理圖 49 4.4 元件清單 50 4.5 仿真結(jié)果圖 51 總結(jié) 54 致 謝 56 參考文獻(xiàn) 57 前 言 最近幾年來,隨著科技的飛速發(fā)展,單片機(jī)領(lǐng)域正在不斷的走向社會各個角落,還帶動傳統(tǒng)控制檢測日新月異更新。在實(shí)時運(yùn)作和自動控制的單片機(jī)應(yīng)用到系統(tǒng)中,單片機(jī)如今是作為一個核心部件來使用,僅掌握單片機(jī)方面知識是不夠的,還應(yīng)根據(jù)其具體硬件結(jié)構(gòu),以及針對具體應(yīng)用對象特點(diǎn)的軟件結(jié)合,加以完善?!皢纹瑱C(jī)原理及應(yīng)用課程設(shè)計(jì)”是電子類專業(yè)的學(xué)科基礎(chǔ)科,它是繼“匯編語言程序設(shè)計(jì)”,“接口技術(shù)”等課程之后開出的實(shí)踐環(huán)節(jié)課程。 第一章 工作原理 1.1設(shè)計(jì)目標(biāo) 1.1.1基本功能 1、同時供8名選手比賽,分別用8個按鈕K1 ~ K8表示。 2、設(shè)置一個系統(tǒng)搶答控制開關(guān)K0,該開關(guān)由主持人控制。 3、搶答器具有鎖存與顯示功能。即選手按動按鈕,鎖存相應(yīng)的編號,揚(yáng)聲器發(fā)出聲響提示,并在七段數(shù)碼管上顯示選手號碼。選手搶答實(shí)行優(yōu)先鎖存,優(yōu)先搶答選手的編號一直保持到主持人將系統(tǒng)清除為止。 4、搶答器具有定時搶答功能,且一次搶答的時間由主持人設(shè)定(如30秒)。當(dāng)主持人啟動"開始"鍵后,定時器進(jìn)行減計(jì)時。 5、參賽選手在設(shè)定的時間內(nèi)進(jìn)行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答的時間,并保持到主持人將系統(tǒng)清除為止。在這段時間如果定時時間已到,無人搶答,本次搶答無效,系統(tǒng)報(bào)警并禁止搶答,定時顯示器上顯示00。 1.1.2主要技術(shù)參數(shù) 1、在搶答中,只有開始后搶答才有效,如果在開始搶答前搶答為犯規(guī)。 2、搶答限定時間和回答問題的時間是在10~60s設(shè)定。 3、可以顯示是哪位選手有效搶答和無效搶答,正確按鍵后有音提示。 4、搶答時間和回答問題時間倒記時顯示,時間完后系統(tǒng)自動復(fù)位。 5、按鍵鎖定,在有效狀態(tài)下,按鍵無效非法。 第二章 硬件設(shè)計(jì)與原理 以STC89C52RC單片機(jī)為核心,起著控制作用。系統(tǒng)包括數(shù)碼管顯示電路、復(fù)位電路、時鐘電路、按鍵輸入電路和蜂鳴器報(bào)警電路。設(shè)計(jì)思路分為六個模塊:復(fù)位電路、晶振電路模塊、STC89C52RC、數(shù)碼管顯示電路、按鍵輸入電路和蜂鳴器報(bào)警電路這六個模塊。 2.1 總設(shè)計(jì)框圖 2.2 硬件設(shè)計(jì)分析 2.2.1 電源的設(shè)計(jì) 系統(tǒng)電源使用外接直流5伏。 2.2.2 單片機(jī)最小系統(tǒng) 51單片機(jī)是對目前所有兼容intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱。該系列單片機(jī)的始祖是intel的8031單片機(jī),后來隨著技術(shù)的發(fā)展,成為目前廣泛應(yīng)用的8為單片機(jī)之一。單片機(jī)是在一塊芯片內(nèi)集成了CPU、RAM、ROM、定時器/計(jì)數(shù)器和多功能I/O口等計(jì)算機(jī)所需要的基本功能部件的大規(guī)模集成電路,又稱為MCU。51系列單片機(jī)內(nèi)包含以下幾個部件: 一個8位CPU;一個片內(nèi)振蕩器及時鐘電路; 4KB的ROM程序存儲器; 一個128B的RAM數(shù)據(jù)存儲器; 尋址64KB外部數(shù)據(jù)存儲器和64KB外部程序存儲空間的控制電路; 32條可編程的I/O口線; 兩個16位定時/計(jì)數(shù)器; 一個可編程全雙工串行口; 5個中斷源、兩個優(yōu)先級嵌套中斷結(jié)構(gòu)。 如圖2-2-1所示為STC89C52RC單片機(jī)基本構(gòu)造,其基本性能介紹如下: 圖2-2-1 STC89C52RC單片機(jī) STC89C52RC本身內(nèi)含40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中端口,3個16位可編程定時計(jì)數(shù)器,2個全雙工串行通信口,STC89C51RC可以按照常規(guī)方法進(jìn)行編程,但不可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)成本。 STC89C52RC的主要特性如下表所示: 兼容MCS—51指令系統(tǒng) 32個可編程I/O線 4k字節(jié)可編程閃爍存儲器 可編程UARL通道 三個16位可編程定時/計(jì)數(shù)器中斷 時鐘頻率0-24MHz 2個外部中斷源,共8個中斷源 2568bit內(nèi)部RAM 2個讀寫中斷口線 可直接驅(qū)動LED 軟件設(shè)置睡眠和喚醒功能 低功耗空閑和掉電模式 表2-2-1 STC89C52RC主要功能描述 STC89C52RC為40腳雙列直插封裝的8位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52相同,其主要用于會聚調(diào)整時的功能控制。功能包括對會聚主IC內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會聚調(diào)整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19腳)和XTAL2(18腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40腳)和VSS(20腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O腳,其功能用途由軟件定義,在本設(shè)計(jì)中,P0端口(32~39腳)被定義為N1功能控制端口,分別與N1的相應(yīng)功能管腳相連接,13腳定義為IR輸入端,10腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12腳、27腳及28腳定義為握手信號功能端口,連接主板CPU的相應(yīng)功能端,用于當(dāng)前制式的檢測及會聚調(diào)整狀態(tài)進(jìn)入的控制功能。 P0口:P0口是一組8位漏極開路型雙向I/O 口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能吸收電流的方式驅(qū)動8個TTL邏輯門電路,對端口P0寫“1”時,可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash 編程時,P0口接收指令字節(jié),而在程序校驗(yàn)時,輸出指令字節(jié),校驗(yàn)時,要求外接上拉電阻。 P1口:P1是一個帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因?yàn)閮?nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。與AT89C51不同之處是,P1.0和P1.1還可分別作為定時/計(jì)數(shù)器2 的外部計(jì)數(shù)輸入(P1.0/T2)和輸入(P1.1/T2EX)。Flash編程和程序校驗(yàn)期間,P1接收低8位地址。 P2口:P2是一個帶有內(nèi)部上拉電阻的8 位雙向I/O口,P2的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口P2寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因?yàn)閮?nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX @DPTR指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器(如執(zhí)行MOVX @RI指令)時,P2口輸出P2鎖存器的內(nèi)容。Flash編程或校驗(yàn)時,P2亦接收高位地址和一些控制信號。 P3口:P3口是一組帶有內(nèi)部上拉電阻的8位雙向I/O口。P3口輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫入“1”時,它們被內(nèi)部上拉電阻拉高并可作為輸入端口。此時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能P3口還接收一些用于Flash 閃速存儲器編程和程序校驗(yàn)的控制信號。 RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機(jī)器周期以上高電平將使單片機(jī)復(fù)位。 ALE/PROG:當(dāng)訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲器時將跳過一個AL脈沖。對Flash存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條 MOVX 和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機(jī)執(zhí)行外部程序時,應(yīng)設(shè)置ALE禁止位無效。 PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當(dāng)STC89C51RC由外部程序存儲器取指令(或數(shù)據(jù))時,每個機(jī)器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲器,將跳過兩次PSEN信號。 EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H—FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復(fù)位時內(nèi)部會鎖存EA端狀態(tài)。如EA端為高電平(接Vcc端),CPU則執(zhí)行內(nèi)部程序存儲器中的指令。Flash存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12V編程電壓Vpp。 XTAL1:振蕩器反相放大器的及內(nèi)部時鐘發(fā)生器的輸入端。 XTAL2:振蕩器反相放大器的輸出端。 單片機(jī)最小原理圖如圖2-2-2所示。 圖2-2-2 單片機(jī)最小系統(tǒng) 單片機(jī)最小系統(tǒng)說明: 時鐘信號的產(chǎn)生:在MCS-51芯片內(nèi)部有一個高增益反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。而在芯片的外部,XTAL1和XTAL2之間跨接晶體振蕩器和微調(diào)電容,從而構(gòu)成一個穩(wěn)定的自激振蕩器,這就是單片機(jī)的時鐘振蕩電路。 時鐘電路產(chǎn)生的振蕩脈沖經(jīng)過觸發(fā)器進(jìn)行二分頻之后,才成為單片機(jī)的時鐘脈沖信號。 一般地,電容C2和C3取30pF左右,晶體的振蕩頻率范圍是1.2-12MHz。如果晶體振蕩頻率高,則系統(tǒng)的時鐘頻率也高,單片機(jī)的運(yùn)行速度也就快。 單片機(jī)復(fù)位使CPU和系統(tǒng)中的其他功能部件都處在一個確定的初始狀態(tài)下,并從這個狀態(tài)開始工作。單片機(jī)復(fù)位條件:必須使9腳加上持續(xù)兩個機(jī)器周期(即24個振蕩周期)的高電平。 2.2.3 數(shù)碼管顯示電路 顯示系統(tǒng)采用四位一體數(shù)碼管來顯示,LED顯示屏作為大型顯示設(shè)備的一種,具有亮度高、價格低、壽命長、維護(hù)簡便等優(yōu)點(diǎn)。LED數(shù)碼管的結(jié)構(gòu)簡單,分為七段和八段兩種形式,也有共陽和共陰之分。以八段共陽管為例,它有8個發(fā)光二極管(比七段多一個發(fā)光二極管,用來顯示sP,即點(diǎn)),每個發(fā)光二極管的陽極連在一起,如圖(圖2-2-4)所示。這樣,一個LED數(shù)碼管就有I根位選線和8根段選線,要想顯示一個數(shù)值,就要分別對它們的高低電平來加以控制。為方便起見,本文主要討論共陰八段LED數(shù)碼顯示管,其他類形的顯示管與其類似。 圖2-2-3 LED數(shù)碼管 LED 燈的顯示原理:通過同名管腳上所加電平的高低來控制發(fā)光二極管是否點(diǎn)亮而顯示不同的字形,如 H,G,F,E,D,C,B,A全亮顯示為8,采用共陰極連接驅(qū)動代碼,代碼表如下表(表2-2-2)所示。 表2-2-2 驅(qū)動代碼表 顯示數(shù)值 H,G,F,E,D,C,B,A 驅(qū)動代碼 0 00111111 3FH 1 00000110 06H 2 01011011 5BH 3 01001111 4FH 4 01100110 66H 5 01101101 6DH 6 01111101 7DH 7 00000111 07H 8 01111111 7FH 9 01101111 6FH 2.2.4 按鍵輸入電路 按鍵是由一組按壓式或觸摸式開關(guān)構(gòu)成的陣列,是一種常用的輸入設(shè)備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。 1.編碼鍵盤通過硬件電路產(chǎn)生被按按鍵的鍵碼,這種鍵盤所需程序簡單,但硬件電路復(fù)雜、價格昂貴通常不被單片機(jī)系統(tǒng)采用。 2.非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴(yán)格的對應(yīng)關(guān)系,而要由所用的程序來決定。非編碼鍵盤的硬件接口簡單,但是要占用較多的CPU時間,通常采用可編程鍵盤管理芯片來克服這個缺點(diǎn)。本設(shè)計(jì)使用兩種按鍵,一種是按鍵式非編碼鍵盤和輕觸式非編碼開關(guān)。 在接線時由于有四個引腳,連接時需要用萬用表進(jìn)行測量,然后接通兩個引腳,原理圖如下。 要進(jìn)行數(shù)據(jù)的計(jì)算就必須先進(jìn)行數(shù)據(jù)的輸入,也就必須確定按鍵輸入的數(shù)值是什么,這就需要對鍵盤進(jìn)行掃描,從而確定究竟是哪個鍵按下。 圖2-2-4 按鍵電路 2.2.5 報(bào)警與指示電路 圖2-2-5 報(bào)警與指示電路 第三章 軟件設(shè)計(jì)與分析 3.1 軟件設(shè)計(jì)的組成 該系統(tǒng)由延時子函數(shù)、初始化子函數(shù)、開始鍵掃描子函數(shù)、選手搶答按鍵掃描子函數(shù)、顯示子函數(shù)、調(diào)整時間鍵掃描子函數(shù)、定時器0中斷子函數(shù)、定時器1中斷子函數(shù)、主函數(shù)和數(shù)據(jù)定義這幾部分組成。 3.2 各部分軟件分析 3.2.1 延時子函數(shù) //延時子函數(shù) void delay(uchar x) { uchar y; for(;x>0;x--) for(y=120;y>0;y--); } 3.2.2 初始化子函數(shù) //初始化子函數(shù) void init() { TMOD=0x11; TH0=(65536-2000)/256; TL0=(65536-2000)%256; TH1=(65536-2000)/256; TL1=(65536-2000)%256; ET0=1; ET1=1; EA=1; P0=0x00; time1=10; time2=10; flag2=1; } 3.2.3 開始鍵掃描子函數(shù) //開始鍵掃描子函數(shù) void key1() { uchar i=100; if(K0==0) { delay(10); if(K0==0) { while(K0==0&&i) { i--; delay(10); } TR0=1; s=time1; m=0; flag1=1; flag2=1; flag3=1; num=0; beep=1; D0=1; flag4=0; //清除違規(guī)標(biāo)志位 aa=0; bb=0; } } } 3.2.4 選手搶答按鍵掃描子函數(shù) //選手搶答按鍵掃描子函數(shù) void key() { if(K1==0) { delay(10); if(K1==0) { while(!K1); num=1; //數(shù)碼管顯示1號"1" TR0=0; //關(guān)閉定時器0,時間停止 TR1=1; //打開定時器1,使揚(yáng)聲器響一聲 flag2=0; //關(guān)閉開始鍵標(biāo)志位,使再按其他七個鍵不會響應(yīng) } } if(K2==0) //下面七個鍵的處理同上 { delay(10); if(K2==0) { while(!K2); num=2; TR0=0; TR1=1; flag2=0; //重要 } } if(K3==0) { delay(10); if(K3==0) { while(!K3); num=3; TR0=0; TR1=1; flag2=0; } } if(K4==0) { delay(10); if(K4==0) { while(!K4); num=4; TR0=0; TR1=1; flag2=0; } } if(K5==0) { delay(10); if(K5==0) { while(!K5); num=5; TR0=0; TR1=1; flag2=0; } } if(K6==0) { delay(10); if(K6==0) { while(!K6); num=6; TR0=0; TR1=1; flag2=0; } } if(K7==0) { delay(10); if(K7==0) { while(!K7); num=7; TR0=0; TR1=1; flag2=0; } } if(K8==0) { delay(10); if(K8==0) { while(!K8); num=8; TR0=0; TR1=1; flag2=0; } } } 3.2.5 顯示子函數(shù) //顯示子函數(shù) void display() { if(flag1==1) //開始鍵按下,開始計(jì)時搶答 { if(num!=0) //如果有人搶答,則顯示相應(yīng)的幾號 { P0=table1[num]; //顯示幾號搶到了 P2=table2[0]; delay(2); P0=0; P2=0xff; } else //否則沒人搶答,則前面不顯示幾號 { P0=0x00; P2=0xff; } P0=table1[s/10]; //下面為顯示搶答倒計(jì)時 P2=table2[2]; delay(2); P0=0; P2=0xff; P0=table1[s%10]; P2=table2[3]; delay(2); P2=0xff; P0=0x00; } else //如果開始鍵沒有按下,則顯示F FF(若有違規(guī)者,則顯示違規(guī)號碼及 FF)或時間調(diào)整 { if(flag4==1) //違規(guī)顯示 { if(num!=0) { P0=table1[num]; //顯示幾號違規(guī)了 P2=table2[0]; delay(2); P0=0x00; P2=0xff; P0=table1[15]; //下面顯示 FF,表示違規(guī)了 P2=table2[2]; delay(2); P0=0x00; //消隱 P2=0xff; P0=table1[15]; P2=table2[3]; delay(2); P0=0x00; P2=0xff; } else { P0=0x00; P2=0xff; } } else //沒有人違規(guī)才顯示調(diào)整時間 { if(aa==1) { P0=0x6d; //第一位數(shù)碼管顯示"5(S)"(表示搶答時間調(diào)整) P2=table2[0]; delay(2); P0=0x00; P2=0xff; P0=table1[time1/10]; //下面顯示調(diào)整的搶答時間 P2=table2[2]; delay(2); P0=0x00; P2=0xff; P0=table1[time1%10]; P2=table2[3]; delay(2); P0=0x00; P2=0xff; } else if(bb==1) { P0=0x07; //第一位與第二位數(shù)碼管合起來顯示"T",表示答題時間調(diào)整 P2=table2[0]; delay(2); P0=0x00; P2=0xff; P0=0x31; P2=table2[1]; delay(2); P0=0x00; P2=0xff; P0=table1[time2/10]; P2=table2[2]; delay(2); P0=0x00; P2=0xff; P0=table1[time2%10]; P2=table2[3]; delay(2); P0=0x00; P2=0xff; } else //否則顯示F FF { P0=table1[15]; P2=table2[0]; delay(2); P0=0x00; P0=table1[15]; P2=table2[2]; delay(2); P0=0x00; //消隱 P2=0xff; P0=table1[15]; P2=table2[3]; delay(2); P0=0x00; P2=0xff; } } } } 3.2.6 調(diào)整時間鍵掃描子函數(shù) //調(diào)整時間鍵掃描子函數(shù) void key2() { uchar i=100; if(S2==0) //搶答時間調(diào)整 { delay(10); if(S2==0) { while(S2==0&&i) { i--; delay(10); } time1++; if(time1==61) { time1=10; } aa=1; //將搶答時間標(biāo)志位置1 bb=0; //同時關(guān)閉答題時間標(biāo)志位 } } if(S3==0) //答題時間調(diào)整 { delay(10); if(S3==0) { while(S3==0&&i) { i--; delay(10); } time2++; if(time2==61) { time2=10; } bb=1; aa=0; } } } 3.2.7 定時器0中斷子函數(shù) //定時器0中斷子函數(shù) void t0() interrupt 1 { TH0=(65536-2000)/256; //2ms TL0=(65536-2000)%256; if(flag3) //開始(START)鍵按下,嘟一聲(長1秒),表示開始搶答 { beep=~beep; } else beep=1; if(s<5) //搶答時間快到報(bào)警,隔1秒響一聲且紅燈閃爍,響三聲 { if(s%2==0) { flag3=1; D0=0; } else { flag3=0; D0=1; } } m++; if(m==500) //1秒 { m=0; s--; flag3=0; //關(guān)閉開始鍵按下響一秒的嘟聲 if(s==-1) { s=20; TR0=0; flag1=0; //顯示F FF flag2=1; num=0; D0=1; } } } 3.2.8 定時器1中斷子函數(shù) //定時器1中斷子函數(shù) void t1() interrupt 3 //定時器1處理有人按下?lián)尨鹌鬣揭宦?長1秒) { TH1=(65536-2000)/256; TL1=(65536-2000)%256; beep=~beep; n++; if(n==500) { n=0; TR1=0; } } 3.2.9 主函數(shù) //主函數(shù) void main() { uchar i=100; init();//調(diào)用初始化子函數(shù) while(1) { key1();//調(diào)用開始鍵掃描子函數(shù) if((flag1==0)&(flag2==1)) //當(dāng)開始鍵沒按下及沒有人違規(guī)時才可進(jìn)行時間調(diào)整 { key2(); } if((flag1==1)&(flag2==0)) //當(dāng)開始鍵按下及有人搶答才進(jìn)行開始回答計(jì)時倒計(jì)時 { if(S1==0) { delay(10); if(S1==0) { while(S1==0&&i) { i--; delay(10); } s=time2; TR0=1; m=0; TR1=1; } } } if((flag1==0)&(flag2==1)) //違規(guī) { key(); if(num!=0) //開始鍵沒有按下時,有人按下了搶答器,則置違規(guī)標(biāo)志位 { flag4=1; D0=0; } } if((flag1==1)&(flag2==1)) //如果開始鍵按下且搶答鍵沒有人按下,則進(jìn)行八路搶答鍵掃描 { key(); } display();//顯示到數(shù)碼管上 } } 3.3 總源程序 #include- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 基于 51 單片機(jī) 八路 搶答 設(shè)計(jì)
鏈接地址:http://m.appdesigncorp.com/p-6651968.html