STC89C52 STC89LE52 NRF24L01无线 教程 (二)
生活随笔
收集整理的這篇文章主要介紹了
STC89C52 STC89LE52 NRF24L01无线 教程 (二)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原帖地址: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
接前一篇文章
可以看到它的寄存器偏移是0x01,這里說明一下,如果想要進行寫操作那么操作的寄存器地址是WRITE_REG + EN_AA,也就是EN_AA加上寫指令的基地址,若是讀操作那么是READ_REG + EN_AA,也就是EN_AA加上讀指令的基地址。 我們看看EN_AA這個寄存器的功能是什么。它的位為8位初始化的值為00111111即0x3f,每個位的功能上表已經(jīng)很詳細(xì)了。 這個送的數(shù)據(jù)是0x01,那么表示什么意思呢?意思是允許數(shù)據(jù)通道0自動應(yīng)答,而其他的通道禁止,明白了吧。其他的都是這個樣子滴。 這是NRF24L01設(shè)置發(fā)射模式時的初始化過程。下面我們看看怎么用NRF24L01進行無線數(shù)據(jù)發(fā)射傳輸。 我們從主函數(shù)main開始。
主函數(shù)很簡單,我們?yōu)槟峁┝藘蓚€模式的發(fā)射方式:手動發(fā)射(按鍵控制)和自動發(fā)射(每隔一段時間發(fā)送一次數(shù)據(jù))。 ?
這是模式1,該模式為自動發(fā)射。可以看到主函數(shù)調(diào)用的就是模式1,對于模式0手動方式,大家把主函數(shù)的Mode1改為Mode0就可以驗證了。詳細(xì)請看程序源碼。 在Mode1()這個函數(shù)中我們看看是怎么樣的一個操作順序。先延時1500ms左右,然后裝載數(shù)據(jù)到NRF24L01,LED的操作就很簡單了只是一個提示的作用,最后再清除NRF24L01的狀態(tài)標(biāo)志位,為下一次發(fā)送數(shù)據(jù)準(zhǔn)備。大家要了解數(shù)據(jù)的發(fā)送是這個樣子的。 我們來看看NRF24L01_TxPacket()這個函數(shù)。
注釋的部分是裝載接收端的地址,也就是為應(yīng)答信號服務(wù)的,由于在初始化的時候已經(jīng)初始化過了,所以這里可以不需要,但是當(dāng)您使用NRF24L01跟多的功能時,如使用了多通道通信,需要應(yīng)答時,這句就有用了,需要設(shè)置為對應(yīng)接收通道的地址才能收到應(yīng)答信號。這些功能大家知道就可以了,本教程也是讓大家會用NRF24L01,后續(xù)還是靠大家自行努力了。 接著是裝載數(shù)據(jù)了,WR_TX_PLOAD是裝載數(shù)據(jù)的命令地址,tx_buf是接收的數(shù)據(jù)指針,TX_PLOAD_WIDTH是指要發(fā)送的數(shù)據(jù)字節(jié)數(shù)。定義如下:
注意TX_PLOAD_WIDTH最大為32字節(jié),不得超過此數(shù)。 數(shù)據(jù)裝載完成后需要的是發(fā)送命令了。 這句就是設(shè)置了為發(fā)送的狀態(tài),在CE被拉高的時間里自動啟動發(fā)送。那么緊接著CE=1就是此目的了。
上面的三句用于發(fā)送完成判斷以及中斷狀態(tài)的清除,為下次發(fā)送準(zhǔn)備。
CONFIG為什么設(shè)置數(shù)據(jù)為0x5e(0101 1110)就是發(fā)送呢,那么看下這個寄存器各個位的功能就明白了。
看看最低位的功能:1 接收模式??0 發(fā)射模式,這明白了吧。其他位大家自己看看是什么功能吧。 這樣一個完整的發(fā)射過程就完成了,剛才說了Mode1()是循環(huán)發(fā)射模式,一次完成后就會進入下一次發(fā)射了。 那么到這里我們的項目任務(wù)算是完成了一半了,還剩下另一半了。
看了發(fā)射模式之后,我們再來看接收模式就不會很困難了。 接收模式的配置初始化為:
1.? ?? ?? ?? ? 設(shè)置TX節(jié)點的地址,也就是發(fā)射地址,接收端需與這個地址相同,否則接收不到數(shù)據(jù)。在接收模式中此配置可不用。寄存器為:TX_ADDR 2.? ?? ?? ?? ? 設(shè)置RX節(jié)點的地址,也就是接收時的地址,如果是在發(fā)射模式下那么功能是為自動應(yīng)答服務(wù)的(AUTO ACK)。寄存器為:RX_ADDR_P0 3.? ?? ?? ?? ? 允許AUTO ACK功能,意思是發(fā)送數(shù)據(jù)后都會等待接收端的應(yīng)答信號,目的是保證數(shù)據(jù)正確發(fā)送。寄存器為:EN_AA 4.? ?? ?? ?? ? 設(shè)置允許的接收通道,總共有6個通道,我們只使用通道0,其他通道的功能應(yīng)用大家熟悉了NRF24L01之后嘗試吧。寄存器為:EN_RXADDR 5.? ?? ?? ?? ? 配置自動重發(fā)次數(shù)。在接收模式中此配置可不用。寄存器為:SETUP_RETR 6.? ?? ?? ?? ? 選擇通信的頻率。寄存器為:RF_CH 7.? ?? ?? ?? ? 設(shè)置接收通道0的接收數(shù)據(jù)有效寬度,與第四步對應(yīng)。寄存器為:RX_PW_P0 8.? ?? ?? ?? ? 配置發(fā)射的參數(shù),主要為低噪放大器增益、發(fā)射的功率、無線傳輸?shù)乃俾省?span style="word-wrap:break-word; font-weight:700">寄存器為:RF_SETUP 9.? ?? ?? ?? ??配置收發(fā)狀態(tài)(這時配置為接收模式),CRC校驗?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式。發(fā)射模式和接收模式在初始化時只要這里設(shè)置為接收模式即可,也只有這里不一樣,其他配置都是一樣的(把配置都設(shè)置成一樣的)。寄存器為:CONFIG 10.? ?? ?? ? 清除NRF24L01的指定通道中斷狀態(tài)標(biāo)志,注意發(fā)送和接收這部分清除的通道的選擇必須一致。寄存器為:STATUS
為此操作起來就更加簡單了。從上面的初始化方式我們可以看到接收與發(fā)射的設(shè)置基本一致,只是接收模式中CONFIG寄存器的最低位變成高位即可,另外設(shè)置TX地址和設(shè)置重發(fā)次數(shù),對于接收時也是無關(guān)緊要的,所以設(shè)置不設(shè)置我們可不比理會,當(dāng)然直接刪除也是沒問題的。在接收模式中仍然使用發(fā)射模式下的初始化函數(shù)Init_NRF24L01(),我們的例程就是如此。 前面說到發(fā)射與接收模式的不同就在于CONFIG這個寄存器的設(shè)置不同,發(fā)射模式這個寄存器的最后一位需要置0,那么接收就得置1,所以在判斷接收前把這個位設(shè)置一下不就可以了。 我們寫一個函數(shù)來實現(xiàn)這個功能:
在接收模式中我們最需要注意的就是這個接收模式的設(shè)置了。向CONFIG些0x3f就可以把最后一位設(shè)置為1了,且選擇接收到數(shù)據(jù)時IRQ引腳變低,這樣就成了接收模式了。 我們也從主函數(shù)出發(fā),看看是怎么操作的。
前面的初始化我們需要了解的是InitUSART()這個函數(shù),我們項目最開始的要求有一項是接收端接收到的數(shù)據(jù)需要發(fā)送到PC進行查看,InitUSART()這個函數(shù)就是初始化串口通信的。看它的原型:
這個初始化就不多說了,對于不同的波特率使用??這兩個宏定義就行了,FOSC表示當(dāng)前系統(tǒng)時鐘,BAUD表示需要的波特率。注意使用的是定時器1而不是定時器0。 串口發(fā)送數(shù)據(jù)的函數(shù)是Rx_Byte()源碼如下:
只要按照Rx_Byte(Dat)這樣調(diào)用就能把Dat這個數(shù)據(jù)發(fā)送到PC了,PC需要用串口助手來查看數(shù)據(jù),我們使用的STC-ISP下載軟件即可使用,設(shè)置如下:
選擇到串口助手界面,在下面設(shè)置COM口和波特率,其他默認(rèn)就可以了。點擊??這個按鈕就可進入串口助手模式了。 我們接著看主函數(shù)的代碼,LED=1是熄滅LED的,如果接收不到數(shù)據(jù)那么是長滅的狀態(tài),接收到數(shù)據(jù)且數(shù)據(jù)完全正確后才被點亮一段時間(閃爍一下的效果)用于提示。 緊接著是??這個if條件語句,它就是查詢判斷NRF24L01的接收狀態(tài)的。我們來看著這個被調(diào)用的函數(shù):
這句用來判斷是否有數(shù)據(jù)的接收,前面我們配置中開啟了接收中斷,也就是說當(dāng)有數(shù)據(jù)接收后,這個引腳會變成低電平,由NRF24L01輸出拉低的。這樣判斷相對于判斷NRF24L01內(nèi)部的狀態(tài)效率會更高。 是讀取NRF24L01的狀態(tài),目的是判斷是否有數(shù)據(jù)接收。為什么要加上這句,還要判斷內(nèi)部狀態(tài)呢。答案是:這句不是必須的,但如果你想確實保證正確的數(shù)據(jù)接收狀態(tài)也未嘗不可(相當(dāng)于一個保險,O(∩_∩)O~),當(dāng)然了,刪除也是可以的,但是這個判斷24L01內(nèi)部狀態(tài)和判斷中斷引腳的方法必須保留一個,大家知道有這樣的方法就行了? 是STATUS的宏定義,是狀態(tài)寄存器的地址。 SPI_Read()的源碼為:
前面說了所有的寄存器操作都是先設(shè)置寄存器地址,然后在寫(或讀)數(shù)據(jù)或命令()狀態(tài)。那么這里呢SPI_Read()這個函數(shù)就不說了。這里值得一提的是??這個調(diào)用,傳入的實參是??,有很多人不明白這個。這里呢簡單說一下,可以看到對于讀來說這個數(shù)據(jù)是沒有用的,所以可以是任何的數(shù)據(jù)。然而習(xí)慣上都愛使用0xff,希望大家慢慢能夠明白。 在NRF24L01_RxPacket()這個函數(shù)中還有個特別的變量sta,它的聲明為: 可以看到這個使用了位操作,目的是什么呢?這樣可以使位操作變得非常簡單,對于判斷狀態(tài)是很有用的。 我們來看STATUS這個寄存器的意義: 可以看到對于接收我們需要判斷RX_DR這個位是否為1,為1就表示有數(shù)據(jù)了。那么用這個定義??就可以直接訪問sta這個變量的第七位了,很方便,也不用使用位運算來實現(xiàn)了。 當(dāng)查詢到有數(shù)據(jù)了就會調(diào)用??讀出數(shù)據(jù)放到rx_buf中也就是主函數(shù)的RxBuf[]中了(rx_buf指向的地址為RxBuf[])。這樣就完成了數(shù)據(jù)的讀出操作,下面是置位??這個接收完成且成功標(biāo)志位。 完成接收后不要忘記狀態(tài)的清除操作,為下次接收準(zhǔn)備。
在NRF24L01_RxPacket()這個函數(shù)中的最后就是返回ReceiveComplete_Flag這個變量了。在主函數(shù)中用于判斷是否有數(shù)據(jù)接收成功。 若接收數(shù)據(jù)成功了,那么我們接著看主函數(shù)。在項目的開始我們要求發(fā)送到PC端進行接收數(shù)據(jù)的查看,為此我們用下面的代碼實現(xiàn):
32次循環(huán)依次把接收到的數(shù)據(jù)通過Rx_Byte()這個函數(shù)由串口發(fā)送到PC。 要求中還有一個是要求是檢驗接收的數(shù)據(jù)是否與發(fā)送端完全一樣,這個怎么完成呢?思路是這樣的:我們也定義一個數(shù)組CheckBuf[],這個數(shù)組中的數(shù)據(jù)與發(fā)送端發(fā)送的數(shù)組數(shù)據(jù)完全一樣,然后把接收數(shù)組RxBuf[]中的數(shù)據(jù)與CheckBuf[]一一對比即可達(dá)到檢驗的目的了。接收和發(fā)送端的數(shù)組數(shù)據(jù)如下圖: 發(fā)送端數(shù)據(jù):
接收端用于檢測的數(shù)據(jù):
對于這個檢驗代碼如下:
以上的設(shè)計思路為:在向PC每發(fā)送一個字節(jié)的數(shù)據(jù),都會檢測一次RxBuf[]接收緩沖中的數(shù)據(jù),如果相等那么Right_Count正確個數(shù)計數(shù)器會自加一,32個數(shù)據(jù)向PC端發(fā)送完成后,檢驗比較也就完成了,如果相等那么Right_Count將會等于32。然后再判斷Right_Count是否大于等于32(特別建議:如果在判斷一個變量是否等于某個數(shù)時,盡量使用大于等于或者小于等于判斷的方法,可防止出錯,是對于程序安全穩(wěn)定來說的),就可知道接收的數(shù)據(jù)是否通過檢測沒有錯誤了。如果完全相等,那么會有LED=0執(zhí)行,LED被點亮用于提示校驗成功。 好啦到這里就講解完成了,大家就仔細(xì)研究研究吧。多玩玩程序。
PC端接收的數(shù)據(jù)如下:
可以看到數(shù)據(jù)也是完全正確的 經(jīng)過我們的下載測試,LED指示也是完全正確的。大家可以把這個程序下載來看看了。 到這里對于這個小項目的要求就都完成了。
您如果成功了是不是很開心呢,O(∩_∩)O! 最后提示,若您是自己搭建的,那線的連接不要錯了哦!若您使用我們的板子有任何問題,請您及時聯(lián)系我們。
之后我們還會推出更多關(guān)于NRF24L01有趣的應(yīng)用的,敬請期待!這算是個入門的教程,大家多多支持。我們水平也是有限的不可能面面俱到,有問題或者錯誤請聯(lián)系我們,感激不盡。
接前一篇文章
可以看到它的寄存器偏移是0x01,這里說明一下,如果想要進行寫操作那么操作的寄存器地址是WRITE_REG + EN_AA,也就是EN_AA加上寫指令的基地址,若是讀操作那么是READ_REG + EN_AA,也就是EN_AA加上讀指令的基地址。 我們看看EN_AA這個寄存器的功能是什么。它的位為8位初始化的值為00111111即0x3f,每個位的功能上表已經(jīng)很詳細(xì)了。 這個送的數(shù)據(jù)是0x01,那么表示什么意思呢?意思是允許數(shù)據(jù)通道0自動應(yīng)答,而其他的通道禁止,明白了吧。其他的都是這個樣子滴。 這是NRF24L01設(shè)置發(fā)射模式時的初始化過程。下面我們看看怎么用NRF24L01進行無線數(shù)據(jù)發(fā)射傳輸。 我們從主函數(shù)main開始。
主函數(shù)很簡單,我們?yōu)槟峁┝藘蓚€模式的發(fā)射方式:手動發(fā)射(按鍵控制)和自動發(fā)射(每隔一段時間發(fā)送一次數(shù)據(jù))。 ?
這是模式1,該模式為自動發(fā)射。可以看到主函數(shù)調(diào)用的就是模式1,對于模式0手動方式,大家把主函數(shù)的Mode1改為Mode0就可以驗證了。詳細(xì)請看程序源碼。 在Mode1()這個函數(shù)中我們看看是怎么樣的一個操作順序。先延時1500ms左右,然后裝載數(shù)據(jù)到NRF24L01,LED的操作就很簡單了只是一個提示的作用,最后再清除NRF24L01的狀態(tài)標(biāo)志位,為下一次發(fā)送數(shù)據(jù)準(zhǔn)備。大家要了解數(shù)據(jù)的發(fā)送是這個樣子的。 我們來看看NRF24L01_TxPacket()這個函數(shù)。
注釋的部分是裝載接收端的地址,也就是為應(yīng)答信號服務(wù)的,由于在初始化的時候已經(jīng)初始化過了,所以這里可以不需要,但是當(dāng)您使用NRF24L01跟多的功能時,如使用了多通道通信,需要應(yīng)答時,這句就有用了,需要設(shè)置為對應(yīng)接收通道的地址才能收到應(yīng)答信號。這些功能大家知道就可以了,本教程也是讓大家會用NRF24L01,后續(xù)還是靠大家自行努力了。 接著是裝載數(shù)據(jù)了,WR_TX_PLOAD是裝載數(shù)據(jù)的命令地址,tx_buf是接收的數(shù)據(jù)指針,TX_PLOAD_WIDTH是指要發(fā)送的數(shù)據(jù)字節(jié)數(shù)。定義如下:
注意TX_PLOAD_WIDTH最大為32字節(jié),不得超過此數(shù)。 數(shù)據(jù)裝載完成后需要的是發(fā)送命令了。 這句就是設(shè)置了為發(fā)送的狀態(tài),在CE被拉高的時間里自動啟動發(fā)送。那么緊接著CE=1就是此目的了。
上面的三句用于發(fā)送完成判斷以及中斷狀態(tài)的清除,為下次發(fā)送準(zhǔn)備。
CONFIG為什么設(shè)置數(shù)據(jù)為0x5e(0101 1110)就是發(fā)送呢,那么看下這個寄存器各個位的功能就明白了。
看看最低位的功能:1 接收模式??0 發(fā)射模式,這明白了吧。其他位大家自己看看是什么功能吧。 這樣一個完整的發(fā)射過程就完成了,剛才說了Mode1()是循環(huán)發(fā)射模式,一次完成后就會進入下一次發(fā)射了。 那么到這里我們的項目任務(wù)算是完成了一半了,還剩下另一半了。
看了發(fā)射模式之后,我們再來看接收模式就不會很困難了。 接收模式的配置初始化為:
1.? ?? ?? ?? ? 設(shè)置TX節(jié)點的地址,也就是發(fā)射地址,接收端需與這個地址相同,否則接收不到數(shù)據(jù)。在接收模式中此配置可不用。寄存器為:TX_ADDR 2.? ?? ?? ?? ? 設(shè)置RX節(jié)點的地址,也就是接收時的地址,如果是在發(fā)射模式下那么功能是為自動應(yīng)答服務(wù)的(AUTO ACK)。寄存器為:RX_ADDR_P0 3.? ?? ?? ?? ? 允許AUTO ACK功能,意思是發(fā)送數(shù)據(jù)后都會等待接收端的應(yīng)答信號,目的是保證數(shù)據(jù)正確發(fā)送。寄存器為:EN_AA 4.? ?? ?? ?? ? 設(shè)置允許的接收通道,總共有6個通道,我們只使用通道0,其他通道的功能應(yīng)用大家熟悉了NRF24L01之后嘗試吧。寄存器為:EN_RXADDR 5.? ?? ?? ?? ? 配置自動重發(fā)次數(shù)。在接收模式中此配置可不用。寄存器為:SETUP_RETR 6.? ?? ?? ?? ? 選擇通信的頻率。寄存器為:RF_CH 7.? ?? ?? ?? ? 設(shè)置接收通道0的接收數(shù)據(jù)有效寬度,與第四步對應(yīng)。寄存器為:RX_PW_P0 8.? ?? ?? ?? ? 配置發(fā)射的參數(shù),主要為低噪放大器增益、發(fā)射的功率、無線傳輸?shù)乃俾省?span style="word-wrap:break-word; font-weight:700">寄存器為:RF_SETUP 9.? ?? ?? ?? ??配置收發(fā)狀態(tài)(這時配置為接收模式),CRC校驗?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式。發(fā)射模式和接收模式在初始化時只要這里設(shè)置為接收模式即可,也只有這里不一樣,其他配置都是一樣的(把配置都設(shè)置成一樣的)。寄存器為:CONFIG 10.? ?? ?? ? 清除NRF24L01的指定通道中斷狀態(tài)標(biāo)志,注意發(fā)送和接收這部分清除的通道的選擇必須一致。寄存器為:STATUS
為此操作起來就更加簡單了。從上面的初始化方式我們可以看到接收與發(fā)射的設(shè)置基本一致,只是接收模式中CONFIG寄存器的最低位變成高位即可,另外設(shè)置TX地址和設(shè)置重發(fā)次數(shù),對于接收時也是無關(guān)緊要的,所以設(shè)置不設(shè)置我們可不比理會,當(dāng)然直接刪除也是沒問題的。在接收模式中仍然使用發(fā)射模式下的初始化函數(shù)Init_NRF24L01(),我們的例程就是如此。 前面說到發(fā)射與接收模式的不同就在于CONFIG這個寄存器的設(shè)置不同,發(fā)射模式這個寄存器的最后一位需要置0,那么接收就得置1,所以在判斷接收前把這個位設(shè)置一下不就可以了。 我們寫一個函數(shù)來實現(xiàn)這個功能:
在接收模式中我們最需要注意的就是這個接收模式的設(shè)置了。向CONFIG些0x3f就可以把最后一位設(shè)置為1了,且選擇接收到數(shù)據(jù)時IRQ引腳變低,這樣就成了接收模式了。 我們也從主函數(shù)出發(fā),看看是怎么操作的。
前面的初始化我們需要了解的是InitUSART()這個函數(shù),我們項目最開始的要求有一項是接收端接收到的數(shù)據(jù)需要發(fā)送到PC進行查看,InitUSART()這個函數(shù)就是初始化串口通信的。看它的原型:
這個初始化就不多說了,對于不同的波特率使用??這兩個宏定義就行了,FOSC表示當(dāng)前系統(tǒng)時鐘,BAUD表示需要的波特率。注意使用的是定時器1而不是定時器0。 串口發(fā)送數(shù)據(jù)的函數(shù)是Rx_Byte()源碼如下:
只要按照Rx_Byte(Dat)這樣調(diào)用就能把Dat這個數(shù)據(jù)發(fā)送到PC了,PC需要用串口助手來查看數(shù)據(jù),我們使用的STC-ISP下載軟件即可使用,設(shè)置如下:
選擇到串口助手界面,在下面設(shè)置COM口和波特率,其他默認(rèn)就可以了。點擊??這個按鈕就可進入串口助手模式了。 我們接著看主函數(shù)的代碼,LED=1是熄滅LED的,如果接收不到數(shù)據(jù)那么是長滅的狀態(tài),接收到數(shù)據(jù)且數(shù)據(jù)完全正確后才被點亮一段時間(閃爍一下的效果)用于提示。 緊接著是??這個if條件語句,它就是查詢判斷NRF24L01的接收狀態(tài)的。我們來看著這個被調(diào)用的函數(shù):
這句用來判斷是否有數(shù)據(jù)的接收,前面我們配置中開啟了接收中斷,也就是說當(dāng)有數(shù)據(jù)接收后,這個引腳會變成低電平,由NRF24L01輸出拉低的。這樣判斷相對于判斷NRF24L01內(nèi)部的狀態(tài)效率會更高。 是讀取NRF24L01的狀態(tài),目的是判斷是否有數(shù)據(jù)接收。為什么要加上這句,還要判斷內(nèi)部狀態(tài)呢。答案是:這句不是必須的,但如果你想確實保證正確的數(shù)據(jù)接收狀態(tài)也未嘗不可(相當(dāng)于一個保險,O(∩_∩)O~),當(dāng)然了,刪除也是可以的,但是這個判斷24L01內(nèi)部狀態(tài)和判斷中斷引腳的方法必須保留一個,大家知道有這樣的方法就行了? 是STATUS的宏定義,是狀態(tài)寄存器的地址。 SPI_Read()的源碼為:
前面說了所有的寄存器操作都是先設(shè)置寄存器地址,然后在寫(或讀)數(shù)據(jù)或命令()狀態(tài)。那么這里呢SPI_Read()這個函數(shù)就不說了。這里值得一提的是??這個調(diào)用,傳入的實參是??,有很多人不明白這個。這里呢簡單說一下,可以看到對于讀來說這個數(shù)據(jù)是沒有用的,所以可以是任何的數(shù)據(jù)。然而習(xí)慣上都愛使用0xff,希望大家慢慢能夠明白。 在NRF24L01_RxPacket()這個函數(shù)中還有個特別的變量sta,它的聲明為: 可以看到這個使用了位操作,目的是什么呢?這樣可以使位操作變得非常簡單,對于判斷狀態(tài)是很有用的。 我們來看STATUS這個寄存器的意義: 可以看到對于接收我們需要判斷RX_DR這個位是否為1,為1就表示有數(shù)據(jù)了。那么用這個定義??就可以直接訪問sta這個變量的第七位了,很方便,也不用使用位運算來實現(xiàn)了。 當(dāng)查詢到有數(shù)據(jù)了就會調(diào)用??讀出數(shù)據(jù)放到rx_buf中也就是主函數(shù)的RxBuf[]中了(rx_buf指向的地址為RxBuf[])。這樣就完成了數(shù)據(jù)的讀出操作,下面是置位??這個接收完成且成功標(biāo)志位。 完成接收后不要忘記狀態(tài)的清除操作,為下次接收準(zhǔn)備。
在NRF24L01_RxPacket()這個函數(shù)中的最后就是返回ReceiveComplete_Flag這個變量了。在主函數(shù)中用于判斷是否有數(shù)據(jù)接收成功。 若接收數(shù)據(jù)成功了,那么我們接著看主函數(shù)。在項目的開始我們要求發(fā)送到PC端進行接收數(shù)據(jù)的查看,為此我們用下面的代碼實現(xiàn):
32次循環(huán)依次把接收到的數(shù)據(jù)通過Rx_Byte()這個函數(shù)由串口發(fā)送到PC。 要求中還有一個是要求是檢驗接收的數(shù)據(jù)是否與發(fā)送端完全一樣,這個怎么完成呢?思路是這樣的:我們也定義一個數(shù)組CheckBuf[],這個數(shù)組中的數(shù)據(jù)與發(fā)送端發(fā)送的數(shù)組數(shù)據(jù)完全一樣,然后把接收數(shù)組RxBuf[]中的數(shù)據(jù)與CheckBuf[]一一對比即可達(dá)到檢驗的目的了。接收和發(fā)送端的數(shù)組數(shù)據(jù)如下圖: 發(fā)送端數(shù)據(jù):
接收端用于檢測的數(shù)據(jù):
對于這個檢驗代碼如下:
以上的設(shè)計思路為:在向PC每發(fā)送一個字節(jié)的數(shù)據(jù),都會檢測一次RxBuf[]接收緩沖中的數(shù)據(jù),如果相等那么Right_Count正確個數(shù)計數(shù)器會自加一,32個數(shù)據(jù)向PC端發(fā)送完成后,檢驗比較也就完成了,如果相等那么Right_Count將會等于32。然后再判斷Right_Count是否大于等于32(特別建議:如果在判斷一個變量是否等于某個數(shù)時,盡量使用大于等于或者小于等于判斷的方法,可防止出錯,是對于程序安全穩(wěn)定來說的),就可知道接收的數(shù)據(jù)是否通過檢測沒有錯誤了。如果完全相等,那么會有LED=0執(zhí)行,LED被點亮用于提示校驗成功。 好啦到這里就講解完成了,大家就仔細(xì)研究研究吧。多玩玩程序。
PC端接收的數(shù)據(jù)如下:
可以看到數(shù)據(jù)也是完全正確的 經(jīng)過我們的下載測試,LED指示也是完全正確的。大家可以把這個程序下載來看看了。 到這里對于這個小項目的要求就都完成了。
您如果成功了是不是很開心呢,O(∩_∩)O! 最后提示,若您是自己搭建的,那線的連接不要錯了哦!若您使用我們的板子有任何問題,請您及時聯(lián)系我們。
之后我們還會推出更多關(guān)于NRF24L01有趣的應(yīng)用的,敬請期待!這算是個入門的教程,大家多多支持。我們水平也是有限的不可能面面俱到,有問題或者錯誤請聯(lián)系我們,感激不盡。
總結(jié)
以上是生活随笔為你收集整理的STC89C52 STC89LE52 NRF24L01无线 教程 (二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STC89C52 STC89LE52 N
- 下一篇: S5P4418 OV5640摄像头 花屏