久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8719|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機的簡易8路搶答器設計說明書(word格式可編輯文檔下載)

[復制鏈接]
跳轉到指定樓層
樓主
摘  要
ATMEl公司的8位單片機有AT89、AT90兩個系列,AT89系列是8位Flash單片機,與8051系列單片機相兼容,靜態時鐘模式;AT90系列單片機是增強RISC結構、全靜態工作方式、內載在線可編程Flash的單片機,也叫AVR單片機.
單片機具有體積小、功耗低、控制功能強、擴展靈活、微型化和使用方便等優點,采用單片機控制使得儀器儀表數字化、智能化、微型化,且功能比起采用電子或數字電路更加強大。而我正是看中單片機的這種優勢,因此設計了一個由AT89C51單片機控制的八路搶答器,它具有搶答、數據顯示、報警、計時的功能,系統由單片機AT89C51、數碼管、蜂鳴器報警模塊、按鍵模塊所組成,能做到搶答公平、公正又準確。

目錄
1. 緒論
1.1搶答器的概述
1.2設計要求及目的
2.硬件電路設計
2.1總體電路原理圖
2.2 時鐘振蕩電路的設計
2.3復位電路的設計
2.4數碼管顯示電路的設計
2.5按鍵電路的設計
2.6蜂鳴器電路設計
2.7系統復位
3.系統軟件設計
3.1系統組成方框圖
3.2程序流程圖
4.焊接調試過程與問題分析。
4.1 焊接
4.1.1檢測各元件
4.1.2對PCB板進行排版及連線
4.1.3 焊接的問題及解決
4.1.4焊接的技巧和注意事項
4.2調試
4.2.1系統的調試
4.2.2具體調試
參考文獻
致謝
附件1:基于單片機的簡易搶答器系統設計實物圖
附件2:基于單片機的簡易搶答器系統單面PCB板圖
附件3:基于單片機的簡易搶答器系統設計程序
1. 緒論
1.1搶答器的概述
搶答器作為一種小型的早期電子產品,在現在的知識競賽、文體娛樂活動(搶答賽活動)中應用十分廣泛,能準確、公正、直觀地判斷出搶答者的座位號。傳統搶答器只是大概判斷出搶答成功或犯規選手臺號,無法顯示出每個選手的搶答時間。而今搶答器可以通過數據來說明裁決結果的準確性、公平性。使比賽大大增加了娛樂性的同時,也更加公平、公正。

1.2設計要求及目的
(1)設計一個可供8人進行的搶答器。
(2)系統設置復位按鈕,按動后,重新開始搶答。
(3)搶答器開始時數碼管顯示序號0,選手搶答實行優先顯示,優先搶答選手的編號一直保持到主持人將系統清除為止。搶答后顯示優先搶答者序號,同時發出音響。,并且不出現其他搶答者的序號。
(4)搶答器具有定時搶答功能,且一次搶答的時間有主持人設定,本搶答器的時間設定為30秒,當主持人啟動“開始”開關后,定時器開始減計時,同時蜂鳴器有短暫的聲響。
(5)設定的搶答時間內,選手可以搶答,這時定時器停止工作,顯示器上顯示選手的號碼和搶答時間。并保持到主持人按復位鍵。
(6)當設定的時間到,而無人搶答時,本次搶答無效,揚聲器報警發出聲音,并禁止搶答。定時器上顯示00。

2.硬件電路設計
系統硬件設計
為使硬件電路設計盡可能合理,應注意以下幾方面:
(1) 盡可能采用功能強的芯片,以簡化電路,功能強的芯片可以代替若干普通芯片,隨著生產工藝的提高,新型芯片的的價格不斷下降,并不一定比若干普通芯片價格的總和高。
(2) 留有設計余地。在設計硬件電路時,要考慮到將來修改擴展的方便。因為很少有一錘定音的電路設計,如果現在不留余地,將來可能要為一點小小的修改或擴展而被迫進行全面返工。
(3) 程序空間,選用片內程序空間足夠大的單片機,本設計采用AT89C51單片機。
(4)  I/O端口,在樣機研制出來后進行現場試用時,往往會發現一些被忽視的問題,而這些問題不是靠單純的軟件措施來解決的。如有些新的信號需要采集,就必須增加輸入檢測端;有些物理量需要控制,就必須增加輸出端。如果在硬件電路設計就預留出一些I/O端口,雖然當時空著沒用,那么用的時候就派上用場了。
2.1總體電路原理圖
                          圖1 總電路圖
