基于AT89S51的單片機(jī)無(wú)線雙顯示搶答器_第1頁(yè)
基于AT89S51的單片機(jī)無(wú)線雙顯示搶答器_第2頁(yè)
基于AT89S51的單片機(jī)無(wú)線雙顯示搶答器_第3頁(yè)
基于AT89S51的單片機(jī)無(wú)線雙顯示搶答器_第4頁(yè)
基于AT89S51的單片機(jī)無(wú)線雙顯示搶答器_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、基于AT89S51的單片機(jī)無(wú)線雙顯示搶答器1關(guān)于搶答器1.1目前常見的搶答器有以下幾種類別:(1) 數(shù)字電路:只要使用555定時(shí)電路作為時(shí)序觸發(fā),配合相應(yīng)的數(shù)字電路實(shí)現(xiàn)。(2) 單片機(jī)式:以單片機(jī)為作為總控制單元利用單片機(jī)的掃描讀取外部輸入, 并進(jìn)行相應(yīng)的判斷以及數(shù)據(jù)處理。(3) 電腦程序?qū)崿F(xiàn)的:以電腦作為上位機(jī),利用USB端口或者串口編程技術(shù)實(shí)現(xiàn),邏輯上面的判斷以及處理均由程序來(lái)完成。這種搶答器可以在電腦上面顯示并且可以與相應(yīng)的由高級(jí)語(yǔ)言完成答題系統(tǒng)一起使用,配合單片機(jī)控制能力強(qiáng)的優(yōu)勢(shì),將會(huì)是完美的結(jié)合,這也是我們追求的目標(biāo)。1.2搶答器的常見功能:(1) 判斷搶答端的序號(hào)。(2) 判斷是否

2、犯規(guī)并且在主機(jī)顯示。(3) 在搶答端顯示犯規(guī)或是搶答成功。(4) 設(shè)定倒計(jì)時(shí)時(shí)間并顯示倒計(jì)時(shí)時(shí)間。(5) 顯示各組分?jǐn)?shù)。(6) 主持人的控制。既主持人可以開始和取消倒計(jì)時(shí)。(7) 無(wú)線搶答端的實(shí)現(xiàn)(8) 電腦顯示搶答情況(9) 選擇搶答方式。一種是有倒計(jì)時(shí)有犯規(guī)的倒計(jì)時(shí)結(jié)束開始答題的,另外一種是無(wú)倒計(jì)時(shí)無(wú)犯規(guī)可以直接答題的,比如說(shuō)像Lucky52那樣的,兩種只是在程序邏輯以及顯示上面稍有區(qū)別。1.3功能實(shí)現(xiàn)的選擇我們的搶答器選擇了上面的(1),(2)(3)(4)(6)(7)(8)進(jìn)行實(shí)現(xiàn)。搶答的邏輯具體流程如下圖:2主要芯片及設(shè)備的選擇:2.1 AT89S51芯片很熟悉的ATMEL公司的51單

3、片機(jī),主要具有一下功能:40個(gè)引腳4k Bytes Flash片內(nèi)程序存儲(chǔ)器128 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM)32個(gè)外部雙向輸入/輸出(I/O)口5個(gè)中斷優(yōu)先級(jí)2層中斷嵌套中斷2個(gè)16位可編程定時(shí)計(jì)數(shù)器2個(gè)全雙工串行通信口看門狗(WDT)電路片內(nèi)時(shí)鐘振蕩器 2.2 Max7219芯片MAX7219是一種串行接口的8位數(shù)碼管顯示驅(qū)動(dòng)器。它與通用微處理器只有3根串行線相連,最多可驅(qū)動(dòng)8個(gè)共陰數(shù)碼管或64個(gè)發(fā)光二極管。它內(nèi)部有可存儲(chǔ)顯示信息的8×8靜態(tài)RAM,動(dòng)態(tài)掃描電路,以及段、位驅(qū)動(dòng)器。它的特點(diǎn)有:串行接口的傳輸速率可達(dá)10MHz;獨(dú)立的發(fā)光二極管段控制;譯碼與非譯碼兩種

