當前位置:
首頁 >
STC89C52 STC89LE52 NRF24L01无线 教程 (一)
發布時間:2024/9/3
52
豆豆
生活随笔
收集整理的這篇文章主要介紹了
STC89C52 STC89LE52 NRF24L01无线 教程 (一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原帖地址:http://www.dowellbbs.com/forum.php?mod=viewthread&tid=570&extra=page%3D1
程序下載地址:http://www.dowellbbs.com/forum.php?mod=viewthread&tid=571&extra=page%3D1
溫馨提示:如果您是新手推薦您按照我們寫的順序看哦!若您第一遍看的不是很明白,那么只要能夠用起來就可以了,使用多了慢慢就會更深入明白這個無線模塊(NRF24L01)了。
先來看接口電路,使用的IO口不是唯一的哦,可隨意定義接口,當然是在使用IO口模擬SPI且IRQ中斷引腳不使用的使用查詢方法判斷接收狀態的情況下了。作為初探我們就是用簡單的IO模擬SPI的方法了,中斷使用查詢的方式。那么該教程講解的接口與單片機的連接如下:
首先您需要了解NRF24L01,請參閱“NRF24L01芯片中文資料”或者“NRF24L01芯片英文資料”。 我們的教程是以一個簡單的小項目為大家展示NRF24L01的使用方法與樂趣。我們所寫的教程均是以這種方式的呢,讓您在學習的時候明白它能做什么,使您學起來不至于枯燥無味。歡迎您光臨我們小店:myworlded.taobao.com,您的支持就是我們最大的動力。 作為簡易的教程,我們只需要知道它是怎么使用的就夠了,我們本教程的目的是用NRF24L01發送數據和接收數據,且接收方會對比發送的數據與接收的數據,若完全相同則控制LED閃爍一次,并且把接收到的數據通過串口發送到PC端,通過串口工具查看接收到的數據。 具體的要求如下: 1、?具備發送和接收的能力。 2、?發送32個字節的數據,接收方接收到正確數據之后給予提示,通過LED閃爍燈形式。 3、?把接收到的數據傳送到PC進行查看。 4、?發送端每隔大約1.5秒發送一次數據,永久循環。 以上是程序的要求,若您想自行設計出硬件接口,您也是可以添加一條呢:使用DIY方式設計NRF24L01的接口板,且包含含單片機平臺,使用PCB方式或者萬用板方式均可。如果您想讓自己學的很扎實,那么推薦您自行做出接口板子呢。當然若您的能力不足,那么我們不推薦自行做板呢,因為這樣會增加您學習的難度,反而起到了反效果呢。 我們使用的方式是畫PCB的方式呢,并且做出了成品PCB,若您自己做了接口板子,那么您可以對比下一呢,O(∩_∩)O! 我們知道NRF24L01的供電電壓是1.9V~3.6V不能超過這個范圍,低了不工作,高了可能燒毀NRF24L01芯片。我們常用的STC89C52的單片機的供電電壓是5V,我們不能直接給24L01這個模塊供電,我們需要使用AMS1117-3.3V穩壓芯片把5V轉成3.3V的電壓為24L01模塊供電。 為此我們的設計原理圖如下:包含單片機最小系統、供電系統、下載程序接口、5V轉3.3V電路、NRF24L01模塊接口。并且全部引出單片機的IO口,另外還加了3.3v、電池電源輸出接口,為擴展使用。還包括了電源指示LED以及一個IO口獨立控制的LED,這個獨立控制的LED用于NRF24L01接收成功閃爍指示,另外還有個獨立按鍵,用作門鈴設計也是可以的哦。作為第三版我們添加了蜂鳴器,以及鋰離子電池的支持,使該系統能有更好的價值。溫馨提示:由于本教程是針對NRF24L01的,所以并未在教程中給予LCD1602的使用講解,但是我們給您提供了程序供您參考。
PCB布線圖如下:
成品效果圖如下:
背面圖:
大家有興趣也可以自己做呢,有提供原理圖,庫沒有提供了,提供的庫為上一版本的系統板庫文件。也可以到我們小店選購呢。是一套兩個板哦!
也許大家有疑問,能不能用呢?放心好了,我們的例程就是以這個板子為基板的,沒有任何問題。這個板子是不是感覺很不錯呢,呵呵!它不僅僅是可作為最小系統使用,而且還是NRF24L01的接口板呢,省去了另外還要做電源轉接板以及各種插線的痛苦,O(∩_∩)O!寫這個教程時我也覺得非常好使呢。 我們看看24L01怎么來操作吧,這也是本教程的重點呢。我們呢就按照上面的功能要求來設計這個程序。在程序設計之前先了解下NRF24L01。 NRF24L01是 NORDIC公司最近生產的一款無線通信通信芯片,采用 FSK調制,內部集成 NORDIC自己的 Enhanced Short Burst 協議。可以實現點對點或是 1對 6的無線通信。無線通信速度可以達到 2M(bps)。NORDIC公司提供通信模塊的 GERBER文件,可以直接加工生產。嵌入式工程師或是單片機愛好者只需要為單片機系統預留 5個 GPIO,1個中斷輸入引腳,就可以很容易實現無線通信的功能,非常適合用來為MCU系統構建無線通信功能。 功能描述: 真正的 GFSK單片式收發芯片 內置硬件鏈路層 增強型 ShockBurstTM功能 自動應答及自動重發功能 地址及 CRC檢驗功能 無線速率: 1或 2Mbps SPI接口速率:0~8Mbps 125個可選工作頻道 很短的頻道切換時間,可用于跳頻 與 nRF 24XX系列完全兼容 I/O可接受 5V電平的輸入 20腳 QFN 4×4mm封裝 極低成本晶振±60ppm 使用低成本電感和雙面 PCB板 低工作電壓:1.9~3.6V 應用領域: 無線鼠標,鍵盤,游戲機操縱桿 無線數據通訊 無線門禁 安防系統 遙控裝置 遙感勘測 智能運動設備 工業傳感器 玩具 我們常見的2.4GHz無線鍵盤鼠標有些就是使用此無線技術實現的呢。 NRF24L01引腳功能說明: 引腳分別為CSN、SCK、MISO、MOSI、IRQ、CE。 CSN:芯片的片選線,CSN為低電平芯片工作。 SCK:芯片控制的時鐘線(SPI時鐘) MISO:芯片控制數據線(主入從出) MOSI:芯片控制數據線(主出從入) IRQ:中斷信號。無線通信過程中MCU主要是通過 IRQ與 NRF24L01進行通信。 CE: 芯片的模式控制線。 在 CSN為低的情況下,CE協同 NRF24L01的 CONFIG寄 存器共同決定 NRF24L01的狀態。
NRF24L01主要有以下幾種工作狀態: Power Down Mode:掉電模式 Tx Mode:發射模式 Rx Mode:接收模式 Standby-1Mode:待機1模式 Standby-2 Mode:待機2模式
我們使用的模式主要為發射模式和接收模式。下面來看看怎么配置這些模式吧。我們知道NRF24L01的通信協議為SPI(SPI的協議請大家查閱相應資料,百度一下你就會有收獲哦!),所以我們看看SPI協議怎么寫(IO口模擬,STC89C52沒有硬件SPI,若您會了STC12C5Axxxx系列的單片機那么您可以使用硬件的SPI,將會更加的方便高效)。
以上為IO口模擬SPI的代碼,通用于任何擁有可操作IO的微處理器,需要做好位運算處理。代碼的解釋如程序中的注釋所示。非常詳細的注釋哦!也采用了自己喜歡的編程風格,您也可以借鑒的呢! 我們主要是來看看它的配置過程。我想對于一種芯片它的正確配置是大家最為關心的,有時您也許會為了這些配置問題而傷腦筋。我們先來看發射模式改怎么配置的。 發射模式的配置順序:
1.? ?? ?? ?? ? 設置TX節點的地址,也就是發射地址,接收端需與這個地址相同,否則接收不到數據。寄存器為:TX_ADDR 2.? ?? ?? ?? ? 設置RX節點的地址,也就是接收時的地址,如果是在發射模式下那么功能是為自動應答服務的(AUTO ACK)。寄存器為:RX_ADDR_P0 3.? ?? ?? ?? ? 允許AUTO ACK功能,意思是發送數據后都會等待接收端的應答信號,目的是保證數據正確發送。寄存器為:EN_AA 4.? ?? ?? ?? ? 設置允許的接收通道,總共有6個通道,我們只使用通道0,其他通道的功能應用大家熟悉了NRF24L01之后嘗試吧。寄存器為:EN_RXADDR 5.? ?? ?? ?? ? 配置自動重發次數。寄存器為:SETUP_RETR 6.? ?? ?? ?? ? 選擇通信的頻率。寄存器為:RF_CH 7.? ?? ?? ?? ? 設置接收通道0的接收數據有效寬度,與第四步對應。寄存器為:RX_PW_P0 8.? ?? ?? ?? ? 配置發射的參數,主要為低噪放大器增益、發射的功率、無線傳輸的速率。寄存器為:RF_SETUP 9.? ?? ?? ?? ? 配置收發狀態(這時配置為發射模式),CRC校驗模式以及收發狀態響應方式。寄存器為:CONFIG 10.? ?? ?? ? 清除NRF24L01的指定通道中斷狀態標志,注意發送和接收這部分清除的通道的選擇必須一致。寄存器為:STATUS TX發射模式的配置就是如此了。我們從第一行看看他是什么意思。 第一步設置TX的地址,調用了函數SPI_Write_Buf(),它的原型是:
調用是用下面的語句進行的。
WRITE_REG是寫寄存器指令的基地址,TX_ADDR是相對于基地址的偏移量,WRITE_REG+ TX_ADDR就是設置發送地址的寄存器了。若您不明白這些概念,也沒關系,知道是這樣使用的就行了。這兩個常量是用宏定義來定義的,原型如下:
TX_ADDRESS就是要設置的地址了,NRF24L01的地址是5個字節的,也就是40位。TX_ADR_WIDTH就是致命這個地址的長度了。他們的定義如下:
有這些命令和數據,再結合SPI_Write_Buf()這個函數就可以實現對NRF24L01本地發射地址的設置了。由SPI_Write_Buf()這個函數我們可以看到,它的寫入方式是:先設置將要操作的寄存器地址(這里是本地發射地址寄存器),然后再連續寫入地址數據的信息,也就是TX_ADDRESS數組中的地址數據。注意接收端的地址與這個必須一模一樣。 那么第二句也是跟第一句同理的,操作的方式一模一樣,只是選擇的地址和寫入的數據不一樣而已。
如果您想深入了解,那么就是用編譯器keil的跟蹤功能查看各個寄存器的意義吧,程序和硬件我們都有配套提供。 后面的寄存器操作使用的函數都是SPI_RW_Reg(),原型如下:
可以看到它的功能是選擇一個寄存器然后寫入這個寄存器的操作命令,是單字節進行的。那么它是如何操作的呢?它也是SPI_Write_Buf()類似,先選擇寄存器然后向這個寄存器寫入命令或數據。到這呢我想對于很多剛學習不久的朋友來說,這些寄存、寄存器的數據或命令都是一些字節數據8位、16位或者其他,總是搞不清楚他們到底是怎么一回事,說實話這些在當時也困擾了我很長時間,這主要是這樣的概念我們還沒接受導致的,原來老師也總是跟我們將教室的門牌號和教室里學生之間的關系,由于剛接觸很難真正理解。總之簡單一句話,如果你想找到在教室101房間的一個同學,那么你就得先找到101這個教室,然后再去找你想找的同學。程序中的寄存器和寄存器中的數據跟這個也是相同的概念,你要操作一個命令位或者字節,那么你得先定位它的位置(寄存器),才能對它正確無誤的操作。言歸正傳,我們在操作一個芯片時,對其的控制都是以這種方式進行的:先選擇寄存器然后向這個寄存器寫入(或讀出)命令(狀態)或數據。 以上的這些需要大家慢慢體會了,不明白也不影響我們使用這個NRF24L01的,呵呵! 緊接著就是第三步到第九步了,我想大家又會有疑問了:為什么寄存器后面寫入的數據要是那樣的呢?這就需要知道他們各個位的意義了。我們看下圖就能明白了。
我們那EN_AA來舉例說明:
下一篇接著。
首先您需要了解NRF24L01,請參閱“NRF24L01芯片中文資料”或者“NRF24L01芯片英文資料”。 我們的教程是以一個簡單的小項目為大家展示NRF24L01的使用方法與樂趣。我們所寫的教程均是以這種方式的呢,讓您在學習的時候明白它能做什么,使您學起來不至于枯燥無味。歡迎您光臨我們小店:myworlded.taobao.com,您的支持就是我們最大的動力。 作為簡易的教程,我們只需要知道它是怎么使用的就夠了,我們本教程的目的是用NRF24L01發送數據和接收數據,且接收方會對比發送的數據與接收的數據,若完全相同則控制LED閃爍一次,并且把接收到的數據通過串口發送到PC端,通過串口工具查看接收到的數據。 具體的要求如下: 1、?具備發送和接收的能力。 2、?發送32個字節的數據,接收方接收到正確數據之后給予提示,通過LED閃爍燈形式。 3、?把接收到的數據傳送到PC進行查看。 4、?發送端每隔大約1.5秒發送一次數據,永久循環。 以上是程序的要求,若您想自行設計出硬件接口,您也是可以添加一條呢:使用DIY方式設計NRF24L01的接口板,且包含含單片機平臺,使用PCB方式或者萬用板方式均可。如果您想讓自己學的很扎實,那么推薦您自行做出接口板子呢。當然若您的能力不足,那么我們不推薦自行做板呢,因為這樣會增加您學習的難度,反而起到了反效果呢。 我們使用的方式是畫PCB的方式呢,并且做出了成品PCB,若您自己做了接口板子,那么您可以對比下一呢,O(∩_∩)O! 我們知道NRF24L01的供電電壓是1.9V~3.6V不能超過這個范圍,低了不工作,高了可能燒毀NRF24L01芯片。我們常用的STC89C52的單片機的供電電壓是5V,我們不能直接給24L01這個模塊供電,我們需要使用AMS1117-3.3V穩壓芯片把5V轉成3.3V的電壓為24L01模塊供電。 為此我們的設計原理圖如下:包含單片機最小系統、供電系統、下載程序接口、5V轉3.3V電路、NRF24L01模塊接口。并且全部引出單片機的IO口,另外還加了3.3v、電池電源輸出接口,為擴展使用。還包括了電源指示LED以及一個IO口獨立控制的LED,這個獨立控制的LED用于NRF24L01接收成功閃爍指示,另外還有個獨立按鍵,用作門鈴設計也是可以的哦。作為第三版我們添加了蜂鳴器,以及鋰離子電池的支持,使該系統能有更好的價值。溫馨提示:由于本教程是針對NRF24L01的,所以并未在教程中給予LCD1602的使用講解,但是我們給您提供了程序供您參考。
PCB布線圖如下:
成品效果圖如下:
背面圖:
大家有興趣也可以自己做呢,有提供原理圖,庫沒有提供了,提供的庫為上一版本的系統板庫文件。也可以到我們小店選購呢。是一套兩個板哦!
也許大家有疑問,能不能用呢?放心好了,我們的例程就是以這個板子為基板的,沒有任何問題。這個板子是不是感覺很不錯呢,呵呵!它不僅僅是可作為最小系統使用,而且還是NRF24L01的接口板呢,省去了另外還要做電源轉接板以及各種插線的痛苦,O(∩_∩)O!寫這個教程時我也覺得非常好使呢。 我們看看24L01怎么來操作吧,這也是本教程的重點呢。我們呢就按照上面的功能要求來設計這個程序。在程序設計之前先了解下NRF24L01。 NRF24L01是 NORDIC公司最近生產的一款無線通信通信芯片,采用 FSK調制,內部集成 NORDIC自己的 Enhanced Short Burst 協議。可以實現點對點或是 1對 6的無線通信。無線通信速度可以達到 2M(bps)。NORDIC公司提供通信模塊的 GERBER文件,可以直接加工生產。嵌入式工程師或是單片機愛好者只需要為單片機系統預留 5個 GPIO,1個中斷輸入引腳,就可以很容易實現無線通信的功能,非常適合用來為MCU系統構建無線通信功能。 功能描述: 真正的 GFSK單片式收發芯片 內置硬件鏈路層 增強型 ShockBurstTM功能 自動應答及自動重發功能 地址及 CRC檢驗功能 無線速率: 1或 2Mbps SPI接口速率:0~8Mbps 125個可選工作頻道 很短的頻道切換時間,可用于跳頻 與 nRF 24XX系列完全兼容 I/O可接受 5V電平的輸入 20腳 QFN 4×4mm封裝 極低成本晶振±60ppm 使用低成本電感和雙面 PCB板 低工作電壓:1.9~3.6V 應用領域: 無線鼠標,鍵盤,游戲機操縱桿 無線數據通訊 無線門禁 安防系統 遙控裝置 遙感勘測 智能運動設備 工業傳感器 玩具 我們常見的2.4GHz無線鍵盤鼠標有些就是使用此無線技術實現的呢。 NRF24L01引腳功能說明: 引腳分別為CSN、SCK、MISO、MOSI、IRQ、CE。 CSN:芯片的片選線,CSN為低電平芯片工作。 SCK:芯片控制的時鐘線(SPI時鐘) MISO:芯片控制數據線(主入從出) MOSI:芯片控制數據線(主出從入) IRQ:中斷信號。無線通信過程中MCU主要是通過 IRQ與 NRF24L01進行通信。 CE: 芯片的模式控制線。 在 CSN為低的情況下,CE協同 NRF24L01的 CONFIG寄 存器共同決定 NRF24L01的狀態。
NRF24L01主要有以下幾種工作狀態: Power Down Mode:掉電模式 Tx Mode:發射模式 Rx Mode:接收模式 Standby-1Mode:待機1模式 Standby-2 Mode:待機2模式
我們使用的模式主要為發射模式和接收模式。下面來看看怎么配置這些模式吧。我們知道NRF24L01的通信協議為SPI(SPI的協議請大家查閱相應資料,百度一下你就會有收獲哦!),所以我們看看SPI協議怎么寫(IO口模擬,STC89C52沒有硬件SPI,若您會了STC12C5Axxxx系列的單片機那么您可以使用硬件的SPI,將會更加的方便高效)。
以上為IO口模擬SPI的代碼,通用于任何擁有可操作IO的微處理器,需要做好位運算處理。代碼的解釋如程序中的注釋所示。非常詳細的注釋哦!也采用了自己喜歡的編程風格,您也可以借鑒的呢! 我們主要是來看看它的配置過程。我想對于一種芯片它的正確配置是大家最為關心的,有時您也許會為了這些配置問題而傷腦筋。我們先來看發射模式改怎么配置的。 發射模式的配置順序:
1.? ?? ?? ?? ? 設置TX節點的地址,也就是發射地址,接收端需與這個地址相同,否則接收不到數據。寄存器為:TX_ADDR 2.? ?? ?? ?? ? 設置RX節點的地址,也就是接收時的地址,如果是在發射模式下那么功能是為自動應答服務的(AUTO ACK)。寄存器為:RX_ADDR_P0 3.? ?? ?? ?? ? 允許AUTO ACK功能,意思是發送數據后都會等待接收端的應答信號,目的是保證數據正確發送。寄存器為:EN_AA 4.? ?? ?? ?? ? 設置允許的接收通道,總共有6個通道,我們只使用通道0,其他通道的功能應用大家熟悉了NRF24L01之后嘗試吧。寄存器為:EN_RXADDR 5.? ?? ?? ?? ? 配置自動重發次數。寄存器為:SETUP_RETR 6.? ?? ?? ?? ? 選擇通信的頻率。寄存器為:RF_CH 7.? ?? ?? ?? ? 設置接收通道0的接收數據有效寬度,與第四步對應。寄存器為:RX_PW_P0 8.? ?? ?? ?? ? 配置發射的參數,主要為低噪放大器增益、發射的功率、無線傳輸的速率。寄存器為:RF_SETUP 9.? ?? ?? ?? ? 配置收發狀態(這時配置為發射模式),CRC校驗模式以及收發狀態響應方式。寄存器為:CONFIG 10.? ?? ?? ? 清除NRF24L01的指定通道中斷狀態標志,注意發送和接收這部分清除的通道的選擇必須一致。寄存器為:STATUS TX發射模式的配置就是如此了。我們從第一行看看他是什么意思。 第一步設置TX的地址,調用了函數SPI_Write_Buf(),它的原型是:
調用是用下面的語句進行的。
WRITE_REG是寫寄存器指令的基地址,TX_ADDR是相對于基地址的偏移量,WRITE_REG+ TX_ADDR就是設置發送地址的寄存器了。若您不明白這些概念,也沒關系,知道是這樣使用的就行了。這兩個常量是用宏定義來定義的,原型如下:
TX_ADDRESS就是要設置的地址了,NRF24L01的地址是5個字節的,也就是40位。TX_ADR_WIDTH就是致命這個地址的長度了。他們的定義如下:
有這些命令和數據,再結合SPI_Write_Buf()這個函數就可以實現對NRF24L01本地發射地址的設置了。由SPI_Write_Buf()這個函數我們可以看到,它的寫入方式是:先設置將要操作的寄存器地址(這里是本地發射地址寄存器),然后再連續寫入地址數據的信息,也就是TX_ADDRESS數組中的地址數據。注意接收端的地址與這個必須一模一樣。 那么第二句也是跟第一句同理的,操作的方式一模一樣,只是選擇的地址和寫入的數據不一樣而已。
如果您想深入了解,那么就是用編譯器keil的跟蹤功能查看各個寄存器的意義吧,程序和硬件我們都有配套提供。 后面的寄存器操作使用的函數都是SPI_RW_Reg(),原型如下:
可以看到它的功能是選擇一個寄存器然后寫入這個寄存器的操作命令,是單字節進行的。那么它是如何操作的呢?它也是SPI_Write_Buf()類似,先選擇寄存器然后向這個寄存器寫入命令或數據。到這呢我想對于很多剛學習不久的朋友來說,這些寄存、寄存器的數據或命令都是一些字節數據8位、16位或者其他,總是搞不清楚他們到底是怎么一回事,說實話這些在當時也困擾了我很長時間,這主要是這樣的概念我們還沒接受導致的,原來老師也總是跟我們將教室的門牌號和教室里學生之間的關系,由于剛接觸很難真正理解。總之簡單一句話,如果你想找到在教室101房間的一個同學,那么你就得先找到101這個教室,然后再去找你想找的同學。程序中的寄存器和寄存器中的數據跟這個也是相同的概念,你要操作一個命令位或者字節,那么你得先定位它的位置(寄存器),才能對它正確無誤的操作。言歸正傳,我們在操作一個芯片時,對其的控制都是以這種方式進行的:先選擇寄存器然后向這個寄存器寫入(或讀出)命令(狀態)或數據。 以上的這些需要大家慢慢體會了,不明白也不影響我們使用這個NRF24L01的,呵呵! 緊接著就是第三步到第九步了,我想大家又會有疑問了:為什么寄存器后面寫入的數據要是那樣的呢?這就需要知道他們各個位的意義了。我們看下圖就能明白了。
我們那EN_AA來舉例說明:
下一篇接著。
總結
以上是生活随笔為你收集整理的STC89C52 STC89LE52 NRF24L01无线 教程 (一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux环境 文件分割的方法
- 下一篇: STC89C52 STC89LE52 N