2.2 時鐘振蕩電路的設計
單片機必須在時鐘的驅動下才能工作.在單片機內部有一個時鐘振蕩電路,只需要外接一個振蕩源就能產生一定的時鐘信號送到單片機內部的各個單元,決定單片機的工作速度。
圖2  時鐘振蕩電路圖
一般選用石英晶體振蕩器。此電路在加電大約延遲10ms后振蕩器起振,在XTAL2引腳產生幅度為3V左右的正弦波時鐘信號,其振蕩頻率主要由石英晶振的頻率確定。電路中兩個電容 C2,C3的作用有兩個:一是幫助振蕩器起振;二是對振蕩器的頻率進行微調。C2,C3的典型值為30PF。
單片機在工作時,由內部振蕩器產生或由外直接輸入的送至內部控制邏輯單元的時鐘信號的周期稱為時鐘周期。其大小是時鐘信號頻率的倒數,常用fosc表示。如時鐘頻率為12MHz,即fosc=12MHz,則時鐘周期為1/12µs。
2.3復位電路的設計
單片機的第9腳RST為硬件復位端,只要將該端持續4個機器周期的高電平即可實現復位,復位后單片機的各狀態都恢復到初始化狀態,其電路圖如圖所示:
圖3 復位電路圖
值得注意的是,在設計當中使用到了硬件復位和軟件復位兩種功能,由上面的硬件復位后的各狀態可知寄存器及存儲器的值都恢復到了初始值,而前面的功能介紹中提到了倒計時時間的記憶功能,該功能的實現的前提條件就是不能對單片機進行硬件復位,所以設定了軟復位功能。軟復位實際上就是當程序執行完畢之后,將程序指針通過一條跳轉指令讓它跳轉到程序執行的起始地址。
2.4數碼管顯示電路的設計
顯示功能與硬件關系極大,當硬件固定后,如何在不引起操作者誤解的前提下提供盡可能豐富的信息,全靠軟件來解決。
     
                     圖4 數碼管顯示電路圖
2.5按鍵電路的設計
鍵盤是人與微機系統打交道的主要設備。關于鍵盤硬件電路的設計方法也可以在文獻和書籍中找到,配合各種不同的硬件電路,這些書籍中一般也提供了相應的鍵盤掃描程序。站在系統監控軟件設計的立場上來看,僅僅完成鍵盤掃描,讀取當前時刻的鍵盤狀態是不夠的,還有不少問題需要妥善解決,否則,人們在操作鍵盤就容易引起誤操作和操作失控現象。在單片機應用中鍵盤用得最多的形式是獨立鍵盤及矩陣鍵盤。
圖5 按鍵圖
 在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成1乘8的8個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。
2.6蜂鳴器電路設計
我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單片機某個口線的“高”電平或低電平,則在該口線上就能產生一定頻率的矩形波,接上喇叭就能發出一定頻率的聲音,若再利用延時程序控制“高“”低”電平的持續時間,就能改變輸出頻率,從而改變音調,使喇叭發出不同的聲音。
                             6 蜂鳴器電路圖