4、顯示方式可選;數(shù)字、模擬兩種亮度控制方式;可以級(jí)聯(lián)使用。2.3 Max232芯片Max232用于TTL電平向RS-232串口電平轉(zhuǎn)換。該產(chǎn)品是由德州儀器公司(TI)推出的一款兼容RS232標(biāo)準(zhǔn)的芯片。由于電腦串口rs232電平是-10v +10v,而一般的單片機(jī)應(yīng)用系統(tǒng)的信號(hào)電壓是ttl電平0 +5v,max232就是用來(lái)進(jìn)行電平轉(zhuǎn)換的,該器件包含2驅(qū)動(dòng)器、2接收器和一個(gè)電壓發(fā)生器電路提供TIA/EIA-232-F電平。2.4 PT2262/2272芯片PT2262和PT2272是CMOS三態(tài)編碼集成芯片,這組器件廣泛用于各種遙控器件上,只需較低的+3V電壓就能工作(本機(jī)選用12V作為發(fā)射電壓

5、)。PT2262 是發(fā)射編碼芯片,PT2272是接收解碼芯片,兩者的地址必須配對(duì),而且振蕩電阻必須符合要求。PT2262的TE端是發(fā)射允許端,接受低電平時(shí),17腳DOUT端輸出一串編碼。該串編碼在載波上發(fā)送出去,被接收端接受和解調(diào),輸入PT2272的14腳,當(dāng)?shù)刂放鋵?duì)時(shí),VT解碼有效端輸出高電平,數(shù)據(jù)端口就會(huì)輸出與PT2262發(fā)射端口一致的數(shù)據(jù),從而實(shí)現(xiàn)遙控功能。2.5 超再生無(wú)線發(fā)射模塊(F04P)與接收模塊(J04V)2.5.1 超再生低功耗射頻發(fā)射模塊(315Hz)主要特點(diǎn):低功耗發(fā)射,聲表穩(wěn)頻,無(wú)數(shù)據(jù)時(shí)發(fā)射電流為零,較寬的工作電壓范圍發(fā)射電路:2.5.2超再生低功耗射頻接受模塊(315

6、Hz)主要特點(diǎn):(0.15mA)特低功耗超再生接收模塊,輸出無(wú)噪聲干擾,接收靈敏度高,具有接受鎖存功能接受電路于發(fā)射電路基本相似。2.5.3 發(fā)射接收簡(jiǎn)要原理通過(guò)引腳的接地,懸空或者接高電平設(shè)置好發(fā)射模塊的發(fā)射地址,當(dāng)發(fā)射使能端從高電位到低點(diǎn)位變化時(shí),獎(jiǎng)發(fā)射地址和發(fā)射的數(shù)據(jù)組成16為編碼發(fā)射。2.6 ULN2003達(dá)林頓管陣列ULN2003 是高耐壓、大電流達(dá)林頓陳列,由七個(gè)硅NPN 達(dá)林頓管組成。達(dá)林頓管又稱復(fù)合管。它將二只三極管適當(dāng)?shù)倪B接在一起,以組成一只等效的新的三極管。這等于效三極管的放大倍數(shù)是二者之積。在電子學(xué)電路設(shè)計(jì)中,達(dá)林頓接法常用于功率放大器和穩(wěn)壓電源中。 最大的作用與特點(diǎn)是每

