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