2.7系統復位
使CPU進入初始狀態,從0000H地址開始執行程序的過程叫系統復位。從實現系統復位的方法來看,系統復位可分為硬件復位和軟件復位。硬件復位必須通過CPU外部的硬件電路給CPU的RESET端加上足夠時間的高電位才能實現。上電復位,人工按鈕復位和硬件看門狗復位均為硬件復位。硬件復位后,各專用寄存器的狀態均被初始化,且對片內通用寄存器的內容沒有影響。但是,硬件復位還能自動清除中斷激活標志,使中斷系統能夠正常工作,這樣一個事實卻容易為不少編碼人員所忽視。軟件復位就是用一系列指令來模擬硬件復位功能,最后通過轉移指令使程序從0000H地址開始執行。對各專用寄存器的復位操作是容易的,也沒有必要完全模擬,可根據實際需要去主程序初始化過程中完成。而對中斷激活標志的清除工作常被遺忘,因為它沒有明確的位地址可供編程。有的編程人員用020000(LJMP  0000H)作為軟件陷阱,認為直接轉向0000H地址就完成了軟件復位,就是這類錯誤的典型代表。軟件復位是使用軟件陷阱和軟件看門狗后必須進行的工作,這時程序出錯完全有可能發生在中斷子程序中,中斷激活標志已置位,它將阻止同級中斷響應。由于軟件看門是高級中斷,它將阻止說要中斷響應,由此可見清除中斷激活標志的重要性。
3.系統軟件設計
軟件任務分析和硬件電路設計結合進行,哪些功能由硬件完成,哪些任務由軟件完成,在硬件電路設計基本定型后,也就基本上決定下來了。
3.1系統組成方框圖


圖7 系統組成方框圖
3.2程序流程圖
在本設計中包括了以下八個主要的程序:主程序;非法搶答序;搶答時間調整程序;倒計時程序;正常搶答處理程序;犯規處理程序;顯示及發聲程序。主流程圖如圖所示:
     
                   8.1 定時程序流程圖
圖8.2 搶答程序流程圖
                     8.3 按鍵程序流程圖