7、路可以介紹500mA的灌流,這也是我們使用的目的。2.7 USB轉(zhuǎn)串口模塊(USB/RS232) 采用USB轉(zhuǎn)串口的標(biāo)準(zhǔn)芯片PL2303和RS232電平接口芯片MAX211的組合。2.8高亮度Super Red四寸共陰極數(shù)碼管正常發(fā)光電壓約5-6V, 正常導(dǎo)通電流約40-80mA3硬件電路的實(shí)現(xiàn)以及各個(gè)部分的作用3.1 硬件電路圖(Proteus仿真圖)3.2各個(gè)模塊的說(shuō)明與簡(jiǎn)介3.2.1 單片機(jī)最小系統(tǒng):這個(gè)不用多說(shuō),可惜是買別人的。上面得是提供的是12MHz的晶振,與程序中的保持一樣.因?yàn)樵谟?jì)算定時(shí)的時(shí)候,要用到晶振的大小。3.2.2 Max7219模塊這個(gè),還是買的別人做的PCB,我們自

8、己用面包版連了,可以不行,懷疑是沒(méi)有選擇正確的電容的問(wèn)題,或者說(shuō),我們不會(huì)選擇電容。3.2.3 無(wú)線搶答端發(fā)射模塊無(wú)線搶答端采用PT2262發(fā)射編碼芯片+F05P發(fā)射模塊的組合,另外使用一根拉直的長(zhǎng)24CM的天線。關(guān)于按鈕,買的不知道用來(lái)控制什么的按鈕,反正正和我們意,買這個(gè)的時(shí)候要注意手感,要讓使用者用的舒適。從院科協(xié)L同學(xué)那里淘來(lái)的半圓形按鈕外殼。3.2.4無(wú)線接收模塊無(wú)線搶答端采用PT2272發(fā)射編碼芯片+F04V接收模塊的組合。Pt2272與PT2262要設(shè)置為地址相同,電阻匹配。接受到的信號(hào)傳至單片機(jī)中。3.2.5 主持人控制按鍵這里有兩個(gè)按鈕,分別為OK/START,CANCEL/

9、CLEAR. 前者是用來(lái)設(shè)置完畢搶答倒計(jì)時(shí)時(shí)間和開始倒計(jì)時(shí),后者是用來(lái)取消搶答和清理數(shù)碼管并顯示倒計(jì)時(shí)開始時(shí)間,用來(lái)等待再次開始搶答。3.2.6 設(shè)置倒計(jì)時(shí)時(shí)間的撥碼開關(guān)仿“8421”碼設(shè)置的“2321”碼,全部低位的時(shí)候?yàn)椤?”,四個(gè)開關(guān)可以設(shè)置19任何數(shù)字。缺點(diǎn)就是買的撥碼開關(guān)小了點(diǎn)。3.2.7 譯碼器以及搶答端的發(fā)光二極管譯碼器從單片機(jī)得到輸入,然后低位選通發(fā)光二極管。3.2.8 位選反向驅(qū)動(dòng)說(shuō)不清了,這樣的了。3.2.9 段選反向驅(qū)動(dòng)兩個(gè)反向驅(qū)動(dòng)的本意在于,雖然Max7219驅(qū)動(dòng)的是共陰極數(shù)碼管,但是從datasheet上面可以看出來(lái),段選的拉流不可以滿足這種型號(hào)的數(shù)碼管,位選的灌流也

10、不能接受,所以這里配合ULN2003來(lái)使用。因?yàn)閁LN2003的特點(diǎn),高位接受灌流,低位為高阻,所以要使用反向驅(qū)動(dòng)。這里,段選的反向驅(qū)動(dòng)在程序里面的反向了,而對(duì)于位選,用于是該芯片自己進(jìn)行的,所以程序控制不了,所以在Max7219位選的下游使用了一個(gè)與非門來(lái)當(dāng)作反向器來(lái)使用。3.3.10 上位機(jī)接口采用MAX232芯片進(jìn)行RS232-TTL電平轉(zhuǎn)換,輸出至串口,然后再通過(guò)USB轉(zhuǎn)串口模塊連接至上位機(jī)。3.2.11 大尺寸數(shù)碼管這個(gè)前面說(shuō)過(guò)了。4硬件實(shí)現(xiàn)的步驟4.1硬件實(shí)現(xiàn)的各個(gè)步驟(1) 通過(guò)實(shí)驗(yàn)板來(lái)驗(yàn)證各個(gè)主要功能模塊的正確實(shí)現(xiàn)。這個(gè)就是在實(shí)驗(yàn)板接線,來(lái)分開的檢測(cè)各個(gè)部分的正確性,當(dāng)然有的部

