基于單片機的鍵盤無線數據通信系統畢業設計-_第1頁
基于單片機的鍵盤無線數據通信系統畢業設計-_第2頁
基于單片機的鍵盤無線數據通信系統畢業設計-_第3頁
基于單片機的鍵盤無線數據通信系統畢業設計-_第4頁
基于單片機的鍵盤無線數據通信系統畢業設計-_第5頁
已閱讀5頁,還剩30頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第35頁共35頁探討無線數據通信在MCU系統中的應用作品名稱: 基于單片機的鍵盤無線數據通信系統

畢業設計(論文)原創性聲明和使用授權說明原創性聲明本人鄭重承諾:所呈交的畢業設計(論文),是我個人在指導教師的指導下進行的研究工作及取得的成果。盡我所知,除文中特別加以標注和致謝的地方外,不包含其他人或組織已經發表或公布過的研究成果,也不包含我為獲得及其它教育機構的學位或學歷而使用過的材料。對本研究提供過幫助和做出過貢獻的個人或集體,均已在文中作了明確的說明并表示了謝意。作者簽名:日期:指導教師簽名:日期:使用授權說明本人完全了解大學關于收集、保存、使用畢業設計(論文)的規定,即:按照學校要求提交畢業設計(論文)的印刷本和電子版本;學校有權保存畢業設計(論文)的印刷本和電子版,并提供目錄檢索與閱覽服務;學校可以采用影印、縮印、數字化或其它復制手段保存論文;在不以贏利為目的前提下,學校可以公布論文的部分或全部內容。作者簽名:日期:

學位論文原創性聲明本人鄭重聲明:所呈交的論文是本人在導師的指導下獨立進行研究所取得的研究成果。除了文中特別加以標注引用的內容外,本論文不包含任何其他個人或集體已經發表或撰寫的成果作品。對本文的研究做出重要貢獻的個人和集體,均已在文中以明確方式標明。本人完全意識到本聲明的法律后果由本人承擔。作者簽名: 日期:年月日學位論文版權使用授權書本學位論文作者完全了解學校有關保留、使用學位論文的規定,同意學校保留并向國家有關部門或機構送交論文的復印件和電子版,允許論文被查閱和借閱。本人授權大學可以將本學位論文的全部或部分內容編入有關數據庫進行檢索,可以采用影印、縮印或掃描等復制手段保存和匯編本學位論文。涉密論文按學校規定處理。作者簽名: 日期:年月日導師簽名:日期:年月日