4.焊接調試過程與問題分析。4.1 焊接
1.檢測各元件
2.對PCB板進行排版及              布線
3.焊接
4.1.1檢測各元件
用萬用表檢查、了解元件;
(1)一般電阻
電阻的阻值是可以根據電阻上的色環判斷:
四環電阻阻值等于前兩位對應的數值乘上第三位對應的倍率,第四位為誤差范圍;五環電阻阻值等于前三位對應的數值乘上第四位對應的倍率,第五位為誤差范圍。電阻R0為五環型,色環顏色:棕 黑 黑 棕 棕,阻值=100×10=1000Ω,誤差為±1%,實測阻值為992Ω,本實驗R1用兩個R0的電阻并聯成,電阻R2為四環型,色環顏色 :綠 棕 紅 金,阻值=51×10² =5100Ω=5.1kΩ,誤差為±5%,實測阻值為5.02kΩ;光敏電阻:A.在光照情況下,測量光敏電阻的阻值,即為光敏電阻的亮阻;B.在遮光情況下,測量光敏電阻的阻值,即為光敏電阻的暗阻。
(2)發光二極管
發光二極管有兩個接線柱,一個長的一個短的,長端為正極,短端為負極?梢岳萌f用表測量兩種接法時的電阻值,可知道當正極接到長端,負極接到短端的時候,發光二極管的阻值比較小,此即是二極管的單向導通特性。
(3可變電阻
可變電阻有三個引腳,它的接法和滑動變阻器的接法一樣,有三端接入式和兩端接入式,本實驗采用兩端接入式比較簡單。采用兩端接入時,其中一端必須接在中間的那個引腳上,另外一個在剩余的兩個引腳中,可以任選一個(兩者的區別是,滑動頭的轉動方向不一樣)。選擇好引腳后,可以將其接在萬用表上,測其阻值的大小,轉動滑動頭,看順時針轉動時阻值是增加還是減小,這樣做對調試電路時有好處,可以知道自己旋轉的方向是增加電阻還是減小電阻。
(4)蜂鳴器
本實驗所用的蜂鳴器和平時看到的揚聲器、耳機等發聲器件有微小的差別,它里邊多了一個振蕩器,輸入電流時振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲?梢試L試的將其正負極接上電源,可看到只有正負極接入正確時,蜂鳴器才會發聲。也可根據蜂鳴器上的引線長度按來判斷正負極(長正短負)。所以在實驗室中要把蜂鳴器的正負極接正確。
(5)三極管
三極管有兩種,一種是PNP管,一種是NPN管,本實驗用的是PNP管。
三極管有三個引腳,分別是基極(b),發射極(e),集電極(c)。本實驗所用的三極管判斷極點的方法是,面對有型號標記的一面,然后看著三個引腳,從左到右依次是,發射極(e),基極(b),集電極(c)。接線時三個極端不能接錯,否則三極管就沒有起到作用。                        
9  三極管符號、管腳排列圖
集電極和基極之間形成集電結,發射極和基極之間形成發射結,三極管起放大作用的條件,發射結正向偏置,集電結反向偏置。正向偏置時必須達到正向偏置電壓,即為導通,否則,為截止狀態。
4.1.2PCB板進行排版及連線                                          
本實驗所用的面包板的內部鏈接在破壞背面的絕緣膠帶的情況下,可以揭開膠帶看其內部線路的構造,以防不知道內部線路差錯電路。當然最好的辦法是:用測試電路在插孔上來回實驗,猜想驗證其內部構造。                                                        
(1)首先了解面包板在連線和焊接的注意事項。
(2)了解實驗原件及器材后,按照原理圖在面包板上連接電路。
(3)焊接要注意,電子電路在焊接時,應遵循的規則。
4.1.3 焊接的問題及解決
一般來說,造成硬件問題的首要問題就是焊接了,也就是說焊接的好與壞直接響產品的正常運行。造成焊接質量不高的常見原因是:①焊錫用量過多,形成焊點的錫堆積;焊錫過少,不足以包裹焊點。②冷焊。焊接時烙鐵溫度過低或加熱時間不足,焊錫未完全熔化、浸潤、焊錫表面不光亮(不光滑),有細小裂紋(如同豆腐渣一樣!)。③夾松香焊接,焊錫與元器件或印刷板之間夾雜著一層松香,造成電連接不良。若夾雜加熱不足的松香,則焊點下有一層黃褐色松香膜;若加熱溫度太高,則焊點下有一層碳化松香的黑色膜。對于有加熱不足的松香膜的情況,可以用烙鐵進行補焊。對于已形成黑膜的,則要"吃"凈焊錫,清潔被焊元器件或印刷板表面,重新進行焊接才行。④焊錫連橋。指焊錫量過多,造成元器件的焊點之間短路。這在對超小元器件及細小印刷電路板進行焊接時要尤為注意。⑤焊劑過量,焊點明圍松香殘渣很多。當少量松香殘留時,可以用電烙鐵再輕輕加熱一下,讓松香揮發掉,也可以用蘸有無水酒精的棉球,擦去多余的松香或焊劑。⑥焊點表面的焊錫形成尖銳的突尖。這多是由于加熱溫度不足或焊劑過少,以及烙鐵離開焊點時角度不當浩成的內。
  最小系統的電路不工作,首先應該確認電源電壓是否正常。用電壓表測量接地引腳跟電源引腳之間的電壓,看是否符合電源電壓,常用的是5V左右。接下來就是檢測復位引腳的電壓是否正常,EA引腳的電壓要正常為5V左右。
4.1.4焊接的技巧和注意事項
1、焊錫之前應該先插上電烙鐵的插頭,給電烙鐵加熱。  
2、焊接時,焊錫與電路板、電烙鐵與電路板的夾角最好成45度,這樣焊錫與電烙鐵夾角成90度。
3、焊接時,焊錫與電烙鐵接觸時間不要太長,以免焊錫過多或是造成漏錫;也不要過短,以免造成虛焊。
4、元件的腿盡量要直,而且不要伸出太長,以1毫米為好,多余的可以剪掉。
5、焊完時,焊錫最好呈圓滑的圓錐狀,而且還要有金屬光澤。
4.2調試4.2.1系統的調試
系統調試包括硬件調試和軟件調試,而且兩者是密不可分的。我們設計好的硬件電路和軟件程序,只有經過聯合調試,才能驗證其正確性;軟硬件的配人情況以及是否達到設計任務的要求,也只有經過調試,才能發現問題并加以解決、完善,最終開發成實用產品。
  硬件調試分單元電路調試和聯機調試,單元電路試驗在硬件電路設計時已經進行,這里的調試只是將其制成印刷電路板后試驗電路是否正確,并排除一些加工工藝性錯誤(如錯線、開路、短路等)。這種調試可單獨模擬進行,也可通過開發裝置由軟件配合進行,硬件聯機調試則必須在系統軟件的配合下進行。
  軟件調試一般包括分塊調試和聯機調試兩個階段。程序的分塊調試一般在單片機開發裝置上進行,可根據所調程序功能塊的入口參量初值編制一個特殊的程序段,并連同被調程序功能塊一起在開發裝置上運行;也可配合對應硬件電路單獨運行某程序功能塊,然后檢查是否正確,如果執行結果與預想的不一致,可以通過單步運行或設置斷點的方法,查出原因并加以改正,直到運行結果正確為止。這時該 程序功能塊已調試完畢,可去掉附加程序段。其它程序功能塊可按此法進行調試。程序聯機調試就是將已調試好的各程序功能塊按總體結構聯成一個完整程序,在所研制的硬件電路上運行。從而試驗程序整體運行的完整性、正確性和與硬件電路的配合情況。在聯調中可能會有某些支路上的程序、功能塊因受條件制約而得不到相應的輸入參數,這時,調試人員應創造條件進行模擬調試。在聯調中如發現硬件問題也應及時修正,直到單片機系統的軟件、硬件全部調試成功為止。系統調試完成后,還要進行一段時間的試運行,從而檢驗系統的穩定性和抗干擾能力,驗證系統功能是否達到設計要求,是否達到預期的效果。
4.2.2具體調試
1、具有清零裝置和搶答控制,可由主持人操縱避免有人在主持人說
“開始”前提前搶答違反規則。
2、具有定時功能,在60秒內無人搶答表示所有參賽選手獲參賽隊對本題棄權。
3、60秒時仍無人搶答其報警電路工作表示搶答時間耗盡并禁止搶答。
4、 顯示搶答時間, 按一下減一秒,按一下"-1s"鍵,時間LED上會顯示改變后的時間,調整范圍為0s~60s。                        
5、主持人按"搶答開始"鍵,會有提示音,并立刻進入搶答倒計時(預設60s搶答時間),如有選手搶答,會有提示音,并會顯示其號數,只有第一個按搶答的選手有效。                                                                                             
6、如倒計時期間,主持人想停止倒計時可以隨時按"停止"按鍵,系統會自動進入準備狀態,等待主持人按"搶答開始"進入下次搶答計時。                                                                                                      
致謝
經過近一個月的努力,在老師和同學的討論和幫助下,我成功地完成了基于單片機的簡易搶答器系統的設計,通過此次畢業設計,所學過得知識再次被我拾起,使我重新認識到了對書本上的知識要獨立運用的道理。在搶答器設計過程中,發現了很多細節性的問題,也出現了很多錯誤,通過此次的搶答器的設計,讓我重新拾起了以前所學習的電子知識和單片機語言的編程,也使我加深了對單片機及接口技術的理解和應用,由于知識水平的局限,設中可能會存在著一些不足,我真誠的接受老師的批評和指正,也非常感謝老師們的一路陪伴和細心教授,因為有你們,我才能完成這次畢業設計,真誠的希望你們在以后的生活里更加美好,培養出一代又一代優秀學子。
附件1:基于單片機的簡易搶答器系統設計實物圖





附件2:基于單片機的簡易搶答器系統單面PCB板圖

附件3:基于單片機的簡易搶答器系統設計程序
  1. #include <reg52.h>                       //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義              變量范圍0~255
  3. #define uint  unsigned int              //無符號整型 宏定義              變量范圍0~65535
  4. //數碼管段選定義 0     1    2    3                 4                 5              6              7                8                 9            
  5. uchar code shumaguan_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  6. //                                                                         A              B              C                D                 E   F              不顯示
  7.                                                                       0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};              //斷碼            
  8. sbit shumaguan_wei1 = P3^3;                //數碼管位選定義8
  9. sbit shumaguan_wei2 = P3^4;
  10. sbit shumaguan_wei3 = P3^5;
  11. sbit shumaguan_wei4 = P3^6;
  12. sbit beep = P3^7;      //蜂鳴器IO口定義

  13. uchar xuanshou_start;         //開始搶答標志位
  14. uchar xuanshou_weigui;        //搶答違規標志位

  15. uchar shumaguan[4] = {0xc0,0xbf,0xa4,0xb0};              //數碼管顯示緩沖區
  16. uchar shumaguan_i = 4;          //顯示數碼管的個位數
  17. uchar miao,s_time=30;        //時間
  18. uchar xuanshou_num;           //號碼
  19. uchar menu_1 ;            //菜單設置變量
  20. bit xuanshou_200ms = 1;       //200ms的標志位
  21. uchar xuanshou_kd_en;          //搶答
  22. uchar i;


  23. /**************************數碼管位選函數****************************/
  24. void shumaguan_wei_switch(uchar i)
  25. {
  26.               switch(i)
  27.               {
  28.                             case 0: shumaguan_wei1 = 0;  shumaguan_wei2 = 1; shumaguan_wei3 = 1;  shumaguan_wei4 = 1; break;
  29.                             case 1: shumaguan_wei1 = 1;  shumaguan_wei2 = 0; shumaguan_wei3 = 1;  shumaguan_wei4 = 1; break;
  30.                             case 2: shumaguan_wei1 = 1;  shumaguan_wei2 = 1; shumaguan_wei3 = 0;  shumaguan_wei4 = 1; break;
  31.                             case 3: shumaguan_wei1 = 1;  shumaguan_wei2 = 1; shumaguan_wei3 = 1;  shumaguan_wei4 = 0; break;
  32.               }            
  33. void delay_1ms(uint k)              //延時1ms函數
  34. {
  35.               uint i,j;
  36.               for(i=0;i<k;i++)
  37.                             for(j=0;j<120;j++);
  38. }


  39. /********************獨立按鍵程序*****************/
  40. uchar key_on;              //按鍵值
  41. void key()              //獨立按鍵程序
  42. {
  43.               static uchar key_new;
  44.               key_on = 20;
  45.               P2 = 0xff;
  46.               if((P2 & 0xff) != 0xff)                            //按鍵按下
  47.               {
  48.                             delay_1ms(1);                                 //按鍵消抖動
  49.                             if(((P2 & 0xff) != 0xff) && (key_new == 1))
  50.                             {                                                                                    //確認是按鍵按下
  51.                                           key_new = 0;
  52.                                           switch(P2 & 0xff)
  53.                                           {
  54.                                                         case 0xfe:  key_on = 1;  break;              //得到按鍵值
  55.                                                         case 0xfd:  key_on = 2;  break;              //得到按鍵值
  56.                                                         case 0xfb:  key_on = 3;  break;              //得到按鍵值
  57.                                                         case 0xf7:  key_on = 4;  break;              //得到按鍵值
  58.                                                         case 0xef:  key_on = 5;  break;              //得到按鍵值
  59.                                                         case 0xdf:  key_on = 6;  break;              //得到按鍵值
  60.                                                         case 0xbf:  key_on = 7;  break;              //得到按鍵值
  61.                                                         case 0x7f:  key_on = 8;  break;              //得到按鍵值
  62.                                           }
  63. //                                          shumaguan[0] = shumaguan_du[key_on];                                                        //顯示按鍵值
  64.                             }                                         
  65.               }
  66.               else
  67.                             key_new = 1;            
  68. }


  69. /********************獨立按鍵程序*****************/
  70. uchar key_on1;              //按鍵值
  71. void key_1()                //主持人獨立按鍵程序
  72. {
  73.               static uchar key_new;
  74.               key_on1 = 20;
  75.               P3 |= 0x03;
  76.               if((P3 & 0x03) != 0x03)                            //按鍵按下
  77.               {
  78.                             delay_1ms(1);                                 //按鍵消抖動
  79.                             if(((P3 & 0x03) != 0x03) && (key_new == 1))
  80.                             {                                                                                    //確認是按鍵按下
  81.                                           key_new = 0;
  82.                                           switch(P3 & 0x03)
  83.                                           {
  84.                                                         case 0x01:  key_on1 = 9;   break;              //得到按鍵值
  85.                                                         case 0x02:  key_on1 = 10;  break;              //得到按鍵值
  86.                                           }
  87. //                                          shumaguan[0] = shumaguan_du[key_on1];                                                        //顯示按鍵值
  88.                             }                                         
  89.               }
  90.               else
  91.                             key_new = 1;            
  92. }

  93. /******************按鍵處理函數*****************/
  94. void key_with()                //按鍵處理函數
  95. {
  96.               if(key_on1 == 10)    //設置按鍵
  97.               {
  98.                             menu_1 ++;
  99.                             if(menu_1 == 1)
  100.                             {
  101.                                           shumaguan[0] = shumaguan_du[s_time % 10];                  //顯示設置值
  102.                                           shumaguan[1] = shumaguan_du[s_time / 10 % 10];              //顯示設置值
  103.                                           shumaguan[2] = 0xbf;
  104.                                           shumaguan[3] = shumaguan_du[10];                          //顯示A
  105.                             }
  106.                             if(menu_1 > 1)
  107.                                           menu_1 = 0;
  108.               }
  109.               if(key_on1 == 9)        //開始搶答鍵
  110.               {
  111.                             xuanshou_start = 1;
  112.                             for(i=0;i<2;i++)
  113.                             {
  114.                                           beep = ~beep;
  115.                                           delay_1ms(20);            
  116.                             }
  117.               }
  118.               if(key_on < 9)
  119.               if(menu_1 == 0)
  120.               {
  121.                             if(xuanshou_kd_en == 0)                   //沒有搶答                           
  122.                             {
  123.                                           if(key_on == 1)
  124.                                                         xuanshou_num = 1;    //1號選手
  125.                                           if(key_on == 2)
  126.                                                         xuanshou_num = 2;    //2號選手
  127.                                           if(key_on == 3)
  128.                                                         xuanshou_num = 3;    //3號選手
  129.                                           if(key_on == 4)
  130.                                                         xuanshou_num = 4;    //4號選手
  131.                                           if(key_on == 5)
  132.                                                         xuanshou_num = 5;    //5號選手
  133.                                           if(key_on == 6)
  134.                                                         xuanshou_num = 6;    //6號選手
  135.                                           if(key_on == 7)
  136.                                                         xuanshou_num = 7;    //7號選手
  137.                                           if(key_on == 8)
  138.                                                         xuanshou_num = 8;    //8號選手
  139.                             }
  140.                             if(xuanshou_start == 1)                              //開始搶答
  141.                             {
  142.                                           xuanshou_weigui = 0;               
  143.                                           xuanshou_kd_en = 1;       //已經搶答                                                                     
  144.                             }
  145.                             else
  146.                             {
  147.                                           xuanshou_weigui = 1;   //違規了
  148.                             }                           
  149.               }
  150.               if(menu_1 == 1)
  151.               {
  152.                             if(key_on == 8)   //加鍵
  153.                             {
  154.                                           s_time ++;     //設置倒計時加1            
  155.                                           if(s_time >= 99)
  156.                                                         s_time = 99;
  157.                                           shumaguan[0] = shumaguan_du[s_time % 10];              //顯示設置值
  158.                                           shumaguan[1] = shumaguan_du[s_time / 10 % 10];              //顯示設置值
  159.                             }
  160.                             if(key_on == 7)
  161.                             {
  162.                                           if(s_time > 3)
  163.                                                         s_time -- ;              //設置倒計時減1            
  164.                                           shumaguan[0] = shumaguan_du[s_time % 10];                  //顯示設置值
  165.                                           shumaguan[1] = shumaguan_du[s_time / 10 % 10];              //顯示設置值
  166.                             }
  167.               }            
  168. }

  169. /******************倒計時處理*****************/
  170. void daojishi_dis()                 //倒計時處理
  171. {
  172.               static uchar j;
  173.               if((xuanshou_start == 1) && (xuanshou_weigui == 0))
  174.               {
  175.                             j ++;
  176.                             if(j >= 5)     //1s
  177.                             {
  178.                                           j = 0;
  179.                                           if(miao != 0)
  180.                                                         miao --;              //倒計時減一
  181.                             }                                         
  182.                             if(miao <= 5)
  183.                             {
  184.                                           beep = ~beep; //蜂鳴器提示報警
  185.                             }
  186.                             if(miao == 0)
  187.                             {
  188.                                           beep = 1;     //關閉蜂鳴器
  189.                                           xuanshou_start = 0;
  190.                             }
  191.               }                           
  192. }

  193. /********************************************************************
  194. * 名稱 : display()
  195. * 功能 : 數碼管顯示
  196. * 輸入 : 無
  197. * 輸出 : 無
  198. ***********************************************************************/
  199. void display()                 //數碼管顯示
  200. {
  201.               static uchar i;
  202.               i++;
  203.               if(i >= shumaguan_i)
  204.                             i = 0;            
  205.               P1 = 0xff;                      //消隱
  206.               shumaguan_wei_switch(i);              //位選
  207.               P1 = shumaguan[i];              //
  208.             
  209. }



  210. /*************定時器0初始化程序***************/
  211. void time_init()              //  定時器0初始化程序
  212. {
  213.               EA   = 1;                              //開總中斷
  214.               TMOD = 0X01;                //定時器0、工作方式1
  215.               ET0  = 1;                              //開定時器0中斷
  216.               TR0  = 1;                              //允許定時器0定時
  217. }

  218. /******************主程序**********************/               
  219. void main()
  220. {
  221.               static uchar j;
  222.               time_init();                   //  定時器0初始化程序
  223.               while(1)
  224.               {
  225.                             if(xuanshou_weigui == 0)
  226.                             {
  227.                                           key();                     //獨立按鍵程序
  228.                                           key_1();                   //主持人獨立按鍵程序
  229.                             if((key_on < 20) || (key_on1 < 20))
  230.                                           key_with();                 //按鍵處理函數
  231.                             }
  232.                             if(xuanshou_200ms == 1)
  233.                             {
  234.                                           xuanshou_200ms = 0;
  235.                                           if(menu_1 == 0)
  236.                                           {
  237.                                                       
  238.                                           shumaguan[3] = shumaguan_du[miao / 10 % 10];              //顯示設置值
  239.                                           shumaguan[2] = shumaguan_du[miao % 10];              //顯示設置值
  240.                                           shumaguan[1] = 0xbf;
  241.                                           shumaguan[0] = shumaguan_du[xuanshou_num];              //顯示選手號碼            
  242.                                           if(xuanshou_weigui == 1)  //違規了顯示FF
  243.                                                         {
  244.                                                                       shumaguan[3] = shumaguan_du[15];              //顯示設置值
  245. ……………………

  246. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的Word格式文檔51黑下載地址:
簡易搶答器設計說明書.doc (2.8 MB, 下載次數: 61)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:357323 發表于 2018-12-25 01:53 | 只看該作者
寫的不錯,精彩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人免费视频 | 99福利视频| av日日操| 古装人性做爰av网站 | 亚洲夜射| 国产在线观看一区二区三区 | 91在线导航 | 久久久久久亚洲精品不卡 | 日韩欧美一区二区三区在线播放 | 欧美一级免费看 | 黄网站在线观看 | 九九九久久国产免费 | 精品视频一区二区 | 国产 日韩 欧美 在线 | 免费观看一级毛片 | 性高湖久久久久久久久 | 久久er精品 | 久久久中文 | 色婷婷久久久久swag精品 | av黄色在线 | 国产精品久久国产精品99 gif | 99re视频在线免费观看 | 一区二区在线视频 | 欧美日韩综合 | 欧美a级成人淫片免费看 | 国产一区二区a | 精品福利在线 | 日日干夜夜操 | 国产精品视频久久久久久 | 超碰在线网站 | 精品国产欧美一区二区 | 国产95在线 | 欧美 日韩 亚洲91麻豆精品 | 亚洲一区在线播放 | 国产69精品久久99不卡免费版 | 6996成人影院网在线播放 | 日日草天天干 | 在线看av的网址 | 亚洲美女视频 | 久久久久国产精品 | 国产欧美一区二区久久性色99 |