11、分還是沒(méi)有辦法驗(yàn)證的。(2) 仿真器+面包板上面的插線實(shí)驗(yàn)恩,仿真器很好使。就是上面的限流電阻給不小心被燒了,郁悶。(3) 最小系統(tǒng)+面包板上面插線實(shí)驗(yàn)使用仿真器的時(shí)候用的是電腦提供的+5V電壓,可能和用自己的供電的不太一樣,尤其是同時(shí)也在使用+12V電源的時(shí)候,電腦給出的+5V可能的比較低,這樣一來(lái)會(huì)有些不必要的問(wèn)題,而用最小系統(tǒng)則沒(méi)有這些問(wèn)題。(4) 焊接萬(wàn)能板這個(gè)很有趣也很關(guān)鍵。(5) 仿真器+電路板的實(shí)現(xiàn)用來(lái)驗(yàn)證電路板上的各個(gè)部分是否焊接成功。(6) 最小系統(tǒng)+電路板的實(shí)現(xiàn)恩這個(gè)就是最后的驗(yàn)證了。4.2一個(gè)原則由上可見,在實(shí)驗(yàn)過(guò)程中,總體上也采取單變量原則,這樣方便有效地對(duì)于每一部分進(jìn)

12、行檢驗(yàn)。另外,如果在檢驗(yàn)焊接板上面的錯(cuò)誤的話,要配合著面包板使用才行,也是保證單變量,這樣對(duì)比出來(lái)面包上成功的時(shí)候和現(xiàn)在失敗的時(shí)候只有哪個(gè)地方不同,那百分之九十就是這個(gè)地方了。5軟件實(shí)現(xiàn)(單片機(jī)上的軟件)5.1程序編寫模塊化,使整個(gè)程序的每個(gè)部分具有較好的可移植性。5.2程序測(cè)試在Keil Uvision + Proteus聯(lián)調(diào)環(huán)境下進(jìn)行邏輯的測(cè)試,不過(guò)這個(gè)只是邏輯上面的測(cè)試,距離能成功還有很遠(yuǎn)。5.3最終代碼最后的代碼將在另見。6電腦端(上位機(jī))顯示程序電腦端使用C#編寫程序,利用了.Net的SerialPort類對(duì)電腦端口檢測(cè)和接受數(shù)據(jù)。這個(gè)將會(huì)另有介紹。7 后續(xù)工作和幾個(gè)問(wèn)題(1) 電源

13、還需優(yōu)化, 可以采用三穩(wěn)壓管電源。(2) 電阻發(fā)熱問(wèn)題: 我們使用的3W的大功率電阻竟然不到1.5W的情況下就發(fā)熱了,還沒(méi)有搞懂。(3) 我們的74HC00與非門在未加高電平的情況下就已經(jīng)正常工作了,不清楚這是什么情況。(4) 可以考慮增加搶答模式與小組積分,實(shí)現(xiàn)按著使用者的要求對(duì)于程序進(jìn)行選擇。(5) 無(wú)線端搶答端電池的問(wèn)題。因?yàn)槟壳暗脑O(shè)計(jì)是電池如果沒(méi)有取出的話,將一直對(duì)發(fā)射系統(tǒng)供電,這樣會(huì)消耗電池,但采用一次按鍵先后接通電路,發(fā)射編碼的方法,總是不穩(wěn)定#include <REG51.h>#include <STRING.H>/* 自定義Macro*/編碼的均為反向編