探討無線數據通信在MCU系統中的應用摘要本作品研究的內容是通過MCU控制無線數據芯片,以此來實現大量數據的無線高速傳輸,無論是在國防軍事方面,還是民用通訊方面都有很重要的研究意義。可改裝數控操控設備、醫療設備、數據通信設備等,使數據控制、交換、采集簡單化,對無線數據通信在MCU系統中的應用和多單片機協同工作中具有非常寶貴的參考價值。實物的作品,實現了一種基于PS/2接口和電腦進行無線數據通信的系統。電腦鍵盤輸入的數據通過單片機采集傳送到射頻發射模塊。在一百米,甚至到幾公里(只需加PA模塊拓展)將數據傳送給另一塊單片機,單片機再通過USB接口轉換芯片和電腦進行通信。產品貼切實際具有抗干擾能力強、輸入電壓寬、功耗低、距離遠、可靠性高、拓展性好,且成本低廉,確實為一款優秀實用的電子產品。關鍵詞:PS/2接口,2.4G射頻,MCU核心,MAX232,USB通信目錄一、作品研究的背景 錯誤!未定義書簽。二、數據無線傳輸的發展現狀及前景 錯誤!未定義書簽。三、作品研究的目的和意義 錯誤!未定義書簽。四、作品的簡介 錯誤!未定義書簽。五、基本思路和設計關鍵技術 錯誤!未定義書簽。1、整體設計思路和框圖 錯誤!未定義書簽。2、數據采集模塊 錯誤!未定義書簽。3、PS/2電器特性 錯誤!未定義書簽。4、數據傳輸模塊介紹 錯誤!未定義書簽。5、射頻模塊SHOCKBURSTTM模式應用 錯誤!未定義書簽。6、直接收發模式應用技術 錯誤!未定義書簽。7、數據接收模式應用技術 錯誤!未定義書簽。8、MCU硬件串行通信應用技術 錯誤!未定義書簽。9、PS/2接口與無線發射模塊的數據傳送應用技術 錯誤!未定義書簽。10、數據傳輸模塊介紹 錯誤!未定義書簽。六、工藝文件 錯誤!未定義書簽。1、PCB電路圖 錯誤!未定義書簽。2、元件裝配圖 錯誤!未定義書簽。3、元件清單 錯誤!未定義書簽。七、軟件設計 錯誤!未定義書簽。1、程序流程圖 錯誤!未定義書簽。2、發射板主程序 錯誤!未定義書簽。3、接收板主程序 錯誤!未定義書簽。4、USB通信程序 錯誤!未定義書簽。5、無線模塊通信程序 錯誤!未定義書簽。八、主要技術指標、調試及性能分析 錯誤!未定義書簽。1、性能分析 錯誤!未定義書簽。2、結論 錯誤!未定義書簽。參考文獻 錯誤!未定義書簽。一、數據無線傳輸系統設計的研究背景隨著社會的發展,數據傳輸已經成為人們生產、生活中不可或缺的一部分,小到用餐時的點菜系統,大到國家中央情報局的情報交換。數據傳輸中按傳輸介質可分為有線傳輸和無線傳輸。有線傳輸就是用線纜傳輸信息,如光纖,同軸電纜,雙絞線等等。在許多情況下,用戶往往由于受到地理環境和工作內容的限制,例如山地、港口和開闊地等特殊地理環境,對有線網絡、有線傳輸的布線工程帶來極大的不便,采用有線的施工周期將很長,甚至根本無法實現。無線就是不用線纜傳遞信息,而是利用電磁波傳遞信息,分發射部分和接收部分。采用無線可以擺脫線纜的束縛,有安裝周期短、維護方便、擴容能力強,迅速收回成本的優點。近十幾年來,移動通信技術飛速發展,越來越多的信息采集和遠程控制系統采用了無線數據傳送技術。與有線數據傳輸相比,無線數據傳輸布線成本低、安裝簡便、便于移動的優點,使其在遙控遙測、門禁系統、無線抄表、小區傳呼、工業數據采集、無線遙控系統、無線鼠標等領域都得到了廣泛的應用,而且它在高科技領域的應用也正在迅猛發展,比如衛星、導彈、無人偵察機等的數據采集,遙控機器人等的控制,以及一些監控設備等。此外,在現代軍事通訊領域方面,無線傳輸技術也有重要的戰略地位。在未來高科技戰斗中,由于軍事衛星通訊手段在未來戰爭中容易被摧毀且難以緊急恢復,所以人們可以利用無線短波、超短波等方式實現數據是無線傳輸,因而取得戰爭中的主動權。民用方面,在一些線路架設比較困難的地方,或者有天然的阻隔的地理條件較復雜較惡劣的地方數據的無線傳輸便顯示出了巨大威力。無線傳輸還便于通訊設備移動,具有明顯的靈活性。二、數據無線傳輸的發展現狀及前景進入二十一世紀,無線數據通訊技術在我國蓬勃發展,也得到了信息產業部以及各行各業的高度重視,因為任何有線數據傳輸網絡只能是網狀覆蓋,而無線數據傳輸網可達到真正的面覆蓋。目前主要的短距離無線數據傳輸技術主要有藍牙、Zigbee、IEEE802.11x、微功率短距離無線通訊技術,與已具備相當規模的無線長距離通訊網絡(比如蜂窩移動通訊網、衛星數據通訊)相比,短距離無線通訊系統在基本結構、服務范圍、應用層次以及通訊業務(數據、話音、視頻)上,均有很大不同。下面分別介紹這幾種無線傳輸技術。藍牙技術(Bluetooth)主要面對網絡中的各種數據和語言設備,通過無線方式將它們連接起來,從而方便快速的實現數據傳輸,它使用2.4GHZ的ISM頻段,最大傳輸率1Mbit/s。IEEE802.11x的技術標準是無線局域網的國際標準,也是用2.4GHZ的ISM頻段,協議主要在OSI的物理層和數據鏈路層,雖然傳輸速度快,但此類設備比較昂貴,技術復雜。Zigbee是一種新型的短距離、低速度、低功耗無線網絡技術,是一種介于無線標記技術和藍牙之間的技術,基于IEEE無線個人區域網標準,數據傳輸速率通常為10kb/s到250kb/s,有效覆蓋范圍10到75米,由于其協議簡單、成本低、網絡容量大等優點,使其在無線傳感網絡中得到廣泛的應用。在未來,短距離無線數據傳輸將向著更高傳輸速率、更高傳輸精確度的方向發展,而且傳輸設備的成本也會進一步降低,傳輸協議也會進一步簡單,從而是短距離無線通訊走入我們的生活,給我帶來更多方便。三、作品研究的目的和意義本作品研究的內容是通過MCU按照無線協議控制無線數據芯片,以此來實現大量數據的無線高速傳輸,無論是在國防軍事方面,還是民用通訊方面都有很重要的研究意義。可改裝數控操控設備、醫療設備、數據通信設備等,使數據控制、交換、采集簡單化,對無線數據通信在MCU系統中的應用和多單片機協同工作中具有非常寶貴的參考價值。四、作品簡介實物作品,實現了一種基于PS/2接口和電腦進行無線數據通信的系統。電腦鍵盤輸入的數據通過單片機采集傳送到射頻發射模塊。在一百米,甚至到幾公里(只需加PA模塊拓展)將數據傳送給另一塊單片機,單片機再通過USB接口轉換芯片和電腦進行通信。五、基本思路和關鍵技術1、整體設計思路和框圖通過單片機將鍵盤數據采集,再利用單片機轉換將信號轉換成數字信號,然后通過SPI總線將數據傳輸給無線發送芯片,無線發送芯片將數據發送出去。同樣,接收端單片機通過SPI總線控制接收端芯片,將無線傳輸過來的數據接收,再經過USB接口芯片轉換,將數據傳送給電腦,從而實現了無線數據傳輸。系統整體流程圖如圖1所示:圖1.整體設計流程圖2、PS/2數據采集接口一般,具有五腳連接器的鍵盤稱之為AT鍵盤,而具有六腳mini-DIN連接器的鍵盤則稱之為PS/2鍵盤。在本作品中使用的是六腳mini-DIN連接器,其實這兩種連接器都只有四個腳有意義,它們分別是Clock(時鐘腳)、Data(數據腳)、+5V(電源腳)和Ground(電源地)。在PS/2鍵盤與PC機的物理連接上只要保證這四根線一一對應就可以了。在本設計中只需將+5V(電源腳)與單片機的40腳相連,Ground(電源地)與單片機的20腳相連,Clock(時鐘腳)與單片機的12腳外部中斷相連,Data(數據腳)與其它任一I/O口相連即可。[1]現在比較常用的連接器如圖3所示。圖3PS/2的mini-DIN連接器3、PS/2電氣特性 PS/2通訊協議是一種雙向同步串行通訊協議。通訊的兩端通過Clock(時鐘腳)同步,并通過Data(數據腳)交換數據。任何一方如果想抑制另外一方通訊時,只需要把Clock(時鐘腳)拉到低電平。[4]如果是PC機和PS/2鍵盤間的通訊,則PC機必須做主機,也就是說,PC機可以抑制PS/2鍵盤發送數據,而PS/2鍵盤則不會抑制PC機發送數據。一般兩設備間傳輸數據的最大時鐘頻率是33kHz,大多數PS/2設備工作在10~20kHz。推薦值在15kHz左右,也就是說,Clock(時鐘腳)高、低電平的持續時間都為40μs。每一數據幀包含11~12個位,具體含義如表2所列。表2數據幀格式說明表1個起始位總是邏輯08個數據位(LSB)低位在前1個奇偶校驗位奇校驗1個停止位總是邏輯11個應答位僅用在主機對設備的通訊中4、數據傳送輸模塊介紹nRF2401是北歐集成電路公司生產的單片射頻收發芯片,工作于2.4~2.5GHzISM頻段,芯片內置頻率合成器、功率放大器、晶體振蕩器和調制器等功能模塊,輸出功率和通信頻道可通過程序進行配置。芯片能耗非常低,以-5dBm的功率發射時,工作電流只有10.5mA,接收時工作電流只有18mA,多種低功率工作模式,節能設計更方便。其DuoCeiverTM技術使nRF2401可以使用同一天線,同時接收兩個不同頻道的數據。引腳分布圖其特點如下:●全球開放的2.4GHz頻段多頻道125個滿足多頻及跳頻需要●高速率1Mbps高于藍牙內置硬件CRC電路及多點通信控制高數據吞吐量●采用0.18um先進加工技術極具競爭力的成本●1.9-3.6V低電壓低功耗滿足低功耗設計需要●廣泛適用于手持終端PDA無線數字耳機數字視頻數碼相機以及其他短距離高速無線通信應用●集成度高所有高頻元件包括電感濾波器振蕩器等已經全部集成在芯片內部使得產品一致性良好成本低性能穩定且不受外界影響●內部具有點對多點通信協議控制每個芯片可以通過軟件設置最多40bit地址只有收到本機地址時才會輸出數據提供一個中斷指示編程方便點對多點通信示意圖●嵌入CRC通信效驗協議糾檢錯是無線通信設計的難點,nRF2401內置了CRC硬件電路和協議;●雙接收功能獨特設計nRF2401的DuoCeiver技術可以同時接收兩個nRF2401的數據可以有效降低成本拓展用途●編程配置發射功率工作頻率等所有工作參數全部通過SPI串口軟件設置完成●外圍元件極少,只需一個晶振和一個電阻即可設計射頻電路;●發射功率和工作頻率等所有工作參數可全部通過軟件設置;●電流消耗很小,-5dBm輸出功率時的典型峰值電流為10.5mA;●芯片內部設置有專門的穩壓電路,因此,使用任何電源(包括DC/DC開關電源)均有很好的通信效果;●采用DuoCeiver技術可同時接收兩個nRF2401的數據;●采用ShockBurstTM模式時,能適用極低的功率操作和不嚴格的MCU執行;●帶有集成增強型8051內核、9路10bitADC、UART異步串口、SPI串口和PWM輸出;●內置看門狗;●無需外部SAW濾波器;●可100%RF檢驗;●帶有數據時隙和數據時鐘恢復功能.3內部工作原理和外部組成原理圖nRF2401的內部結構原理及外部組成框圖如圖2所示,下面介紹其工作原理.5、射頻模塊ShockBurstTM模式應用技術nRF2401的ShockBurstTMRX/TX模式采用片上先進先出(FIFO)來進行低數據率的時鐘同步和高數據率的傳輸,因此極大的降低了功耗.ShockBurstTM發射主要通過MCU接口引腳CE、CLK1和DATA來完成.當MCU請求發送數據時,置CE為高電平,此時的接收機地址和有效載荷數據作為nRF2401的內部時鐘,可用請求協議或MCU將速率調至1Mbps;置CE為低電平可激活ShockBurstTM發射.雙接收模式ShockBurstTM接收主要使用MCU接口引腳CE、DR1、CLK1和DATA來實現.當正確設置射頻包輸入載荷的地址和大小后,置CE為高電平可激活RX.此后便可在nRF2401監測信息輸入200μs,若收到有效數據包,則給MCU一個中斷并置DR1為高電平,以使MCU以時鐘形式輸出有效載荷數據,待系統收到全部數據后,此時RF2401再置DR1為低電平,此時如果CE保持高電平,則等待新的數據包.若CE置低電平,則開始接收新的序列。DuoCeiverTM的雙信道接收模式:nRF2401的DuoCeiverTM技術為RX提供了兩個獨立的專用數字信道,因而可代替兩個單獨接收系統.圖3所示是DuoCeiverTM同時雙接收信道結構圖.nRF2401可以通過一個天線接口從相隔8MHz的兩個1Mbps接收機上接收數據.同時將兩個數字信道的輸出反饋到兩個單獨的MCU接口.具體的兩個信道如下:數字信道1:CLK1,DATA,DR1;數字信道2:CLK2,DOUT2,DR2;應當說明的是,數字信道2的頻率只有在比數字信道1的頻率高出8MHz時,才能保證正常接收.6、直接收發模式應用技術在直接收發模式下,nRF2401如傳統的射頻收發器一樣工作。在直接發送時接口引腳為CE、DATA。當微控制器有數據要發送時,把CE置高,nRF2401射頻前端被激活。所有的射頻協議必須在微控制器程序中進行處理(包括字頭、地址和CRC校驗碼)。在直接接收模式時接口引腳為CE、CLK1和DATA。一旦nRF2401被配置為直接接收模式,DATA引腳將根據天線接收到的信號開始高低變化(由于噪聲的存在),CLK1引腳也開始工作,一旦接收到有效的字頭,CLK1引腳和DATA引腳將協調工作,把射頻數據包以其被發射時的數據從DATA引腳送給微控制器,字頭必須是8位。由于DR引腳沒用上,所有的地址和CRC校驗必須在微控制器內部進行。7、數據接收模式應用技術接收端單片機可以通過輸入C語言程序對無線射頻芯片NRF24L01的參數進行設置,設為接收模式,即可接受檢驗信號。接收到檢驗信號后,NRF24L01的自動應答功能會發送應答信號給發送端已確認收到信號,接著NRF24L01通過IRQ中斷通知接收端單片機,單片機進行數據接收并通過USB芯片將其轉換成電腦識別的信號傳給電腦。接收端的單片機在接收到中斷的同時,要同發射端芯片進行時間上的協同,以此來保證發送和接收的配合。最后清除NRF24L01的狀態寄存器,再次為下一次數據的接收做好準備。8、MCU硬件串行通信應用技術RS-232是現在主流的串行通信接口之一。由于RS232接口標準出現較早,難免有不足之處,主要有以下四點:(1)接口的信號電平值較高,易損壞接口電路的芯片,又因為與TTL電平不兼容故需使用電平轉換電路方能與TTL電路連接。(2)傳輸速率較低,在異步傳輸時,波特率為20Kbps;因此在“南方的老樹51CPLD開發板”中,綜合程序波特率只能采用19200,也是這個原因。(3)接口使用一根信號線和一根信號返回線而構成共地的傳輸形式,這種共地傳輸容易產生共模干擾,所以抗噪聲干擾性弱。在MAX232與單片機進行通信時,串行口的SBUF是作為同步移位寄存器使用的。在串行口發送時,SBUF相當于一個并行進入、串行輸出的移位寄存器,由單片機的內部總線并行接收8位數據,并從RXD信號線串行輸出。在接收操作時,它又相當于一個串行輸入、輸出的移位寄存器。在本設計中MAX232與單片機的串口通信原理圖如下所示:上圖為本設計應用的RS232串行通信原理圖9、PS/2接口的鍵盤與無線發射模塊的數據傳送應用技術在本設計中PS/2鍵盤與單片機的連接方式如圖9所示。P3.2口接PS/2數據線;P3.3(INT0)接PS/2時鐘線,即采用外部中斷0的方式來接受PS/2接口鍵盤的傳輸數據。①從設備到主設備的通信當從設備向主設備發送數據時,首先檢查時鐘線,以確認時鐘線是否為高電平。如果是高電平,從設備就可以開始傳輸數據;反之,從設備要等待獲得總線的控制權,才能開始傳輸數據。傳輸的每一幀由11位組成,發送時序及每一位的含義如圖7所示。圖7從設備到主設備的通信

