西安科技大學 單片機課程設計 基于單片機的八路智能搶答器 電控學院 電氣13班 摘要 隨著科學技術的發展和普及,各種各樣的競賽越來越多,其中搶答器的作用也越來越重要。本文設計出以AT89C51單片機為核心的八路搶答器,采用了數字顯示器直接指示,自動鎖存顯示結果,并自動復位的設計思想,它能根據不同的搶答輸入信號,經過單片機的控制處理并產生不同的與輸入信號相對應的輸出信號,最后通過LED數碼管顯示相應的路數,即使兩組的搶答時間相差幾微秒,也可分辨出是哪組優先按下的按鍵,充分利用了單片機系統結構簡單、功能強大、可靠性好、實用性強的特點。 本設計是以搶答為出發點。考慮到依需設定限時回答的功能,利用AT89C51單片機及外圍接口實現的搶答系統,利用單片機的定時器/計數器定時和記數的原理,將軟、硬件有機地結合起來,使得系統能夠正確地進行計時,同時使數碼管能夠正確地顯示時間。用開關做鍵盤輸出,發光二極管和蜂鳴器發出提示。同時系統能夠實現:在搶答中,只有開始后搶答才有效,如果在開始搶答前搶答為無效;滿時后系統計時自動復位及主控強制復位;按鍵鎖定。
1.緒論 搶答器是一種應用非常廣泛的設備,在各種競賽、搶答場合中,它能迅速、客觀的分辨出最先獲得發言權的選手。早期的搶答器只有幾個三極管、可控硅、發光管等組成,能通過發光管的指示辨認出選手號碼。現在大多數搶答器均使用單片機(如MCS-51型)和數字集成電路,并增加了許多新功能,如選手號碼顯示、搶答前或搶答后的計時、選手得分顯示等功能。能夠實現搶答器功能的方式有多種,可以采用前期的模擬電路、數字電路或模擬與數字電路相結合的方式。近年來隨著科技的飛速發展,單片機的應用正在不斷深入。 搶答器作為一種電子產品,早已廣泛應用于各種智力知識競賽場合,但目前所使用的搶答器有的電路較復雜不便于制作,可靠性低,實現起來很困難。為適應目前的狀況,需要一種電路簡單,元件普通,易于購買等優點,并且能夠很好的解決各種問題。而目前的多數搶答器存在幾個不足之處:第一,現場線路連接復雜,降低了搶答器的可能性,增加了安裝難度;第二,電路設計復雜。因為單片機只能完成號碼處理、計時、數據運算等動能,其他功能仍只能靠數字集成電路完成,電路延遲時間較大。 本設計利用AT89C51單片機及外圍借口實現搶答系統,利用單片機的定時/計數器和計數原理,將軟硬件有機的結合起來,使系統能夠正確地進行計時,同時使數碼管能夠正確的顯示時間和選手號碼。用按鍵作為鍵盤輸出,二極管、揚聲器發出提示。系統可達到的要求:在搶答中,只有按下開始鍵搶答才有效,若在之前搶答則記為違規。搶答限定時間及回答限定時間均可調節;可以顯示哪位選手搶答,搶答剩余時間及無效搶答,正確按鍵有聲音提示;搶答時間及回答時間倒計時顯示,時間計完后可自動復位;剩余時間少于5s時聲光報警;具有按鍵鎖定功能。 本設計采用模塊化設計智能搶答器,在各種場合下均可應用。各組分別有一搶答按鍵,主持人有開始鍵、回答問題開始鍵、復位鍵、搶答時間調節鍵和答題時間調節鍵。通過設計驗證,采用單片機設計,電路連接簡單工作可靠,抗干擾性能力強。 通過這次設計,可以掌握單片機的原理,了解多功能搶答器的組成原理,提高動手能力,鞏固理論知識,建立一套完整的理論實踐體系 2.系統方案論證 2.1總體方案論證 方案一:采用數字電路實現設計 采用CD4511實現設計方案,CD4511為常用的四—七段BCD譯碼器,當某按鍵按下時,通過按鍵傳送給CD4511,通過譯碼,數碼管顯示。與此同時,這一高電平也送到三極管的基極,三極管導通,繼電器吸和,當前狀態鎖定,再按其他鍵不起作用,而且斷開了其他按鍵與電路的選擇,杜絕了誤操作。也可以采用74LS148優先編碼器,當有按鍵按下時,經編碼后,送到RS鎖存器,然后經74LS48譯碼送到顯示器顯示。采用數字電路的好處就是設計簡單。共設8個用戶輸入鍵,當搶答的時候,其中只有1個是有效按鍵,其它的都是干擾按鍵,若按下干擾鍵。電路通常由兩大部分組成:顯示器電路和主電源電源(UPS)。 方案二:采用AT89C51實現設計 采用以AT89C51為核心的單片機控制方案。利用單片機靈活的編程設計和豐富的IO端口,及其控制的準確性,不但能實現基本的搶答器功能,還能添加調節功能等等。雖然電路較復雜但功能更加豐富以及人性化。 通過比較以上兩種方案,方案二有較大的活動空間,不但能實現所要求的功能而且能在很大的程度上擴展功能,故本次設計采用方案二。 2.2顯示模塊方案論證 方案一:采用數碼管顯示 系統采用四位一體八段數碼管LED顯示。LED應用可分為兩大類:一是LED單管應用,包括背光源LED,紅外線LED等;另外就是LED顯示屏,目前,中國在LED基礎材料制造方面與國際還存在著一定的差距,但就LED顯示屏而言,中國的設計和生產技術水平基本與國際同步。LED顯示屏是由發光二極管排列組成的顯示器件。它采用低電壓掃描驅動,具有:耗電少、使用壽命長、成本低、亮度高、故障少、視角大、可視距離遠等特點。采用LED數碼管動態掃描,價格上比較經濟實惠且較為節約資源。 方案二:采用LCD顯示 采用液晶(LCD)顯示。液晶顯示器具有低壓微功耗、外觀小巧、被動顯示型、顯示信息量大、易于彩色化、無電磁輻射和壽命長等特點。但經濟性較LED差。 通過比較以上兩種方案,方案一能更好的節約資源以及有更好的經濟性,故本次設計采用方案一。 2.3鍵盤模塊方案論證 方案一:采用獨立鍵盤 獨立式鍵盤每個按鍵占用一條I/O口線,當按鍵數量較多時,I/O口利用率不高,但程序編制簡單。適用于所需按鍵較少的場合。 方案二:采用矩陣鍵盤 矩陣式鍵盤電路連接復雜,但提高了I/O口利用率,軟件編程較復雜。適用于需大量按鍵的場合。 通過比較以上兩種方案,由于本次設計所需按鍵數不多,故本次設計采用方案一。 2.4電路設計最終方案確定 最終選擇單片機AT89C51作為主控制器;選擇LED作為顯示模塊,此模塊可以顯示字母、數字,采用獨立按鍵輸入,并且采用發光二極管及蜂鳴器作為報警模塊。 3.硬件設計 按照系統設計功能的要求,初步確定設計系統由主控模塊、顯示模塊、鍵盤模塊、蜂鳴器模塊和燈光模塊5個模塊組成,電路系統構成框圖如圖3-1所示。主控芯片使用AT89C51,顯示模塊采用LED,鍵盤模塊選用獨立按鍵,其軟硬件設計簡單,可廣泛應用于長時間連續運行的系統中。 
圖3-1 系統總體框圖 3.1各單元模塊分析及電路分析 3.1.1AT89C51最小系統 AT89C51是美國ATMEL公司生產的低電壓,高性能CMOS8位單片機,片內含4k bytes的可反復擦寫的只讀程序存儲器和128 bytes的隨機存取數據存儲器,期間采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,功能強大的AT89C51單片機可靈活應用于各種控制領域。 AT89C51提供以下標準功能:4k字節Flash閃速存儲器,128字節內部RAM,32個I/O口線,兩個16位定時/計數器,一個5向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,AT89C51可降至0Hz的靜態邏輯操作,并支持兩種軟件可選的節電工作模式。空閑方式停止CPU的工作,但允許RAM,定時/計數器,串行通信口及中斷系統繼續工作。掉電方式保存RAM中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。 本系統中央控制器采用的單片機AT89C51,復位電路采用上電復位電路。外接的晶振為11.0592MHz晶振。系統的最小系統電路圖如圖3-2所示。 
圖3-1 AT89C51最小系統 3.1.2顯示模塊 本次設計采用八段數碼管顯示,是四位一體共陰極數碼管,由四個八段數碼管集成,高電平點亮。在顯示上我們通常采用兩種方法:一種是靜態顯示,一種是動態顯示。靜態顯示是指每個數碼管的每一個段碼都由一個單片機的I/O端口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動。靜態顯示的優點是編程簡單,顯示亮度高,缺點是占用I/O端口多,實際應用時必須增加譯碼驅動器進行驅動,增加了硬件電路的復雜性。LED數碼管動態顯示接口是單片機中應用最為廣泛的一種顯示方式之一,動態顯示是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態顯示。在輪流顯示過程中,每位數碼管的點亮時間為1~2ms,由于人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,但能夠節省大量的I/O端口,而且功耗更低。故本次設計采用動態顯示方法。其原理圖如圖3-2所示。 
圖3-2 顯示模塊 3.1.3鍵盤模塊 鍵盤是人與萬年歷實現信息交互的接口,本設計中,我們采用獨立鍵盤。按鈕需要十三個,分別為八路搶答按鍵、開始搶答鍵、開始答題鍵、搶答時間調節鍵、答題時間調節鍵和復位鍵。當按鍵按下,與主控芯片連接的端口被降為低電平,按鍵松開則也升為高電平。按鍵采用的是Tack Switch按鈕開關,它具有自動恢復(彈回)的功能。當我們按下按鈕時,其中的接點接通(或切斷),放開按鈕后,接點恢復為切斷(或接通)。按照尺寸區分,電子電路或微型計算機所使用的Tack Swith可分為8mm、10mm、12mm等。雖然Tack Switch有4個引腳,但實際上,其內部只有一對a接點,即其中兩個引腳是內部相連通的,而另外兩個引腳內部也是相連通的。 本設計中13個按鍵實現了搶答,時間調節等功能,獨立按鍵的引入使得體現了本設計的人性化,智能化,功能的強大。其電路分為主持人部分和選手部分。分別實現了控制、調節功能和搶答功能。其電路圖如圖3-3所示。 
(a)主持人部分 
(b) 選手部分 圖3-3 鍵盤模塊 3.1.4蜂鳴器模塊 蜂鳴器是一種一體化結構的電子訊響器,采用直流電壓供電,廣泛應用于計算機、打印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件。 蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。蜂鳴器在電路中用字母“H”或“HA”(舊標準用“FM”、“LB”、“JD”等)表示。 本設計采用電磁式蜂鳴器進行。電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。因此需要一定的電流才能驅動它,單片機I/O引腳輸出的電流較小,單片機輸出的TTL電平基本上驅動不了蜂鳴器,因此需要增加一個電流放大的電路。如蜂鳴器電路圖3-7所示,蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負極接到三極管的發射極E,三極管的基極B經過限流電阻R3后由單片機的P3.7引腳控制,當P3.7輸出高電平時,三級管T1截止,沒有電流流過線圈,蜂鳴器不發聲;當P3.7輸出低電平時,三級管導通,這樣蜂鳴器的電流形成回路,發出聲音。因此,我們可以通過程序控制P3.7腳的電平來使蜂鳴器發出聲音和關閉。其電路圖如圖3-4所示。 
圖3-4 蜂鳴器模塊 3.2電路原理圖的繪制和電路的焊接 3.2.1原理圖繪制軟件PROTEL PROTEL是PORTEL公司在80年代末推出的EDA軟件,在電子行業的CAD軟件中,它當之無愧地排在眾多EDA軟件的前面,是電子設計者的首選軟件,它包含了電原理圖繪制、模擬電路與數字電路混合信號仿真、多層印制電路板設計(包含印制電路板自動布線)、可編程邏輯器件設計、圖表生成、電子表格生成、支持宏操作等功能,并具有Client/Server (客戶/服務器)體系結構,同時還兼容一些其它設計軟件的文件格式,如ORCAD,PSPICE,EXCEL等,其多層印制線路板的自動布線可實現高密度PCB的100%布通率。 3.2.2元器件的焊接 元器件裝焊順序依據的原則是:先低后高,先小后大。一般情況下,應按電阻、電容、二極管、三極管、集成電路、大功率管順序焊接。 1.對元器件焊接的要求 (1)電阻的焊接:按圖將電阻準確裝入規定位置,型號標記要易見且方向也盡量一致。要求焊接一種規格后再焊接另一種規格。 (2)電容的焊接:按圖將電容準確裝入規定位置,并注意有極性電容的極性方向不能錯。電容上的型號標記要易見見且方向也盡量一致。電解電容要緊靠PCB板,不可懸浮。 (3)二極管的焊接:正確辨認正負極性后按要求裝入規定位置,型號標記要易見,焊接時間盡量可能短。 (4)三極管的焊接:正確辨認各引腳后按要求裝入規定位置,型號標記要易見,焊接時間盡可能短。 (5)集成電路(芯片)的焊接:集成電路(芯片)焊接時,要注意按圖紙要求檢查型號、焊接位置是否符合要求,焊接時先焊芯片邊沿的兩只引腳,以便使其定位,然后再從左到右或從上到下進行逐點焊接。焊接時間盡可能短,禁止拉焊。 2.焊接質量檢查 (1)元器件不得有錯裝、漏裝、錯聯和歪斜松動等。 (2)焊點應吃錫飽滿,無毛刺、無針孔、無氣泡、裂紋、掛錫、拉點、漏焊、碰焊、虛焊等缺陷。 (3)焊接后電路板上的金屬件表面應無銹蝕和其它雜質。 (4)焊接完成的電路板不得有斑點、裂紋、氣泡、發白等現象,銅箔及敷形涂覆層不得脫落、不起翹、不分層。 (5)元器件的引腳或引線表面應滲錫均勻。 4.軟件設計 系統軟件設計中,我們使用了Keil μVision2。Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢,所以我們選擇該軟件來開發我們的搶答器程序。 4.1 程序設計 當接通電源開始工作后,單片機中的程序開始運行,將對程序進行初始化,以便和單片機芯片達成通信協議。完成初始化后,將進行鍵盤掃描,同時判斷開始按鍵、調節按鍵是否按下。最后完成倒計時和選手號碼的顯示。系統流程圖如圖4-1所示。 圖4-1 主流程圖 5.仿真調試 5.1仿真軟件 系統仿真調試過程,我們使用了Proteus軟件。Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前比較好的仿真單片機及外圍器件的工具。雖然目前國內推廣剛起步,但已受到單片機愛好者、從事單片機教學的教師、致力于單片機開發應用的科技工作者的青睞。 Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調試到單片機與外圍電路協同仿真,一鍵切換到PCB設計,真正實現了從概念到產品的完整設計。是目前世界上唯一將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三合一的設計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列處理器,并持續增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。 Proteus可提供如下資源。仿真元器件資源:仿真數字和模擬、交流和直流等數千種元器件,有30多個元件庫;仿真儀表資源:示波器、邏輯分析儀、虛擬終端、SPI調試器、I2C調試器、信號發生器、模式發生器、交直流電壓表、交直流電流表。理論上同一種儀器可以在一個電路中隨意的調用。除了現實存在的儀器外,Proteus還提供了一個圖形顯示功能,可以將線路上變化的信號,以圖形的方式實時地顯示出來,其作用與示波器相似,但功能更多。這些虛擬儀器儀表具有理想的參數指標,例如極高的輸入阻抗、極低的輸出阻抗。這些都盡可能減少了儀器對測量結果的影響。Proteus還提供了比較豐富的測試信號用于電路的測試。這些測試信號包括模擬信號和數字信號。 5.2仿真過程 1.初始化。 
圖5-1 初始化 2.按下開始搶答鍵,進入搶答倒計時。 
圖5-2倒計時 3.有選手按下搶答鍵,顯示選手號碼及剩余時間。 
圖5-3 搶答成功 4.倒計時少于5s,報警。 
圖5-4 報警 5.非法搶答。 
圖5-5 非法搶答 5.3出現問題 在原理圖繪制的過程中,我們未注意節點的放置,導致初次仿真不成功,但經過查閱資料修改原理圖,最終仿真成功達到了搶答器系統預期的結果。 6.總結展望 在硬件電路焊接和軟件程序設計分別完成的基礎之上,進行軟硬件的結合與調試。通過下載將在電腦上已完成的程序下載到單片機芯片中。在調試中發現軟件中存在的問題,及時解決問題,確保系統能正常工作并達到設計要求。通過反復的調試與實驗,可以證明該系統能夠較好地完成設計所需的基本要求。即能夠正確的完成搶答器預期功能。 在完成系統時我們遇到了很多困難,從一開始電路設計不夠優化導致蜂鳴器不能正常發聲,到后來查閱資料一點點豐富我們的設計。在整個設計過程中,我們充分發揮團隊精神,分工合作,發揮人的主觀能動性,自主學習,學到了許多沒學到的知識,較好的完成了作品。相互學習、相互討論研究,共同進步,完了最初的設想。在電路焊接時雖然沒什么大問題,但從中也知道了焊接在整個作品中的重要性,電路工程量大,不能心急,一個個慢慢來不能急于求成。反而達到事半功倍的效果。對電路的設計、布局要先有一個好的構思,才顯得電路板美觀、大方。程序編寫中,由于思路不清晰,開始時遇到了很多的問題,經過靜下心來思考,和同組員的討論,理清了思路,反而得心應手。在此次設計中,知道了做凡事要有一顆平常的心,不要想著走捷徑,一步一個腳印。此次比賽也練就了我們的耐心,讓我們認識到了學習基礎知識的重要性,當設計完整的系統時,要考慮到硬件和軟件兩者的結合,有時硬件的不足,我們可以用軟件程序來彌補,從而節約硬件成本,在設計軟件程序時要模塊化,可以提高程序的可讀性。總之,通過此次單片機課程設計我們的能力得到了全方位的提高。 參考文獻 [1] 柴鈺.單片機原理及應用.西安:西安電子科技大學出版社,2009 [2] 魏芬.基于Proteus的單片機實驗與.清華大學出版社,2015
心得體會
時光飛逝,轉眼之間,一個學期又進尾聲了。而本學期的單片機綜合課程設計也完成了。 俗話說“好的開始是成功的一半”。說起課程設計,我認為最重要的就是做好設計的預習,研究課題,選一個自己有興趣的題目。其次,要全方面的了解自己所做程序的各個部分。因為只有做到將一切都了然于胸,做起設計才能事半功倍。最后,要重視程序的模塊化,以便修改方便,也要注重程序調試和硬件的焊接,掌握其方法和注意事項。 為期一周的單片機課程設計讓我受益匪淺。此次課程設計將軟件與硬件相結合,考察了我們對單片機的整體掌握程度以及硬件設計能力和軟件編程能力。對于我們來說理論知識不成問題,但將理論付諸于實踐卻是一個很大的障礙。 在確定好我們課程設計的題目之后,我們通過去圖書館翻閱相關設計書籍,并且上網查閱各種資料,確定了基本方案,完成了大體的硬件設計思路。又通過對功能的設計完成了相應的軟件設計。最后我們通過軟件仿真驗證了所設計方案的可行性,并且完成了實物的制作。雖然這其中的過程比較繁瑣復雜,但卻讓我對設計一個完整的系統有了基本的經驗。 單片機課是一門實踐性很強的課程,僅有課堂上理論知識的學習,對運用好單片機是完全不夠的,必須親自做實驗,從實驗中吸取教訓,總結經驗,增加實戰經驗,加深對單片機的理解,才能更好的運用單片機。這次實訓的目的就是為學生提供自己動手設計的機會,讓我們能夠從實踐中學會單片機的開發過程和實際運用。 在設計過程中我們也遇到了許多困難。在進行電路仿真時我們未注意到節點的放置,導致初次仿真不成功。我們通過查找資料和向老師同學詢問解決了這個問題。在焊接好電路并且調試之后,我們發現蜂鳴器聲音過小,后經查閱資料,知道了是由于單片機I/O引腳輸出的電流較小,單片機輸出的TTL電平基本上驅動不了蜂鳴器,因此需要增加一個電流放大的電路,才能使蜂鳴器正常發聲。 通過這次實習我學到了許多書本上學不到的知識,豐富了我的視野,也鍛煉了我的動手能力并且培養了我的團隊精神。通過這次單片機實習,不僅加深了我對單片機理論的理解,更教會我怎樣更好地將理論應用到實際當中去。這次實習也將會成為我日后工作學習生活中很重要的經驗。
心得體會
本次單片機課程設計,將理論知識與實踐充分結合。不僅考察了我們對理論知識的掌握程度,對我們的實際動手能力也有很高的要求。經過這一周的學習,我們對知識的綜合利用能力和創新思維都得到了很大的提升。 在確定8路搶答器為課程設計題目后,我們通過上網查閱各種資料,去圖書館翻閱相關設計書籍,確定了基本方案,又通過仿真軟件驗證了方案的可行性,雖然比較繁瑣復雜,但卻讓我對設計一個電路有了基本的經驗。8路搶答器的基本原理是:電源電路為單片機以及其他模塊提供標準5V電源。晶振模塊為單片機提供時鐘標準,使系統各部分協調工作。復位電路模塊為單片機系統提供復位功能。單片機作為主控制器,根據輸入信號對系統進行相應的控制。選手按下相應的鍵,蜂鳴器發出提示音,直到按鍵釋放。數碼管顯示最先按下選手的編號。選手回答完畢,主持人按下復位按鈕,數碼管清零,蜂鳴器停止發聲,可以進入下一題的搶答。 通過此次課程設計,我深刻感受到完成一個電子產品不僅僅是完美的方案和設計思路,還需要熟練細致的動手能力。比如,進行焊接制作時必須精益求精,一絲不茍,必須嚴格按照事先準備好的電路圖精確焊接,確保沒有虛焊漏焊,一點的差錯都可能導致實驗結果的錯誤,因此必須準確無誤還要工整,這樣才能在調試中能比較輕松進行,也使得整個電路更好看美觀。在焊接結束后,我們把程序導入繼續進行調試。調試工作是個精細工作。調試時,我們發現由于蜂鳴器聲音太小,發出的報警提示音不能達到預期的效果,所以我們決定修改程序,安裝放大電路,是蜂鳴器報警聲音變高。 在本次的課程設計過程中,我能運用已學的知識解決我在設計中遇到的問題,使我思考問題的能力得到了很大的提高。在做設計的過程中我查閱了很多的資料,并認真的閱讀這些與我的設計相關的資料,從而我的專業涵養得到了提高知識的儲備量也有所增加。在做設計時,我復習了很多專業課的知識,這使得我的專業知識也得到了鞏固。我也發現自己的很多不足之處。在設計過程中我發現自己考慮問題很不全面,自己的專業知識掌握的很不牢固,所掌握的電路應用軟件還不夠多,我希望自己的這些不足之處能在今后的工作和學習中得到改善。而且,通過這次設計,我懂得了學習的重要性,學會了堅持和努力,這將為以后的學習做出了最好的榜樣!我將會在以后的學習和生活中不斷提升自己。
心得體會
為期兩周的單片機課程設計結束了,我通過這次設計學到了很多知識。 剛開始開始學習單片機時我感覺很吃力,但在不斷的學習過程中我慢慢的對單片機產生了興趣,并且在編寫程序過程中吃力的感覺也慢慢的淡了。我知道了基礎知識掌握牢固是非常重要的,并且在學習過程中要學會提問題和自己解決問題。雖然在開始學習單片機時感覺很青澀,但只要堅定自己的學習信心,在付出持之以恒的努力,我相信自己能進一步加深對單片機的了解,在單片機的學習道路上越走越遠。 這個學期,我除了在課堂上學習了理論知識以外,還通過試驗將所學的知識運用到實踐來,在實踐中發現問題,強化理論知識。 通過這幾天的實訓,使我的感觸很深,真實“條條大路通羅馬”,要達到目的,不同的人就有不同的方法。只要你的方法不錯怎樣做都可以,而且是各有特色。走出來的結果都有各自的獨到之處。實訓中有苦有甜,當我們為一個很難攻破的程序找出路時,心情煩躁,感覺自己很不可理喻,當程序一點點的編好后,自己從心底感覺到一點小小的安慰,看著自己的成果。感覺很欣慰,有一絲絲的甜意,這幾天的實訓使自己的思維邏輯也有了小小的進步。 這次單片機實訓讓我懂得很多。首先,不管做什么事,計劃是很重要的。沒有一個完好的計劃,做事情就會沒有一個好的順序,做事情會比較亂,很難成功。而有一個好的計劃,不管做什么事都會事半功倍,做事心中有數,,明確重點和緩急,不會有疏漏。這樣才能提高成功率。其次,做事要多動腦,選出最好的方法。一件事往往有多種解決方法,一個好的方法,不僅能使事情事半功倍,而且往往決定最后的成與敗,所以做事時一定要多動一下腦筋,想出最好的方法。要注意細節。細節決定成敗,這句話在這次課題中不僅一次得到了印證,特別是在軟件的編程過程中,一點點的錯誤就會使你整個程序不能運行。因此我們不僅僅要有整體意識,也要注意細節,不要因一個關鍵地方的一個細節而導致滿盤皆輸。 這次實訓的經歷讓我終身受益,我感受到了這次實訓,是要真真正正用心去做一件事情,是真正的自己學習的過程和研究的過程,沒有學習就不可能有研究的能力,沒有了自己的研究就不會有突破,希望這次的經歷能讓我在以后的學習中激勵我更大的進步。
附錄
附錄一:總電路圖
附錄二:仿真圖
附錄三:程序清單 - #include<at89x51.h>
- #define uchar unsigned char
- #define uint unsigned int
- char s;
- uchar num=0;
- char time=20; //搶答時間
- char datitime=30; //答題限時時間
- uint tt,t1;
- bit flag,s_flag=1,b_flag,fall_flag,fw_flag; //標志位
- bit K_startcountflag,K_timecountflag; //時間調整標志位
- sbit K0=P3^0;
- sbit beep=P3^7; //蜂鳴器輸出口
- sbit rled=P3^1; //指示燈輸出口
- sbit K1=P1^0; //按鍵輸出口
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit K5=P1^4;
- sbit K6=P1^5;
- sbit K7=P1^6;
- sbit K8=P1^7;
- sbit K_fw=P3^2; //答題計時鍵
- sbit K_startcount=P3^3; //開始搶答時間調整鍵
- sbit K_timecount=P3^4; //答題計時時間調整鍵
- sbit K_Time=P3^5;
- void delay(uchar ms)
- {
- uchar y;
- for(;ms>0;ms--)
- for(y=120;y>0;y--);
- }
- uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- };
- uchar code tablewe[]={0XFE,0XFD,0XFB,0XF7};
- void T0_Init(void)
- {
- TMOD=0X01;
- TH0=(65536-2000)/256;
- TL0=(65536-2000)%256;
- TH1=(65536-2000)/256;
- TL1=(65536-2000)%256;
- ET0=1;
- ET1=1;
- EX0=1;
- EA=1;
- IT0=1;
- P0=0;
- }
- void Key_Scan(void) //開始鍵掃描
- {
- if(K0==0)
- {
- delay(10);
- if(K0==0)
- {
- while(!K0);
- TR0=1;
- s=time;
- tt=0;
- flag=1;
- s_flag=1;
- b_flag=1;
- num=0;
- beep=1;
- rled=1;
- fall_flag=0; //清除違規標志位
- K_startcountflag=0;
- K_timecountflag=0;
- }
- }
- }
- void Scan(void) //八路熱鍵掃描(哪個鍵先按下,哪個優先級最高)
- {
- if(K1==0)
- {
- delay(10);
- if(K1==0)
- {
- while(!K1);
- num=1; //數碼管顯示1號"1"
- TR0=0; //關閉定時器0,時間停止
- TR1=1; //打開定時器1,使揚聲器響一聲
- s_flag=0; //關閉開始鍵標志位,使再按其他七個鍵不會響應
- }
- }
- if(K2==0) //下面七個鍵的處理同上
- {
- delay(10);
- if(K2==0)
- {
- while(!K2);
- num=2;
- TR0=0;
- TR1=1;
- s_flag=0; //重要
- }
- }
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- while(!K3);
- num=3;
- TR0=0;
- TR1=1;
- s_flag=0;
- }
- }
- if(K4==0)
- {
- delay(10);
- if(K4==0)
- {
- while(!K4);
- num=4;
- TR0=0;
- TR1=1;
- s_flag=0;
- }
- }
- if(K5==0)
- {
- delay(10);
- if(K5==0)
- {
- while(!K5);
- num=5;
- TR0=0;
- TR1=1;
- s_flag=0;
- }
- }
- if(K6==0)
- {
- delay(10);
- if(K6==0)
- {
- while(!K6);
- num=6;
- TR0=0;
- TR1=1;
- s_flag=0;
- }
- }
- if(K7==0)
- {
- delay(10);
- if(K7==0)
- {
- while(!K7);
- num=7;
- TR0=0;
- TR1=1;
- s_flag=0;
- }
- }
- if(K8==0)
- {
- delay(10);
- if(K8==0)
- {
- while(!K8);
- num=8;
- TR0=0;
- TR1=1;
- s_flag=0;
- }
- }
- }
- void display(void)
- {
- if(flag==1) //開始鍵按下,開始計時搶答
- {
- if(num!=0) //如果有人搶答,則顯示相應的幾號
- {
- P0=tabledu[num]; //顯示幾號搶到了
- P2=tablewe[0];
- delay(2);
- P0=0;
- P2=0XFF;
- }
- else //否則沒人搶答,則前面不顯示幾號
- {
- P0=0;
- P2=0XFF;
- }
- P0=tabledu[s/10]; //下面為顯示搶答倒計時
- P2=tablewe[2];
- delay(2);
- P0=0;
- P2=0XFF;
- P0=tabledu[s%10];
- P2=tablewe[3];
- delay(2);
- P2=0XFF;
- P0=0;
- }
- else //如果開始鍵沒有按下,則顯示F FF(若有違規者,則顯示違規號碼及 FF)或時間調整
- {
- if(fall_flag==1) //違規顯示
- {
- if(num!=0)
- {
- P0=tabledu[num]; //顯示幾號違規了
- P2=tablewe[0];
- delay(2);
- P0=0;
- P2=0XFF;
- P0=tabledu[15]; //下面顯示 FF,表示違規了
- P2=tablewe[2];
- delay(2);
- P0=0; //消隱
- P2=0XFF;
- P0=tabledu[15];
- P2=tablewe[3];
- delay(2);
- P0=0;
- P2=0XFF;
- }
- else
- {
- P0=0;
- P2=0XFF;
- }
- }
- else //沒有人違規才顯示調整時間
- {
- if(K_startcountflag==1)
- {
- P0=0X6D; //第一位數碼管顯示"5(S)"(表示搶答時間調整)
- P2=tablewe[0];
- delay(2);
- P0=0;
- P2=0XFF;
- P0=tabledu[time/10]; //下面顯示調整的搶答時間
- P2=tablewe[2];
- delay(2);
- P0=0;
- P2=0XFF;
- P0=tabledu[time%10];
- P2=tablewe[3];
- delay(2);
- P0=0;
- P2=0XFF;
- }
- else if(K_timecountflag==1)
- {
- P0=0X07; //第一位與第二位數碼管合起來顯示"T",表示答題時間調整
- P2=tablewe[0];
- delay(2);
- P0=0;
- P2=0XFF;
- P0=0X31;
- P2=tablewe[1];
- delay(2);
- P0=0;
- P2=0XFF;
- P0=tabledu[datitime/10];
- P2=tablewe[2];
- delay(2);
- P0=0;
- P2=0XFF;
- P0=tabledu[datitime%10];
- P2=tablewe[3];
- delay(2);
- P0=0;
- P2=0XFF;
- }
- else //否則顯示F FF
- {
- P0=tabledu[15];
- P2=tablewe[0];
- delay(2);
- P0=0;
- P0=tabledu[15];
- P2=tablewe[2];
- delay(2);
- P0=0; //消隱
- P2=0XFF;
- P0=tabledu[15];
- P2=tablewe[3];
- delay(2);
- P0=0;
- P2=0XFF;
- }
- }
- }
- }
- void Time_Scan(void) //調整時間鍵掃描
- {
- if(K_startcount==0) //搶答時間調整
- {
- delay(10);
- if(K_startcount==0)
- {
- while(!K_startcount);
- time++;
- if(time==50)
- {
- time=20;
- }
- K_startcountflag=1; //將搶答時間標志位置1
- K_timecountflag=0; //同時關閉答題時間標志位
- }
- }
- if(K_timecount==0) //答題時間調整
- {
- delay(10);
- if(K_timecount==0)
- {
- while(!K_timecount);
- datitime++;
- if(datitime==60)
- {
- datitime=30;
- }
- K_timecountflag=1;
- K_startcountflag=0;
- }
- }
- }
- void main(void)
- {
- T0_Init();
- while(1)
- {
- Key_Scan(); //開始鍵掃描
- if((flag==0)&(s_flag==1)) //當開始鍵沒按下及沒有人違規時才可進行時間調整
- {
- Time_Scan();
- }
- if((flag==1)&(s_flag==0))//當開始鍵按下及有人搶答才進行開始回答計時倒計時
- {
- if(K_Time==0)
- {
- delay(10);
- if(K_Time==0)
- {
- while(!K_Time);
- s=datitime;
- TR0=1;
- tt=0;
- TR1=1;
- }
- }
- }
- if((flag==0)&(s_flag==1)) //違規
- {
- Scan();
- if(num!=0) //開始鍵沒有按下時,有人按下了搶答器,則置違規標志位
- {
- fall_flag=1;
- rled=0;
- }
- }
- if((flag==1)&(s_flag==1)) //如果開始鍵按下且搶答鍵沒有人按下,則進行八路搶答鍵掃描
- {
- Scan();
- }
- display(); //顯示到數碼管上
- }
- }
-
- void int0(void) interrupt 0
- {
- if(K_fw==0)
- {
- while(!K_fw)
- {
- while(K0==1)
- {P0=tabledu[15];
- P2=tablewe[0];
- delay(2);
- P0=0;
- P0=tabledu[15];
- P2=tablewe[2];
- delay(2);
- P0=0;
- P2=0xFF;
- P0=tabledu[15];
- P2=tablewe[3];
- delay(2);
- P0=0;
- P2=0xFF;}
- }
- }
- }
- void timer0(void) interrupt 1
- {
- TH0=(65536-2000)/256; //2ms
- TL0=(65536-2000)%256;
- if(b_flag) //開始(START)鍵按下,嘟一聲(長1秒),表示開始搶答
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料51hei下載地址:
http://www.zg4o1577.cn/bbs/dpj-116725-1.html
|