14、碼#define CLEAR 0x7f /定義清空的反碼#define LED_BEGIN 0x01 / 定義開始時(shí)數(shù)碼管的顯示#define LED_FOUL 0x38 / 犯規(guī)后顯示字母"F",數(shù)碼管編碼#define LED_C 0x31 / 字母"C"的編碼#define LED_L 0x71 / 字母"L"的編碼,兩個(gè)用來(lái)在主持人取消之后顯示"CL"-cancel#define GET 1 / 這個(gè)是作為一個(gè)函數(shù)的參數(shù)來(lái)混的,就是成功搶答的意思#define FOUL 0 / 和上面的參數(shù)一起混的,犯規(guī)-

15、這兩個(gè)的用法在后面體現(xiàn)#define READY 0x7e/下面是給上位機(jī)發(fā)送的指令,對(duì)應(yīng)的是cmdID#define _STRING_READY_ 9/調(diào)整好搶答倒計(jì)時(shí),準(zhǔn)備開始搶答#define _STRING_START_ 8/讀秒結(jié)束,搶答開始#define _STRING_CANCEL_ 7/取消搶答#define _CHANGE_TIME_ 6/每次讀秒/發(fā)送1-4的指令代表?yè)尨鸲说男蛱?hào)/因?yàn)樵诎遄由厦娌捎玫氖?2M的晶振,仿真時(shí)候采用的是11.0529M的晶振,為了方便不同時(shí)候編譯方便,這里與后面的條件編譯一起使程序修改參數(shù)比較方便/#define CLOCK_FREQUENCY

16、_12M 1/* 自定義數(shù)據(jù)類型*/typedef unsigned char Byte; / 一個(gè)字節(jié)typedef unsigned int Word; / 一個(gè)字,兩個(gè)字節(jié)typedef bit Bool; / 模仿布爾型變量/typedef sbit Port; / 本想用自定義一個(gè)端口類型的變量,比較方便,但是這句話步知道為何通不過(guò)編譯/* 定義MAX7219寄存器*/#define REG_NO_OP 0x00 / 定義空操作 register#define DIG_1 0x01 / 定義數(shù)碼管1 register#define DIG_2 0x02 / 定義數(shù)碼管2 regist

17、er#define DIG_3 0x03 / 定義數(shù)碼管3 register#define DIG_4 0x04 / 定義數(shù)碼管4 register#define DIG_5 0x05 / 定義數(shù)碼管5 register#define DIG_6 0x06 / 定義數(shù)碼管6 register#define DIG_7 0x07 / 定義數(shù)碼管7 register#define DIG_8 0x08 / 定義數(shù)碼管8 register#define REG_DECODE 0x09 / 定義解碼控制 register#define REG_INTENSITY 0x0a / 定義顯示亮度 regis

18、ter#define REG_SCAN_LIMIT 0x0b / 定義掃描限制 register#define REG_SHUTDOWN 0x0c / 定義"shutdown"模式 register#define REG_DISPLAY_TEST 0x0f / 定義"display test"模式 register#define INTENSITY_MIN 0x00 / 定義最低顯示亮度#define INTENSITY_MAX 0x0f / 定義最高顯示亮度/* 定義硬件引腳連接*/sbit DATA=P20; / MAX7219的數(shù)據(jù)口sbit LO

19、AD=P21; / MAX7219的鎖存端口sbit CLK=P22; / MAX7219的時(shí)鐘端口sbit HOST_START=P00; /主持人按鍵,用來(lái)重新開始的按鍵 startsbit HOST_CANCEL=P01; /主持人用來(lái)取消搶答的按鍵 clearsbit SWITCH1_3=P14; / 調(diào)節(jié)倒計(jì)時(shí)時(shí)間的撥碼開關(guān),下劃線前面的號(hào)代表開關(guān)的序號(hào),下劃線后面的號(hào)代表該開關(guān)的數(shù)值sbit SWITCH2_2=P15; / 同上sbit SWITCH3_2=P16; / 同上sbit SWITCH4_1=P17; / 同上sbit BEEP=P07; /定義蜂鳴器端口#ifdef

