0.png (46.57 KB, 下載次數(shù): 168)
下載附件
2018-12-29 22:38 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (24.76 KB, 下載次數(shù): 138)
下載附件
2018-12-29 22:38 上傳
介紹了數(shù)碼顯示八路搶答器電路的組成、設(shè)計及功能,該搶答器除具有基本的搶答功能外,還具有計時和報警的功能。主持人通過時間預(yù)設(shè)開關(guān)預(yù)設(shè)供搶答的時間,系統(tǒng)將完成自動倒計時。若在規(guī)定的時間有人搶答,則計時將自動停止,若在規(guī)定的時間無人搶答,則系統(tǒng)中的蜂鳴器將發(fā)響,提示主持人本輪搶答無效,實現(xiàn)報警功能,若超過搶答時間則搶答無效。
目錄
1概 述 3
2 系統(tǒng)設(shè)計內(nèi)容 4
2.1系統(tǒng)設(shè)計依據(jù) 5
2.2設(shè)計任務(wù)和要求 5
2.3設(shè)計目的 5
2.4設(shè)計要點 5
3 單元電路設(shè)計與分析 6
3.1 單片機控制原理 6
3.2搶答器的原理 9
3.3 功能模塊電路 10
3.3.1開始搶答電路 10
3.3.2 選手搶答鍵 10
3.3.3 顯示與顯示驅(qū)動電路 11
3.3.4蜂鳴器音頻輸出電路 11
4軟件設(shè)計 12
4.1程序設(shè)計 12
4.1.1 系統(tǒng)流程圖 12
4.1.2搶答成功流程圖 13
4.2 程序代碼 13
4.2.1 主程序 13
4.2.2 定時器子程序 18
4.2.3 延時子程序 18
4.2.4 顯示子程序 19
4.2.5 紅外中斷程序 19
5 總原理圖及元件清單 21
5.1總原理圖 21
5.2元件清單 23
6系統(tǒng)仿真 24
7結(jié)論 25
8心得體會 26
9參考文獻 27
概述 隨著社會的不斷進步,電子技術(shù)也飛速的向前發(fā)展.特別是大規(guī)模集成電路的發(fā)展,把我們帶進了電子化時代。電子產(chǎn)品的日益增多,也讓我們的生活越來越方便。特別是計算機的發(fā)展,真可謂是突飛猛進。自從1946年世界上第一臺計算機的誕生以來,還不到六十年的時間,計算機就取得了舉世矚目的成績。特別是在通信領(lǐng)域,實現(xiàn)了信息一體化的時代。作為大學(xué)生的我們,更需要加強實踐能力的培養(yǎng)。課程設(shè)計在一定程度上反映了我們對理論知識的理解程度,是理論與實踐的橋梁。它不僅能鍛煉我們的動手能力,而且能夠培養(yǎng)我們對問題的思考能力以及對知識的進一步了解。當你能把你所學(xué)到知識化作為現(xiàn)實的東西時,我們能力就提升到一個新臺階。 很多人都認為學(xué)習(xí)是枯燥無味的,有時覺得與現(xiàn)實太遙遠。在學(xué)習(xí)之余,我們?nèi)匀豢梢哉业揭稽c有趣的事情,比如說做一個聲控?zé)襞荨?shù)字鐘等等。生活中我們要找到自己感興趣的東西。這次綜合課程設(shè)計中,我制作了八路搶答器。 搶答器是為智力競賽參賽者答題時進行搶答而設(shè)計的一種優(yōu)先判決器電路,廣泛應(yīng)用于各種知識競賽、文娛活動等場合。能夠?qū)崿F(xiàn)搶答器功能的方式有多種,可以采用前期的模擬電路、數(shù)字電路或模擬與數(shù)字電路相結(jié)合的方式,但這種方式制作過程復(fù)雜,而且準確性與可靠性不高,成品面積大,安裝、維護困難。本節(jié)介紹一種利用51單片機作為核心部件進行邏輯控制及信號產(chǎn)生的八路搶答器。近年來,隨著單片機檔次的不斷提高,功能的不斷完善,其應(yīng)用日趨成熟、應(yīng)用領(lǐng)域日趨擴大,特別是工業(yè)測控、尖端武器和日用家電等領(lǐng)域更是因為有了單片機而生輝增色。單片機應(yīng)用技術(shù)已成為一項新的工程應(yīng)用技術(shù)。本次課程設(shè)計我們做的是無線八路搶答器,我們采用STC89C51單片機實現(xiàn)搶答功能,采用紅外遙控收發(fā)實現(xiàn)無線信號的搶答,性能更穩(wěn)定,更易操作調(diào)試。 2 系統(tǒng)設(shè)計內(nèi)容 2.1系統(tǒng)設(shè)計依據(jù)
搶答器由計數(shù)器、寄存器、集成定時器和譯碼顯示等組合、無線傳輸與接收、時序電路組成。可分為搶答電路,定時電路,報警電路,無線電路等幾個單元部分。每個單元電路分別可以處理一些搶答競賽中的基本問題。
本次課程設(shè)計設(shè)計的是一個多路定時無線搶答器,是一個多于兩位選手參賽的一個搶答器,具有鎖存和顯示功能。同時有主持人控制系統(tǒng)的清零和搶答的開始。搶答開始后,若有任何一名選手按動搶答按鈕,搶答器就會顯示該選手編號直至系統(tǒng)被主持人清零,并有揚聲器發(fā)出提示,同時其他人再搶答就無效了。這次設(shè)計的搶答器還有自動定時功能,主持人可以設(shè)定選手答題的時間。當主持人啟動“開始”鍵后,定時器會自動減計時,這個會顯示在顯示器上。選手只有在搶答時間內(nèi)搶答才有效,若在答題時間內(nèi)沒有選手答題,時間到時,報警電路就會發(fā)出警報亮燈并且禁止搶答。 2.2設(shè)計任務(wù)和要求 以單片機為核心,設(shè)計一個8位競賽搶答器。 1)搶答器同時供8名選手或2個代表隊比賽,分別用8個按鈕S0-S7表示。 2)設(shè)置一個系統(tǒng)清除和搶答控制開關(guān)S,該開關(guān)由主持人控制。 3)搶答器具有鎖存與顯示功能。即選手按動按鈕,鎖存相應(yīng)的編號,并在優(yōu)先搶答選手的編號一直保持到主持人將系統(tǒng)清除為止。 4)搶答器具有定時搶答功能,且一次搶答的時間由主持人設(shè)定(如30s等)。當主持人啟動“開始”按鍵后,定時器進行減計時,同時揚聲器發(fā)出短暫的聲響,聲響持續(xù)時間為0.5s左右。 5)參賽選手在設(shè)定時間內(nèi)進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手編號和搶答時間,并保持到主持人將系統(tǒng)清除為止。 6)如果定時時間到,無人搶答,本次搶答無效,系統(tǒng)報警并禁止搶答,定時顯示器上顯示00; 7)設(shè)計出軟件編程方法,并寫出源代碼; 8)主機與從機實現(xiàn)無線搶答 9)用PROTEUS進行仿真; 10)論文格式要符合學(xué)院的統(tǒng)一規(guī)定,結(jié)構(gòu)要合符邏輯,表達要得體。 2.3 設(shè)計目的 通過設(shè)計學(xué)習(xí)單片機最小系統(tǒng)的基本設(shè)計方法,掌握單片機應(yīng)用系統(tǒng)的開發(fā)調(diào)試過程。 (1)學(xué)習(xí)單片機開發(fā)工具功能、特點和使用方法。 (2)學(xué)會單片機控制系統(tǒng)程序的編制和編制和調(diào)試方法。 (3)設(shè)計單片機搶答器硬件電路,繪制出電路原理圖。 (4)編制并調(diào)試出鍵盤掃描程序和顯示驅(qū)動程序。 (5)掌握單片機定時器的基本用法,編制出定時器的中斷程序。 2.4 設(shè)計要點 根據(jù)控制系統(tǒng)的工作原理和執(zhí)行裝置,可以將系統(tǒng)設(shè)計分為硬件和軟件兩大部分。硬件設(shè)計部分,包括編寫電路原理圖、合理選擇元器件、焊接各個元器件,然后對硬件性能進行調(diào)試、測試,以達到設(shè)計要求。軟件設(shè)計部分,首先在設(shè)計之前完成系統(tǒng)總框圖和確定各個功能模塊,然后進行具體設(shè)計,包括各模塊的流程圖,選擇合適的編程語言和軟件應(yīng)用程序,進行編程設(shè)計等;最后是通過軟件對程序進行調(diào)試、測試,以及仿真,以達到性能的最優(yōu)化。 下面是軟硬件設(shè)計方法確定的。軟件設(shè)計的方法與開發(fā)環(huán)境的選取有著直接的關(guān)系,本系統(tǒng)由于是采用51系列單片機,因此使用Keil C語言進行開發(fā)。此編程工具相比匯編語言具有結(jié)構(gòu)化、適用范圍大、可移植性好等特點。本系統(tǒng)軟件設(shè)計采用模塊化系統(tǒng)設(shè)計方法,先編寫各個功能模塊子程序,然后進行組合與調(diào)整,經(jīng)過調(diào)試后,可以進行仿真測試,已達到設(shè)計功能要求。為配合軟件的靈活設(shè)計,硬件電路是采用結(jié)構(gòu)化系統(tǒng)設(shè)計方法,該方法保證設(shè)計電路的標準化、模塊化。硬件電路的設(shè)計最重要的選擇用于控制的單片機,再確定與之配套的外圍芯片,使所設(shè)計的系統(tǒng)既經(jīng)濟又高性能。硬件電路設(shè)計可以在焊接元器件之前畫出詳細電路圖,標出芯片的型號、器件參數(shù)值,根據(jù)電路圖在仿真軟件上進行調(diào)試,發(fā)現(xiàn)設(shè)計錯誤時立即修改,高效,準確地完成硬件設(shè)計。 3單元電路設(shè)計與分析 3.1 單片機控制原理 單片機(SCM)是單片微型計算機(Single Chip Microcomputer)的簡稱。它是把中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、I/O接口電路、定時/計數(shù)器以及輸入輸出適配器都集成在一塊芯片上,構(gòu)成一個完整的微型計算機。它的最大優(yōu)點是體積小,可放在儀表內(nèi)部。但存儲量小,輸入輸出適配器簡單,功能較低。目前,單片機在民用和工業(yè)測控領(lǐng)域得到最廣泛的應(yīng)用,早已深深地融入人們的生活中。 簡單的說,用單片機系統(tǒng)來設(shè)計搶答器,實現(xiàn)兩組的搶答時間即使是相差幾微秒,也可分辨出哪組優(yōu)先答題。 P0端口(P0.0-P0.7):P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 STC89C51是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C51為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標準功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口。另外 STC89X51 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35Mhz,6T/12T可選。 圖3-2 STC89C51單片機引腳圖 
單片機是美國STC公司最新推出的一種新型51內(nèi)核的單片機。片內(nèi)含有Flash程序存儲器、SRAM、UART、SPI、PWM等模塊。 (一)STC89C51主要功能、性能參數(shù)如下: (1)內(nèi)置標準51內(nèi)核,機器周期:增強型為6時鐘,普通型為12時鐘; (2)工作頻率范圍:0~40MHZ,相當于普通8051的0~80MHZ; (3)STC89C51RC對應(yīng)Flash空間:4KB; (4)內(nèi)部存儲器(RAM):512B; (5)定時器\計數(shù)器:3個16位; (6)通用異步通信口(UART)1個; (7)中斷源:8個; (8)有ISP(在系統(tǒng)可編程)\IAP(在應(yīng)用可編程),無需專用編程器\仿真器; (9)通用I\O口:32\36個; (10)工作電壓:3.8~5.5V; (11)外形封裝:40腳PDIP、44腳PLCC和PQFP等。 (二)STC89C51單片機的引腳說明: VCC:供電電壓。 GND:接地。 RST:復(fù)位輸入。當振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。 ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。 /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 (三)STC89C51單片機最小系統(tǒng): 最小系統(tǒng)包括單片機及其所需的必要的電源、時鐘、復(fù)位等部件,能使單片機始終處于正常的運行狀態(tài)。電源、時鐘等電路是使單片機能運行的必備條件,可以將最小系統(tǒng)作為應(yīng)用系統(tǒng)的核心部分,通過對其進行存儲器擴展、A/D擴展等,使單片機完成較復(fù)雜的功能。 STC89C51是片內(nèi)有ROM/EPROM的單片機,因此,這種芯片構(gòu)成的最小系統(tǒng)簡單﹑可靠。用STC89C52單片機構(gòu)成最小應(yīng)用系統(tǒng)時,只要將單片機接上時鐘電路和復(fù)位電路即可,結(jié)構(gòu)如圖2-3所示,由于集成度的限制,最小應(yīng)用系統(tǒng)只能用作一些小型的控制單元。 圖3-3 單片機最小系統(tǒng)原理框圖   (1) 時鐘電路 STC89C51單片機的時鐘信號通常有兩種方式產(chǎn)生:一是內(nèi)部時鐘方式,二是外部時鐘方式。內(nèi)部時鐘方式如圖2-4所示。在STC89C51單片機內(nèi)部有一振蕩電路,只要在單片機的XTAL1(18)和XTAL2(19)引腳外接石英晶體(簡稱晶振),就構(gòu)成了自激振蕩器并在單片機內(nèi)部產(chǎn)生時鐘脈沖信號。圖中電容C1和C2的作用是穩(wěn)定頻率和快速起振,電容值在5~30pF,典型值為30pF。晶振CYS的振蕩頻率范圍在1.2~12MHz間選擇 ,典型值 為12MHz和6MHz。 圖3-4 STC89C51內(nèi)部時鐘電路 
(2) 復(fù)位電路 當在STC89C51單片機的RST引腳引入高電平并保持2個機器周期時,單片機內(nèi)部就執(zhí)行復(fù)位操作(若該引腳持續(xù)保持高電平,單片機就處于循環(huán)復(fù)位狀態(tài))。 復(fù)位電路通常采用上電自動復(fù)位和按鈕復(fù)位兩種方式。 最簡單的上電自動復(fù)位電路中上電自動復(fù)位是通過外部復(fù)位電路的電容充放電來實現(xiàn)的。只要Vcc的上升時間不超過1ms,就可以實現(xiàn)自動上電復(fù)位。 除了上電復(fù)位外,有時還需要按鍵手動復(fù)位。本設(shè)計就是用的按鍵手動復(fù)位。按鍵手動復(fù)位有電平方式和脈沖方式兩種。其中電平復(fù)位是通過RST(9)端與電源Vcc接通而實現(xiàn)的。按鍵手動復(fù)位電路見圖2-5。時鐘頻率用11.0592MHZ時C取10uF,R取10kΩ。 圖3-5 STC89C51復(fù)位電路 
(3) STC89C51中斷技術(shù)概述 中斷技術(shù)主要用于實時監(jiān)測與控制,要求單片機能及時地響應(yīng)中斷請求源提出的服務(wù)請求,并作出快速響應(yīng)、及時處理。這是由片內(nèi)的中斷系統(tǒng)來實現(xiàn)的。當中斷請求源發(fā)出中斷請求時,如果中斷請求被允許,單片機暫時中止當前正在執(zhí)行的主程序,轉(zhuǎn)到中斷服務(wù)處理程序處理中斷服務(wù)請求。中斷服務(wù)處理程序處理完中斷服務(wù)請求后,再回到原來被中止的程序之處(斷點),繼續(xù)執(zhí)行被中斷的主程序。 圖3-6為整個中斷響應(yīng)和處理過程
如果單片機沒有中斷系統(tǒng),單片機的大量時間可能會浪費在查詢是否有服務(wù)請求發(fā)生的定時查詢操作上。采用中斷技術(shù)完全消除了單片機在查詢方式中的等待現(xiàn)象,大大地提高了單片機的工作效率和實時性。 3.2搶答器的原理 搶答器的工作原理是采用單片機最小系統(tǒng),用程序查詢方式采用動態(tài)顯示組號。主持人按下開始搶答鍵才可以搶答。主持人沒有按下開始搶答按紐(P3.0),有人搶答則搶答違規(guī),報警并顯示組號,主持人按下開始搶答開關(guān)重新?lián)尨稹V鞒秩税聪麻_始搶答按紐(P3.0),蜂鳴響聲提示,數(shù)碼管30秒倒計時搶答,蜂鳴器響聲提示并顯示他的組號,30秒內(nèi)有人搶答則開始60秒倒計時(60秒內(nèi)必須回答完問題),最后五秒倒計時警報。單片機最小系統(tǒng)、搶答按鍵模塊(四位并行數(shù)碼顯示)、顯示模塊、顯示驅(qū)動模塊、搶答開關(guān)模塊、蜂鳴器音頻輸出模塊。由于仿真中沒有無線芯片,所以選手搶答用按鍵代替如下圖: 圖3.2搶答器總原理圖 3.3 功能模塊電路 3.3.1開始搶答電路 圖3.3.1開始搶答電路 3.3.2 選手搶答鍵 圖3.3.2 選手搶答電路 3.3.3 顯示與顯示驅(qū)動電路 在此次課程設(shè)計電路中當一個問題結(jié)束主持人后按下復(fù)位開關(guān)后進行下一題的準備。 89C51的P1口做一個為選手搶答的輸入按鍵引腳,P1.0至P1.7輪流輸出低電位,給每一個選手編號1至8,當選手按下按鈕時,P1口個端口的電平變化從P1口輸入,經(jīng)單片機處理后從P0輸出由數(shù)碼管顯示搶答者編號。由于仿真中沒有無線芯片,所以選手搶答用按鍵代替如下圖: 此電路包括顯示和驅(qū)動,顯示采用數(shù)碼管,驅(qū)動用P2口, 違規(guī)者編號、搶答30秒倒計時、正常搶答者編號和回答問題時間60秒倒計時,數(shù)碼管采用動態(tài)顯示。驅(qū)動電路P2口,查詢顯示程序利用P0口做段選碼口輸出P2低3位做位選碼輸出,當為低電平則能驅(qū)動數(shù)碼管使其顯示數(shù)字。在+5V電壓下接1k的上拉電阻,保證正常壓降,驅(qū)動數(shù)碼管更亮。 圖3.3.3 顯示與顯示驅(qū)動電路 3.3.4蜂鳴器音頻輸出電路 通過控制不同頻率的矩形脈沖來控制蜂鳴器發(fā)聲。此次課程設(shè)計中只需要一些簡單的提示聲音和稍微顯眼的燈控,有搶答違規(guī),開始搶答,搶答時間結(jié)束和回答時間到得提示聲和亮燈提醒。 圖3.3.4蜂鳴器音頻輸出電路
4軟件設(shè)計
4.1程序設(shè)計 4.1.1 系統(tǒng)流程圖
4.1.2搶答成功流程圖
5 總原理圖及元件清單 5.1總原理圖
5.2元件清單 本系統(tǒng)采用單片機作為整個控制核心。控制系統(tǒng)主要由:顯示模塊、控制模塊、報警模塊、搶答模塊和無線模塊組成。工作時,該系統(tǒng)通過矩陣鍵盤輸入搶答信號,經(jīng)單片機的處理后,輸出控制信號,利用一個4位數(shù)碼管來完成顯示功能并伴隨蜂鳴器報警,用按鍵來讓選手進行搶答,在數(shù)碼管上顯示哪一組先答題,從而實現(xiàn)整個搶答過程。 當主持人按下開始鍵時,向單片機P3.2引腳輸入一個低電平信號,表示整個電路開始工作,此時數(shù)碼管前兩位顯示選手編號(無人搶答顯示00),后兩位顯示倒計時剩余時間。若在25秒內(nèi)仍然無人搶答,蜂鳴器在最后8秒發(fā)出連續(xù)報警,提示搶答時間快要結(jié)束;若在30秒內(nèi)有人搶答,并且搶答成功,則將選手編號顯示在數(shù)碼管前兩位上,后兩位顯示搶答剩余時間,同時蜂鳴器發(fā)出一聲報警,提示其他沒有搶答的選手此題已被人搶答成功。若在搶答過程中遇見特殊情況,主持人則可以通過時間加,時間減按鍵來進行時間調(diào)節(jié)。若要開始新的一輪搶答,主持人按下復(fù)位鍵再按開始鍵即可。 此次用單片機控制的搶答器思路簡單明了,可操作性強,可靠性高,擴展功能強,能夠完全實現(xiàn)普通搶答器的基本功能。 
6系統(tǒng)仿真
7結(jié)論 1設(shè)計思路是整個設(shè)計的靈魂 拿下每個課題能有一個非常清晰的設(shè)計思路是至關(guān)重要的。 只有對課題的充分理解,對各種器件的熟練掌握,勾畫出基本的 設(shè)計圖是成功的關(guān)鍵, 必須多花時間在設(shè)計上才能為后續(xù)工作提 , 供更扎實的基礎(chǔ)。翻閱各種資料,上網(wǎng)查詢填補所需知識的空白 是必要的。 2將電路分為幾個模塊,模塊與模塊間連接最好圍繞著電源的正負極來進行模塊與模塊間的連接。 3在網(wǎng)上尋找到的一些原理圖,可能未經(jīng)過驗證,所以使用前要驗證一下,確保正確后才采納。 4研究明白電路中各電子元件的作用,會讓你對電路更加透徹,也會讓你盡量避免焊接時的錯誤,導(dǎo)致飛線的產(chǎn)生。 8心得體會 通過本次課程設(shè)計,把我們在課堂上學(xué)到的數(shù)字電路知識運用到實際當中。如各種常見芯片的功能, 各種組合邏輯電路和時序邏輯電路的設(shè)計,在此次設(shè)計中,當然也遇到了許多問題,畢竟這是第一次設(shè)計 一個很實際的硬件的器件。在進行一個綜合性的硬件設(shè)計時,要全面考慮問題,如想用其他信號來控制一個信號,就要考慮到和 這個信號直接或間接關(guān)系的信號,必須是最重要相關(guān)的信號,然后用真值表來解決他們的關(guān)系,通過門電 路來實現(xiàn)。這一個星期的課程設(shè)計,讓我真正理解了書本上知識,也讓我知道我們課本上的知識在實際中 怎么應(yīng)用,理論聯(lián)系實際。通過此次設(shè)計,我對理論知識的學(xué)習(xí)有了很大的興趣,現(xiàn)在我可以主動的去 學(xué)習(xí),我明白自己該學(xué)習(xí)那個方面,重點是什么。我也掌握的了在理論中遇到問題,應(yīng)該怎樣去解決,在 實際中遇到迷團應(yīng)該怎樣去檢查調(diào)試。我也掌握的了在理論中遇到問題,應(yīng)該怎樣去解決,在實際中遇到迷團應(yīng)該怎樣去檢查調(diào)試。在這次設(shè)計過程中還了解到在設(shè)計的時候不僅是設(shè)計好,更重要的是想方設(shè)法在功能實現(xiàn)的同時降低成本。
單片機源程序如下:
- /*************************************************************
- 八路搶答器系統(tǒng)
- 補充說明:
- ***************************************************************/
- #include<reg52.h> //頭文件
- #include<SMG.h>
- #include<EEPROM.h>
- #include<INTERRUPT.h>
- #define uchar unsigned char//宏定義
- #define uint unsigned int
- /**********************引腳定義************************/
- sbit key_zhu=P2^2; //主持人鍵
- sbit key_jia=P2^1; //加鍵
- sbit key_jian=P2^0; //減鍵
- sbit key_1=P1^1; //八位選手按鍵定義
- sbit key_2=P1^3;
- sbit key_3=P1^5;
- sbit key_4=P1^7;
- sbit key_5=P3^1;
- sbit key_6=P3^3;
- sbit key_7=P3^5;
- sbit key_8=P3^7;
- sbit led_1=P1^0; //八位LED燈按鍵定義
- sbit led_2=P1^2;
- sbit led_3=P1^4;
- sbit led_4=P1^6;
- sbit led_5=P3^0;
- sbit led_6=P3^2;
- sbit led_7=P3^4;
- sbit led_8=P3^6;
- /**********************變量定義************************/
- uchar zhu_f=0; //比賽進行階段標記位,=0表示沒有按。=1表示在設(shè)置倒計時的時間。=2表示開始搶答
- uchar qiang_f=0; //搶答犯規(guī)標記,=0沒有犯規(guī)。=1表示有人犯規(guī)
- uchar wan_f=0; //搶答完成標記,=0搶答沒完成后還沒有開始。=1表示搶答完成
- uchar time=30; //倒計時時間
- uchar T0_num; //定時器0計數(shù)
- uchar number; //搶答成功選手的編號,或犯規(guī)選手的編號。=0的時候表示沒有
- /********************************************************
- 函數(shù)名稱:void delayms(uint ms)
- 函數(shù)作用:毫秒延時函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void delayms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void bajing()
- 函數(shù)作用:搶答犯規(guī)報警提示
- 參數(shù)說明:
- ********************************************************/
- void bajing()
- {
- buzz=0; //開蜂鳴器
- delayms(10);
- buzz=1; //關(guān)蜂鳴器
- delayms(10);
- }
- /********************************************************
- 函數(shù)名稱:uchar qianda()
- 函數(shù)作用:搶答按鍵檢測,返回搶答編號
- 參數(shù)說明:
- ********************************************************/
- uchar qianda()
- {
- uchar temp=0;
- if(key_1==0) //一號犯規(guī),下同
- temp=1; //記錄1號
- else
- if(key_2==0)
- temp=2;
- else
- if(key_3==0)
- temp=3;
- else
- if(key_4==0)
- temp=4;
- else
- if(key_5==0)
- temp=5;
- else
- if(key_6==0)
- temp=6;
- else
- if(key_7==0)
- temp=7;
- else
- if(key_8==0)
- temp=8;
- return temp;
- }
- /********************************************************
- 函數(shù)名稱:void led_kongzhi(uchar num,bit mode)
- 函數(shù)作用:LED燈控制
- 參數(shù)說明:num控制哪一個燈,k=1,點亮,=0關(guān)閉。mode=0全滅后在控制這個燈,=1單獨控制這個燈
- ********************************************************/
- void led_kongzhi(uchar num,bit k,bit mode)
- {
- if(mode==0)
- {
- led_1=1; //八位LED燈全滅
- led_2=1;
- led_3=1;
- led_4=1;
- led_5=1;
- led_6=1;
- led_7=1;
- led_8=1;
- }
- if(k==1)
- {
- switch (num) //控制對應(yīng)LED燈亮
- {
- case 1:led_1=0;
- break;
- case 2:led_2=0;
- break;
- case 3:led_3=0;
- break;
- case 4:led_4=0;
- break;
- case 5:led_5=0;
- break;
- case 6:led_6=0;
- break;
- case 7:led_7=0;
- break;
- case 8:led_8=0;
- break;
- }
- }
- else
- {
- switch (num) //控制對應(yīng)LED燈滅
- {
- case 1:led_1=1;
- break;
- case 2:led_2=1;
- break;
- case 3:led_3=1;
- break;
- case 4:led_4=1;
- break;
- case 5:led_5=1;
- break;
- case 6:led_6=1;
- break;
- case 7:led_7=1;
- break;
- case 8:led_8=1;
- break;
- }
- }
- }
- /********************************************************
- 函數(shù)名稱:void scan(void)
- 函數(shù)作用:按鍵檢測函數(shù)
- 參數(shù)說明:
- ********************************************************/
- void scan(void)
- {
- uchar qiangda_num=0;
- //主持人鍵
- if(key_zhu==0) //按鍵按下
- {
- delayms(7); //顯示消抖
- if(key_zhu==0&&zhu_f!=2&&qiang_f==0&&wan_f==0)//判斷是否有人犯規(guī)或者搶答是否開始或者搶答是否完成
- {
- zhu_f++; //比賽階段標記+1
- if(zhu_f==2) //比賽正式開始
- {
- TR0=1; //比賽開始,開啟定時
- wan_f=0; //清除比賽完成標志
- bajing(); //提示比賽開始
- }
- }
- else
- if(key_zhu==0&&qiang_f==1) //判斷是否有人犯規(guī)
- {
- buzz=1; //清除報警
- qiang_f=0; //清除搶答標志
- number=0; //清除選手編號
- time=EEPROM_read(0x2000);//重新讀取存儲的搶答總時長
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&wan_f==1) //判斷是否有人完成
- {
- buzz=1; //清除報警
- wan_f=0; //清除完成標志
- number=0; //清除選手編號
- time=EEPROM_read(0x2000);//重新讀取存儲的搶答總時長
- led_kongzhi(0,0,0);
- }
- else
- if(key_zhu==0&&zhu_f==2) //暫停比賽
- {
- TR0=0; //關(guān)閉定時
- zhu_f=1; //重新回到設(shè)置比賽時間階段
- bajing(); //提示暫停比賽
- }
- while(!key_zhu);//檢測按鍵松開
- }
- //加值鍵,支持連按
- if(key_jia==0&&zhu_f==1&&qiang_f==0) //判斷是否在設(shè)置倒計時時間
- {
- delayms(7); //延時消抖
- if(key_jia==0) //再次判斷按鍵按下
- {
- if(time<99) //比賽時間最大值99S
- time++; //比賽時間+1S
- EEPROM_delete(0x2000); //擦除EEPROM煽區(qū)
- EEPROM_write(0x2000,time); //寫入【比賽時間】數(shù)據(jù)保存
- display(time/10,time%10,10,0); //顯示設(shè)置比賽時間
- }
- }
- //減值鍵,支持連按
- if(key_jian==0&&zhu_f==1&&qiang_f==0) //判斷是否在設(shè)置倒計時時間
- {
- delayms(7); //延時消抖
- if(key_jian==0) //再次判斷按鍵按下
- {
- if(time!=0) //比賽時間最小值0S
- time--; //比賽時間-1S
- EEPROM_delete(0x2000); //擦除EEPROM煽區(qū)
- EEPROM_write(0x2000,time); //寫入【比賽時間】數(shù)據(jù)保存
- display(time/10,time%10,10,0); //顯示設(shè)置比賽時間
- }
- }
- //選手按鍵
- qiangda_num=qianda();
- if(qiangda_num!=0) //判斷是否有選手按下按鍵
- {
- if(zhu_f!=2&&qiang_f==0&&wan_f==0)//如果還沒有開始搶答時按下
- {
- zhu_f=1;
- buzz=0; //蜂鳴器報警
- qiang_f=1; //搶答犯規(guī)標記
- number=qiangda_num;
- led_kongzhi(number,1,0);
- }
- else
- if(zhu_f==2&&wan_f==0) //在開始搶答時按下
- {
- wan_f=1; //標記搶答完成
- zhu_f=0; //主持人標記復(fù)位
- TR0=0; //關(guān)閉倒計時定時器
- number=qiangda_num;
- led_kongzhi(number,1,0);
- bajing(); //提示有人搶答完成
- }
- }
- }
- /*********************************************************
- 函數(shù)名稱:void main()
- 函數(shù)作用:主函數(shù)函數(shù)
- 參數(shù)說明:
- *********************************************************/
- void main()
- {
- uchar i=0;
- T0_init(); //定時器初始化
- if(key_jian==0)
- {
- delayms(100);
- if(key_jian==0)
- {
- EEPROM_delete(0x2000); //擦除EEPROM煽區(qū)
- EEPROM_write(0x2000,30); //寫入【比賽時間】數(shù)據(jù)保存
- }
- }
- time=EEPROM_read(0x2000); //讀取存儲的【比賽時間】數(shù)據(jù)
- for(i=0;i<9;i++)
- {
- led_kongzhi(i,1,1);
- delayms(10);
- }
- for(i=9;i>0;i--)
- {
- led_kongzhi(i-1,0,1);
- delayms(10);
- }
- led_kongzhi(0,0,0);
- while(1) //死循環(huán)
- {
- scan(); //按鍵檢測處理
- if(zhu_f==0&&wan_f==0) //判斷是否還沒進入比賽階段
- display(10,10,10,10); //未進入,顯示"----"
- else
- if(zhu_f==0&&wan_f==1) //進入比賽階段,并且處于設(shè)置比賽時間
- display(time/10,time%10,10,number);//顯示設(shè)置比賽時間
- else
- if(zhu_f!=0)
- {
- if(qiang_f==1) //設(shè)有人犯規(guī)
- display(11,11,10,number); //顯示FF-犯規(guī)編號
- else
- display(time/10,time%10,10,number);//顯示比賽剩余時間和搶答者編號,未搶答顯示0
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
八路搶答器.rar
(905.64 KB, 下載次數(shù): 748)
2018-12-26 10:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|