每一幀數據中開始位總是為0,數據校驗采用奇校驗方式,停止位始終為1。從設備到主設備通信時,從設備總是在時鐘線為高時改變數據線狀態,主設備在時鐘下降沿讀人數據線狀態。②主設備到從設備的通信主設備與從設備進行通信時,主設備首先將時鐘線和數據線設置為“請求發送”狀態,具體方式為:首先下拉時鐘線至少100us抑制通信,然后下拉數據線“請求發送”最后釋放時鐘線。在此過程中,從設備在不超過10us的間隔內必須檢查這個狀態,當設備檢測到這個狀態時,它將開始產生時鐘信號。此時數據傳輸的每一幀由12位構成,其時序和每一位含義如圖8所示。

圖8主設備到從設備的通信與從設備到主設備通信相比,其每幀數據多了一個ACK位。這是從設備應答接收到字節的應答位,由從設備通過拉低數據線產生,應答位ACK總是為0。主設備到從設備通信過程中,主設備總是在時鐘線為低電平時改變數據線的狀態,從設備在時鐘上升沿讀人數據線狀態。STC89STC89S52PS/2鍵盤GNDGND+5VVCCCLKDATAP3.3P3.23圖9硬件連接電路單片機接收完數據后便要進入nRF24L01的發射模塊。在本設計中nRF24L01選擇ShockBurstTM收發工作模式。在ShockBurstTM發射流程中,接口引腳為CE,CLK1,DATA,當微控制器有數據要發送時,其把CE置高,使nRF24L01工作。當nRF24L01工作后,才把接收機的地址和要發送的數據按時序送入nRF24L10、無線接收應用技術在nRF24L01工作在ShockBurstTM接收流程中,接口引腳CE、DR1、CLK1和DATA(接收通道1),首先要配置本機地址和要接收的數據包大小。一但進入接收狀態,便把CE置高,200us后,nRF2401進入監視狀態,等待數據包的到來。當接收到正確的數據包(正確的地址和CRC校驗碼),nRF2401自動把字頭、地址和CRC校驗位移去,nRF2401通過把DR1(這個引腳一般引起微控制器中斷)置高通知微控制器,之后微控制器把數據從nRF2401移出,所有數據移完,nRF2401把DR1置低,此時,如果CE為高,則等待下一個數據包,如果CE為低,開始其它工作流程六、PCB電路板制作的關鍵技術材料1、PCB電路圖圖基于PS/2接口的無線數據傳送系統的PCB圖2、裝配圖3、元件清單元件標號封裝參數C1rad0.1104C2rad0.1104C3rad0.1104C4rad0.1104C5rad0.1104C6rad0.1104C7rad0.1104C8rad0.1104C9rad0.1104C10cap0.1220UC11cap0.110UC12cap0.110UC13rad0.10.1C14rad0.120C15rad0.120C16rad0.120C17rad0.120C18cap0.1100UC19cap0.1100UC20cap0.1100UC21cap0.1100UD1ledLEDD2ledJ1sip4ISPJ2USB1USBJ3DB9RA/MDB9JP1IDC1024L01LED1ledLEDR1AXIAL0.41KR2AXIAL0.41KR3AXIAL0.41KR4AXIAL0.41KR5AXIAL0.410KR6AXIAL0.422R7AXIAL0.422RP1SIP910KS1BUT1TESTU1SOJ-28PDIUSBD12U2DIP408051U3DIP16MAX232U4AS1117aAMS1117Y1XTAL16MY2XTAL122.1184M七、軟件設計流程圖1、主程序流程圖主程序先對系統初始化,接收機初始化后等待進入中斷接收數據,轉換數據傳給芯片轉換。發送機初始化后,等待PS/2的數據信號,采集轉換給射頻模塊,無線送出數據。主程序流程圖如下圖所示。開始開始系統初始化外部中斷N發送數據Y圖發送機主程序流程圖開始開始系統初始化外部中斷N接收數據傳給電腦Y接收機主程序流程圖2、子程序流程圖在有外部中斷發生時,表示PS/2接口的鍵盤將向單片機發送數據,待數據發送完成后,單片機保存數據并由無線發射模塊發射出去。其程序流程圖如圖12所示。外部中斷外部中斷產生鍵值數據?數據采集完?nRF24L01發射數據Y轉換NY返回N圖發送端外部中斷子程序流程圖nRFnRF24L01接收數據數據移位完畢?外部中斷Y返回送USB轉換N接收端外部中斷子程序流程圖2、發射主程序#include<reg52.h>#include<intrins.h>#include"24L01.h"#defineucharunsignedchar#defineuintunsignedintsbitKB_CLK=P3^3;sbitKB_DATA=P3^2;uintn=0;voidDelay_NS(uintx){for(;x>0;x--);}voiddelay_nms(unsignedintt){unsignedinti,j;for(i=0;i<t;i++)for(j=0;j<120;j++);}voidSend_Key(uchardat){uinti;KB_CLK=0;Delay_NS(10);KB_DATA=0;KB_CLK=1;while(KB_CLK);KB_DATA=0;while(!KB_CLK);for(i=0;i<8;i++){while(KB_CLK)_nop_();KB_DATA=dat&0x01;if(KB_DATA)n++;while(!KB_CLK)_nop_();dat>>=1;}switch(n){case0:case2:case4:case6:KB_DATA=1;break;case1:case3:case5:case7:KB_DATA=0;break;default:break;}while(KB_CLK)_nop_();while(KB_CLK)_nop_();KB_DATA=1;while(!KB_CLK)_nop_();while(KB_CLK)_nop_();while(!KB_CLK)_nop_();}ucharKey_Scan(void){uchari,key_temp;KB_CLK=1;KB_DATA=1;key_temp=0;while(KB_CLK);for(i=0;i<8;i++){key_temp>>=1;while(!KB_CLK);while(KB_CLK);_nop_();if(KB_DATA){key_temp|=0x80;}}while(KB_CLK);returnkey_temp;}unsignedcharkey2asc(unsignedcharKey){unsignedchartemp=0xff,i; for(i=0;i<49;i++) { if(Key==kbdasciicode[i][0]) { temp=kbdasciicode[i][1]; break; } } if(temp==0xff){ for(i=0;i<37;i++) { if(Key==kbdcontrolcode[i][0]) { temp=kbdcontrolcode[i][1]; break; } } } if(temp==0xff){ for(i=0;i<18;i++) { if(Key==E0startedcode[i][0]) { temp=E0startedcode[i][1]; break; } } }returntemp;}ucharGet_Key(void){ucharKey_Code[3],temp=0xff;Key_Code[0]=Key_Scan();Key_Code[1]=Key_Scan();Key_Code[2]=Key_Scan();temp=key2asc(Key_Code[0]);if(temp!=0xff)nRF24L01_TxPacket(&temp);putchar(temp);Delay_NS(2000);returnKey_Code[0];}voidLED_Indication(){Send_Key(0xED);Delay_NS(10);Send_Key(0x07);Delay_NS(10);}intmain(){ucharKey_Code;LED_Indication();UsartInt();Init_NRF24L01();for(;;){Key_Code=Get_Key();P1^=1;if((Key_Code==0x77)||(Key_Code==0x58)){P1^=2;}delay_nms(100);}}2、接收主程序#include<AT89X52.H>#include"pdiusbd12.h"#include"UsbCore.h"#include"24L01.h"voidSendReport(uint8hid_code){uint8Buf[8]={0,0,0,0,0,0,0,0};uint8i=2;if(hid_code==KeyLCtrl){Buf[0]|=0x01;}elseif(hid_code==KeyLShift){Buf[0]|=0x02;}elseif(hid_code==KeyLAlt){Buf[0]|=0x04;}else{Buf[2]=hid_code;}}unsignedcharasc_USB_code(unsignedcharasc_code){unsignedchartemp=0xff,i;for(i=0;i<49;i++) { if(asc_code==hidasciicode[i][1]) { temp=hidasciicode[i][0]; break; } } if(temp==0xff){ for(i=0;i<37;i++) { if(asc_code==hidcontrolcode[i][1]) { temp=hidcontrolcode[i][0]; break; } } } if(temp==0xff){ for(i=0;i<18;i++) { if(asc_code==E0startedcode[i][1]) { temp=E0startedcode[i][0]; break; } } }returntemp;}voidmain(void){uint16id;uint8InterruptSource;xdataunsignedcharRxBuf[1];EA=1;InitUART();init_NRF24L01();SetRX_Mode();nRF24L01_RxPacket(RxBuf);id=D12ReadID();Prints("YourD12chip\'sIDis:");PrintShortIntHex(id);UsbDisconnect();UsbConnect();ConfigValue=0;while(1){if(D12GetIntPin()==0)//如果有中斷發生{D12WriteCommand(READ_INTERRUPT_REGISTER);InterruptSource=D12ReadByte();if(InterruptSource&0x80)UsbBusSuspend();if(InterruptSource&0x40)UsbBusReset();if(InterruptSource&0x01)UsbEp0Out();if(InterruptSource&0x02)UsbEp0In();if(InterruptSource&0x04)UsbEp1Out();if(InterruptSource&0x08)UsbEp1In();if(InterruptSource&0x10)UsbEp2Out();if(InterruptSource&0x20)UsbEp2In();}if(ConfigValue!=0){if(!Ep1InIsBusy){ SetRX_Mode();if(nRF24L01_RxPacket(RxBuf)){uint8hid_code; P2^=2;hid_code=asc_USB_code(RxBuf[0]);SendReport(hid_code);UartPutChar(RxBuf[0]);}}}}}3、USB接口通信程序#include<AT89x52.H>#include"PDIUSBD12.H"#include"config.h"voidD12WriteCommand(uint8Command){D12SetCommandAddr();D12ClrWr();D12SetPortOut();D12SetData(Command);D12SetWr();D12SetPortIn();}uint8D12ReadByte(void){uint8temp;D12SetDataAddr();D12ClrRd();temp=D12GetData();D12SetRd();returntemp;}uint16D12ReadID(void){uint16id;D12WriteCommand(Read_ID);//寫讀ID命令id=D12ReadByte();//讀回ID號低字節id|=((uint16)D12ReadByte())<<8;//讀回ID號高字節returnid;}voidD12WriteByte(uint8Value){D12SetDataAddr();D12ClrWr();D12SetPortOut();D12SetData(Value);D12SetWr();D12SetPortIn();}uint8D12ReadEndpointLastStatus(uint8Endp){D12WriteCommand(0x40+Endp);//讀取端點最后狀態的命令returnD12ReadByte();}voidD12SelectEndpoint(uint8Endp){D12WriteCommand(0x00+Endp);//選擇端點的命令}voidD12ClearBuffer(void){D12WriteCommand(D12_CLEAR_BUFFER);}voidD12AcknowledgeSetup(void){D12SelectEndpoint(1);D12WriteCommand(D12_ACKNOWLEDGE_SETUP);D12SelectEndpoint(0);D12WriteCommand(D12_ACKNOWLEDGE_SETUP);}uint8D12ReadEndpointBuffer(uint8Endp,uint8Len,uint8*Buf){uint8i,j;D12SelectEndpoint(Endp);D12WriteCommand(D12_READ_BUFFER);D12ReadByte();j=D12ReadByte();if(j>Len){j=Len;}#ifdefDEBUG1Prints("讀端點");PrintLongInt(Endp/2);Prints("緩沖區");PrintLongInt(j);Prints("字節。\r\n");#endiffor(i=0;i<j;i++){D12ClrRd();*(Buf+i)=D12GetData();D12SetRd();#ifdefDEBUG1PrintHex(*(Buf+i));if(((i+1)%16)==0)Prints("\r\n");#endif}#ifdefDEBUG1if((j%16)!=0)Prints("\r\n");#endifreturnj;}voidD12ValidateBuffer(void){D12WriteCommand(D12_VALIDATE_BUFFER);}uint8D12WriteEndpointBuffer(uint8Endp,uint8Len,uint8*Buf){uint8i;D12SelectEndpoint(Endp);D12WriteCommand(D12_WRITE_BUFFER);D12WriteByte(0);D12WriteByte(Len);#ifdefDEBUG1Prints("寫端點");PrintLongInt(Endp/2);Prints("緩沖區");PrintLongInt(Len);Prints("字節。\r\n");#endifD12SetPortOut();for(i=0;i<Len;i++){D12ClrWr();D12SetData(*(Buf+i));D12SetWr();#ifdefDEBUG1PrintHex(*(Buf+i));if(((i+1)%16)==0)Prints("\r\n");#endif}#ifdefDEBUG1if((Len%16)!=0)Prints("\r\n");#endifD12SetPortIn();D12ValidateBuffer();returnLen;}voidD12SetAddress(uint8Addr){D12WriteCommand(D12_SET_ADDRESS_ENABLE);D12WriteByte(0x80|Addr);}voidD12SetEndpointEnable(uint8Enable){D12WriteCommand(D12_SET_ENDPOINT_ENABLE);if(Enable!=0){D12WriteByte(0x01);}else{D12WriteByte(0x00);}}4、無線模塊應用程序#include<reg52.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedcharuint;sbit MISO =P0^2;sbit MOSI =P0^4;sbit SCK =P0^1;sbit CE =P0^0;sbit CSN =P0^5;sbit IRQ =P0^3;sbit KEY1=P2^0;sbit LED=P2^1;#defineTX_ADR_WIDTH5 #defineRX_ADR_WIDTH5 #defineTX_PLOAD_WIDTH1 #defineRX_PLOAD_WIDTH1 uintconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; uintconstRX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; #defineREAD_REG0x00 #defineWRITE_REG0x20 #defineRD_RX_PLOAD0x61 #defineWR_TX_PLOAD0xA0 #defineFLUSH_TX0xE1 #defineFLUSH_RX0xE2 #defineREUSE_TX_PL0xE3 #defineNOP0xFF #defineCONFIG0x00#defineEN_AA0x01#defineEN_RXADDR0x02#defineSETUP_AW0x03#defineSETUP_RETR0x04#defineRF_CH0x05#defineRF_SETUP0x06#defineSTATUS0x07#defineOBSERVE_TX0x08#defineCD0x09#defineRX_ADDR_P00x0A#defineRX_ADDR_P10x0B#defineRX_ADDR_P20x0C#defineRX_ADDR_P30x0D#defineRX_ADDR_P40x0E#defineRX_ADDR_P50x0F#defineTX_ADDR0x10#defineRX_PW_P00x11#defineRX_PW_P10x12#defineRX_PW_P20x13#defineRX_PW_P30x14#defineRX_PW_P40x15#defineRX_PW_P50x16#defineFIFO_STATUS0x17voidinerDelay_us(unsignedcharn);voidinit_NRF24L01(void);uintSPI_RW(uintuchar);ucharSPI_Read(ucharreg);voidSetRX_Mode(void);uintSPI_RW_Reg(ucharreg,ucharvalue);uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf);uint bdatasta;sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;voidinerDelay_us(unsignedcharn){ for(;n>0;n--) _nop_();}voidinit_NRF24L01(void){inerDelay_us(100); CE=0; CSN=1; SCK=0; inerDelay_us(10); SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); SPI_RW_Reg(WRITE_REG+EN_AA,0x01); SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01); SPI_RW_Reg(WRITE_REG+RF_CH,0); SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07); SPI_RW_Reg(WRITE_REG+

溫馨提示

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

評論

0/150

提交評論