20、 USE_SOUND /可以通過(guò)define來(lái)選擇要不要使用仿真時(shí)候的聲音sbit LS138_C=P24; /定義譯碼器輸入端sbit LS138_B=P25; /同上 sbit LS138_A=P26; /同上sbit LS138_E1=P27; /定義譯碼器使能端#endif/* 定義全局變量*/Byte data intrCounter; / 計(jì)時(shí)器中斷次數(shù)Byte data beginNum; / 開始倒計(jì)時(shí)的時(shí)間Byte data counterBack; / 將中斷次數(shù)放在里面以備后用Byte data showNum; / 數(shù)碼管正在顯示的時(shí)間Bool data isStart

21、; / 是否開始搶答 Bool data isFoul; / 是否犯規(guī)Bool data isPressed; / 是否有搶答的鍵按下Byte data number_temp; / 用來(lái)記錄P1口上次狀態(tài)的一個(gè)變量Bool data needResetTimes;/記錄是否需要重設(shè)Timer0的溢出次數(shù)code unsigned char C51BOX23 _at_ 0x43; /使用C51Box時(shí)候防止程序跑丟/* 共陰極七段數(shù)碼管顯示對(duì)應(yīng)段查詢表(數(shù)字0-9分別對(duì)應(yīng)code_table0-9)*/Byte code code_table_zheng10=0x7e,0x30,0x6d,0x

22、79,0x33,0x5b,0x5f,0x70,0x7f,0x7b;Byte code code_table10=0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04;/* 函數(shù)聲明*/void MAX7219_SendByte (Byte dataout);void MAX7219_Write (Byte reg_number, Byte dataout);void MAX7219_DisplayChar(Byte digit, Byte character);void MAX7219_Clear (void);void MAX7219_SetBr

23、ightness (Byte brightness);void MAX7219_DisplayTestStart (void);void MAX7219_DisplayTestStop (void);void MAX7219_ShutdownStart (void);void MAX7219_ShutdownStop (void);void MAX7219_Init (void);void Delay10ms(void);Bool GetHostStartKey (void);Bool GetHostCancelKey (void);void GetCounter(void);Byte Get

24、Pressed(Byte KeyState);Byte GetPressedWireless(Byte KeyState);void IT0_Init(void);void Timer0_Overflow();void PressedHandle(Byte keyPressed);void GetOrFoulHandle(Bool state);void CancelHandle();void SPEAKER_count (void); /聲明倒計(jì)時(shí)聲音函數(shù)void SPEAKER_start(void); /聲明開始搶答聲音函數(shù)void SPEAKER_get(void); /聲明搶到聲音函

25、數(shù)void SPEAKER_foul(void); / 聲明犯規(guī)聲音函數(shù)void initialSerial();void sendNumber(int number);/串口發(fā)送數(shù)字,這里發(fā)送的是CommandIDvoid sendString(unsigned char *string);/串口發(fā)送字符串/* MAX7219_SendByte()* 描述: 向MAX7219傳送一個(gè)字節(jié)的數(shù)據(jù)* Arguments : dataout = data to send* Returns : none*/void MAX7219_SendByte (Byte dataout) Byte i; fo

26、r (i=8;i>0;i-) Byte mask=1<<(i-1);/mask是個(gè)掩碼,取位使用 CLK=0;/MAX7219的位傳入是在時(shí)鐘的上升沿之前,所以在每發(fā)一位之前都要變?yōu)榈碗娖?if (dataout&mask) DATA=1; else DATA=0; CLK=1;/八個(gè)bit都傳遞完成后變?yōu)楦唠娖?鎖存 /* MAX7219_Write()* 描述: 向 MAX7219 寫命令* Arguments : reg_number = register to write to* dataout = data to write to MAX7219* Retu

27、rns : none未完 */void MAX7219_Write (Byte reg_number, Byte dataout) LOAD=0;/也是鎖存上升沿之前的,發(fā)這兩個(gè)字節(jié)之前要變?yōu)榈碗娖?MAX7219_SendByte(reg_number);/發(fā)送寄存器地址 MAX7219_SendByte(dataout);/發(fā)送數(shù)據(jù) LOAD=1;/變?yōu)楦唠娖?鎖存/* MAX7219_DisplayChar()* 描述: 使某一位顯示一個(gè)數(shù)字* Arguments : digit = digit number (0-7)* character = character to display

28、 (0-9, A-Z)* Returns : none*/void MAX7219_DisplayChar(Byte digit, Byte character) MAX7219_Write(digit, character);/* MAX7219_Clear()* 描述: 清除所有位的顯示* Arguments : none* Returns : none*/void MAX7219_Clear (void) Byte i; for (i=1; i<=2; i+) MAX7219_Write(i, CLEAR);/把八個(gè)數(shù)碼管全都清零了,已經(jīng)寫反了_/* MAX7219_SetBrig

29、htness()* 描述: 設(shè)置數(shù)碼管顯示亮度* Arguments : brightness (0-15)* Returns : none*/void MAX7219_SetBrightness (Byte brightness) brightness &= 0x0f; MAX7219_Write(REG_INTENSITY, brightness);/* MAX7219_DisplayTestStart()* 描述: 進(jìn)入 test 模式* Arguments : none* Returns : none*/void MAX7219_DisplayTestStart (void)

30、MAX7219_Write(REG_DISPLAY_TEST, 1);/* MAX7219_DisplayTestStop()* 描述: 退出 test 模式* Arguments : none* Returns : none*/void MAX7219_DisplayTestStop (void) MAX7219_Write(REG_DISPLAY_TEST, 0);/* MAX7219_ShutdownStart()* 描述: 進(jìn)入 shutdown 模式* Arguments : none* Returns : none*/void MAX7219_ShutdownStart (void

31、) MAX7219_Write(REG_SHUTDOWN, 0);/* MAX7219_ShutdownStop()* 描述: 退出 shutdown 模式* Arguments : none* Returns : none*/void MAX7219_ShutdownStop (void) MAX7219_Write(REG_SHUTDOWN, 1);/* MAX7219_Init()* Description: MAX7219初始化模塊; 應(yīng)該先于其他MAX7219函數(shù)而被調(diào)用* Arguments : none* Returns : none*/void MAX7219_Init (vo

32、id) DATA=1; CLK=1; LOAD=1; MAX7219_Write(REG_SCAN_LIMIT,1);/這里設(shè)置的是掃描兩個(gè)數(shù)碼管 MAX7219_Write(REG_DECODE, 0x00); MAX7219_SetBrightness(INTENSITY_MAX);/設(shè)置最大亮度顯示 MAX7219_DisplayTestStart(); MAX7219_DisplayTestStop(); MAX7219_ShutdownStop(); MAX7219_Clear();/* Delay_100us()* 描述: 延時(shí)100us,主要用在消除開關(guān)抖動(dòng)時(shí)* Argument

33、s : none* Returns : none*/void Delay10ms(void)unsigned char i,j;for(i=20;i>0;i-)for(j=248;j>0;j-);/* GetHostStartKey()* Description: 取得主持人開始按鍵的鍵值* Arguments : none* Returns : 1->主持人按鍵; 0->主持人未按鍵*/Bool GetHostStartKey (void) if (HOST_START =1) return 0; else Delay10ms ();/如果發(fā)現(xiàn)主持人按鍵接通,要先延時(shí)

34、100us,防止抖動(dòng) if (HOST_START=1) return 0; else return 1;/延時(shí)時(shí)候還是接通,則判斷為該鍵確實(shí)按下 /* GetHostCancelKey()* Description: 取得主持人取消按鍵的鍵值* Arguments : none* Returns : 1->主持人按鍵; 0->主持人未按鍵*/Bool GetHostCancelKey (void) if (HOST_CANCEL =1) return 0; else Delay10ms ();/如果發(fā)現(xiàn)主持人按鍵接通,要先延時(shí)100us,防止抖動(dòng) if (HOST_CANCEL

35、=1) return 0; else return 1;/延時(shí)時(shí)候還是接通,則判斷為該鍵確實(shí)按下 /* GetCounter* Description: 取得預(yù)先設(shè)置的倒計(jì)時(shí)時(shí)間* Arguments : none* Returns : none*/void GetCounter(void) beginNum=1;/在所有開關(guān)都沒(méi)有撥動(dòng)的時(shí)候倒計(jì)時(shí)為1秒,比設(shè)置為0秒要好 intrCounter=20;/每一秒對(duì)應(yīng)的中斷次數(shù)為20次 if (SWITCH1_3=1) beginNum+=3; if (SWITCH2_2=1) beginNum+=2; if (SWITCH3_2=1) begi

36、nNum+=2; if (SWITCH4_1=1) beginNum+=1; /以上判斷語(yǔ)句為判斷撥碼開關(guān)狀態(tài) intrCounter=20*beginNum;/計(jì)算總掃描次數(shù)/* GetPressed* Description: 從P2口連接搶答端的四位來(lái)判斷搶答情況* Arguments : Byte KeyState->P2 state* Returns : 搶答端的號(hào)碼 ; 0->沒(méi)人搶答*/Byte GetPressed(Byte KeyState) Byte key;/記錄搶答端的號(hào)碼 KeyState&=0xf0;/取P1口的低四位 switch (KeySt

37、ate) case 0xf0: key=0;break;/全高,無(wú)人搶答 case 0xe0: key=1;break;/只有P1.1,key1搶答 case 0xd0: key=2;break;/只有P1.2,key2搶答 case 0xb0: key=3;break;/只有P1.3,key3搶答 case 0x70: key=4;break;/只有P1.4,key4搶答 /* switch (KeyState) case 0x00: key=0;break;/全高,無(wú)人搶答 case 0x01: key=1;break;/只有P1.0,key1搶答 case 0x02: key=2;bre

38、ak;/只有P1.1,key2搶答 case 0x04: key=3;break;/只有P1.2,key3搶答 case 0x08: key=4;break;/只有P1.3,key4搶答 */ /上面是在用高電平來(lái)判斷搶答狀態(tài)時(shí)的程序,經(jīng)證明不知道為何無(wú)效 return key; /* GetPressedWireless* Description: P2口的高四位于Pt2272接受模塊相連,該方法用來(lái)判斷無(wú)線搶答序號(hào)* Arguments : Byte KeyState->P2 state* Returns : 搶答端的號(hào)碼 ; 0->沒(méi)人搶答*/Byte GetPressedW

39、ireless(Byte KeyState) Byte key;/記錄搶答端的號(hào)碼 KeyState&=0xf0;/取P2口的高四位 /* switch (KeyState) case 0x0f: key=0;break;/全高,無(wú)人搶答 case 0x0e: key=1;break;/只有P1.1,key1搶答 case 0x0d: key=2;break;/只有P1.2,key2搶答 case 0x0b: key=3;break;/只有P1.3,key3搶答 case 0x07: key=4;break;/只有P1.4,key4搶答 */ switch (KeyState) cas

40、e 0x00: key=0;break;/全低,無(wú)人搶答 case 0x10: key=1;break;/只有P1.0,key1搶答 case 0x20: key=2;break;/只有P1.1,key2搶答 case 0x40: key=3;break;/只有P1.2,key3搶答 case 0x80: key=4;break;/只有P1.3,key4搶答 return key; /* IT0_Init* Description: 初始化計(jì)時(shí)器T0的狀態(tài)* Arguments : none* Returns : none*/void IT0_Init(void) TMOD=0x21;/設(shè)置T0在方式1下工作,同時(shí)還要保證T1,也就是波特率所學(xué)的定時(shí)器的正常工作 #ifdef CLOCK_FREQUENCY_12M/對(duì)使用哪種晶振進(jìn)行條件編譯 TH0=

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論