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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DHT11+Nrf24L01模塊的多點溫濕度采集系統設計 附單片機源碼與實物圖

[復制鏈接]
跳轉到指定樓層
樓主
基于DHT11傳感器和Nrf24L01模塊的多點溫濕度采集系統

  • 設計背景
農業大棚種植具有大范圍,溫濕度要求高的特點。溫度,濕度嚴重影響農作物的生長與產量,所以,對其的測量出其重要。基于這樣的考慮,設計了該套多點溫濕度采集無線傳輸系統。
  • 系統構成
該系統由89C52RC單片機、DHT11溫濕度傳感器、Nrf24L01無線傳輸模塊構成。具有多點溫濕度采集、匯總的特點(本實驗采用兩個點采集匯總一點完成)


  • 硬件設計
  • DHT11傳感器簡介
DHT11產品概述
DHT11數字溫濕度傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗干擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的濕度校驗室中進行校準。校準系數以程序的形式儲存在OTP內存中,傳感器內部在檢測信號的處理過程中要調用這些校準系數。單線制串行接口,使系統集成變得簡易快捷。超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則。產品為4 針單排引腳封裝。連接方便,特殊封裝形式可根據用戶需求而提供。
1傳感器性能說明
參數
條件
Min
Typ
Max
單位
濕度
分辨率

1
1
1
%RH

8

Bit
重復性


±1

%RH
精度
25℃

±4

%RH
0-50℃


±5
%RH
互換性
可完全互換
量程范圍
0℃
30

90
%RH
25℃
20

90
%RH
50℃
20

80
%RH
響應時間
1/e(63%)25℃1m/s 空氣
6
10
15
S
遲滯


±1

%RH
長期穩定性
典型值

±1

%RH/yr
溫度
分辨率


1
1
1
8
8
8
Bit
重復性


±1

精度

±1

±2
量程范圍

0

50
響應時間
1/e(63%)
6

30
S
(2)接口說明  
建議連接線長度短于20米時用5K上拉電阻,大于20米時根據實際情況使用合適的上拉電阻
(3)電源引腳
DHT11的供電電壓為              3-5.5V。傳感器上電后,要等待 1s 以越過不穩定狀態在此期間無需發送任何指令。電源引腳(VDD,GND)之間可增加一個100nF 的電容,用以去耦濾波。
(4)串行接口  (單線雙向)
DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,具體格式在下面說明,當前小數部分用于以后擴展,現讀出為零.操作流程如下:
一次完整的數據傳輸為40bit,高位先出。
數據格式:8bit濕度整數數據+8bit濕度小數數據
+8bi溫度整數數據+8bit溫度小數數據
         +8bit校驗和
數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據+8bi溫度整數數據+8bit溫度小數數據”所得結果的末8位。
用戶MCU發送一次開始信號后,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束后,DHT11發送響應信號,送出40bit的數據,并觸發一次信號采集,用戶可選擇讀取部分數據.從模式下,DHT11接收到開始信號觸發一次溫濕度采集,如果沒有接收到主機發送開始信號,DHT11不會主動進行溫濕度采集.采集數據后轉換到低速模式。
1.通訊過程如圖1所示
圖1
總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號.主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的響應信號,主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。
            
圖2
總線為低電平,說明DHT11發送響應信號,DHT11發送響應信號后,再把總線拉高80us,準備發送數據,每一bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1.格式見下面圖示.如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常.當最后一bit數據傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態。
            
數字0信號表示方法如圖4所示
                  圖4
數字1信號表示方法.如圖5所示
                                                        圖5
(5)測量分辨率
測量分辨率分別為 8bit(溫度)、8bit(濕度)。
6電氣特性
VDD=5V,T = 25℃,除非特殊標注
參數
條件
min
typ
max
單位
供電
DC
3
5
5.5
V
供電電流

測量
0.5

2.5
mA
平均
0.2

1
mA
待機
100

150
uA
采樣周期
1


注:采樣周期間隔不得低于1秒鐘。
7應用信息
7.1工作與貯存條件
超出建議的工作范圍可能導致高達3%RH的臨時性漂移信號。返回正常工作條后,傳感器會緩慢地向校準狀態恢復。要加速恢復進程/可參閱7.3小節的“恢復處理”。在非正常工作條件下長時間使用會加速產品的老化過程。
7.2暴露在化學物質中
電阻式濕度傳感器的感應層會受到化學蒸汽的干擾,化學物質在感應層中的擴散可能導致測量值漂移和靈敏度下降。在一個純凈的環境中,污染物質會緩慢地釋放出去。下文所述的恢復處理將加速實現這一過程。高濃度的化學污染會導致傳感器感應層的徹底損壞。
7.3恢復處理
置于極限工作條件下或化學蒸汽中的傳感器,通過如下處理程序,可使其恢復到校準時的狀態。在50-60℃和< 10%RH的濕度條件下保持2 小時(烘干);隨后在20-30℃和>70%RH的濕度條件下保持 5小時以上。
7.4溫度影響
氣體的相對濕度,在很大程度上依賴于溫度。因此在測量濕度時,應盡可能保證濕度傳感器在同一溫度下工作。如果與釋放熱量的電子元件共用一個印刷線路板,在安裝時應盡可能將DHT11遠離電子元件,并安裝在熱源下方,同時保持外殼的良好通風。為降低熱傳導,DHT11與印刷電路板其它部分的銅鍍層應盡可能最小,并在兩者之間留出一道縫隙。
7.5光線
長時間暴露在太陽光下或強烈的紫外線輻射中,會使性能降低。
7.6配線注意事項
DATA信號線材質量會影響通訊距離和通訊質量,推薦使用高質量屏蔽線。
(8)封裝信息
(9)DHT11引腳說明            
Pin
名稱
注釋
1
VDD
供電 3-5.5VDC
2
DATA
串行數據,單總線
3
NC
空腳,請懸空
4
GND
接地,電源負極
(10)焊接信息
手動焊接,在最高260℃的溫度條件下接觸時間須少于10秒。
11注意事項
(1)避免結露情況下使用。
(2)長期保存條件:溫度10-40℃,濕度60%以下。
  • nRF24L01模塊簡介
(1)nRF24L01芯片簡介
功能描述
真正的GFSK 單片式收發芯片
內置硬件鏈路層
增強型ShockBurstTM 功能
自動應答及自動重發功能
地址及CRC 檢驗功能
無線速率: 1 或2Mbps
SPI 接口速率:0~8Mbps
125 個可選工作頻道
很短的頻道切換時間,可用于跳頻
與nRF 24XX 系列完全兼容
I/O 可接受5V 電平的輸入
20 腳QFN 4×4mm 封裝
極低成本晶振±60ppm
使用低成本電感和雙面PCB 板            
低工作電壓:1.9~3.6V
概述
nRF24L01 是一款工作在2.4~2.5GHz 世界通用ISM 頻段的單片無線收發器芯片。無線收發器包括:頻
率發生器、增強型SchockBurstTM 模式控制器、功率放大器、晶體振蕩器、調制器、解調器。輸出功率、
頻道選擇和協議的設置可以通過SPI 接口進行設置。
極低的電流消耗:當工作在發射模式下發射功率為-6dBm 時電流消耗為9mA,接收模式時為12.3mA。
掉電模式和待機模式下電流消耗更低
結構框圖:
引腳及其功能:
電氣特性:
條件:VDD=+3V,VSS=0V,TA=-40℃到+85℃
極限范圍:
VDD…………………………….+3.6V
VSS………………………………0V
輸入電壓
VI………………………………-0.3V~5.25V
輸出電壓
VO……………………………. VSS~VDD
總功耗
PD(TA=85℃)……………………… 60mW
溫度
工作溫度……………………-40℃~+85℃
存儲器溫度…………………-40℃~+125℃
注意:強行超過一項或多項極限值使用將導致器件永久性損壞。
術語表:
功能描述:
工作模式
nRF24L01可以設置為以下幾種主要模式
nRF24L01在不同模式下的引腳功能
待機模式:
待機模式I 在保證快速啟動的同時減少系統平均消耗電流。在待機模式I 下,晶振正常工作。在待機
模式II 下部分時鐘緩沖器處在工作模式。當發送端TX FIFO 寄存器為空并且CE 為高電平時進入待機模式
II。在待機模式期間,寄存器配置字內容保持不變。
掉電模式:
在掉電模式下,nRF24L01 各功能關閉,保持電流消耗最小。進入掉電模式后,nRF24L01 停止工作,
但寄存器內容保持不變。啟動時間見表格13。掉電模式由寄存器中PWR_UP 位來控制
數據包處理方式:
nRF24L01 有如下幾種數據包處理方式:
ShockBurstTM(與nRF2401,nRF24E1,nRF2402,nRF24E2 數據傳輸率為1Mbps 時相同)
增強型ShockBurstTM 模式
ShockBurstTM 模式:
ShockBurst 模式下nRF24L01 可以與成本較低的低速MCU 相連。高速信號處理是由芯片內部的射頻協議處理的,nRF24L01 提供SPI接口,數據率取決于單片機本身接口速度。ShockBurst 模式通過允許與單片機低速通信而無線部分高速通信,減小了通信的平均消耗電流。
在ShockBurstTM 接收模式下,當接收到有效的地址和數據時IRQ 通知MCU,隨后MCU 可將接收到的數據從RX FIFO 寄存器中讀出。
在ShockBurstTM 發送模式下,nRF24L01 自動生成前導碼及CRC 校驗,參見表格12。數據發送完畢后IRQ 通知MCU。減少了MCU 的查詢時間,也就意味著減少了MCU 的工作量同時減少了軟件的開發
時間。nRF24L01 內部有三個不同的RX FIFO 寄存器(6 個通道共享此寄存器)和三個不同的TX FIFO 寄存器。在掉電模式下、待機模式下和數據傳輸的過程中MCU 可以隨時訪問FIFO 寄存器。這就允許SPI接口可以以低速進行數據傳送,并且可以應用于MCU 硬件上沒有SPI 接口的情況下。
增強型的ShockBurstTM 模式:
增強型ShockBurstTM 模式可以使得雙向鏈接協議執行起來更為容易、有效。典型的雙向鏈接為:發送方要求終端設備在接收到數據后有應答信號,以便于發送方檢測有無數據丟失。一旦數據丟失,則通過重新發送功能將丟失的數據恢復。增強型的ShockBurstTM 模式可以同時控制應答及重發功能而無需增加MCU
工作量。
nRF24L01 在接收模式下可以接收6 路不同通道的數據,見圖4。每一個數據通道使用不同的地址,但是共用相同的頻道。也就是說6 個不同的nRF24L01 設置為發送模式后可以與同一個設置為接收模式的nRF24L01 進行通訊,而設置為接收模式的nRF24L01 可以對這6 個發射端進行識別。數據通道0 是唯一的一個可以配置為40 位自身地址的數據通道。1~5 數據通道都為8 位自身地址和32 位公用地址。所有的數據通道都可以設置為增強型ShockBurst 模式。nRF24L01在確認收到數據后記錄地址,并以此地址為目標地址發送應答信號。在發送端,數據通道0被用做接收應答信號,因此,數據通道0 的接收地址要與發送端地址相等以確保接收到正確的應答信號。
見圖5 選擇地址舉例。
nRF24L01 配置為增強型的ShockBurstTM 發送模式下時,只要MCU 有數據要發送,nRF24L01 就會啟動ShockBurstTM 模式來發送數據。在發送完數據后nRF24L01 轉到接收模式并等待終端的應答信號。如果沒有收到應答信號, nRF24L01 將重發相同的數據包, 直到收到應答信號或重發次數超過SETUP_RETR_ARC 寄存器中設置的值為止,如果重發次數超過了設定值,則產生MAX_RT 中斷。
只要收到確認信號,nRF24L01 就認為最后一包數據已經發送成功(接收方已經收到數據),把TX FIFO中的數據清除掉并產生TX_DS 中斷(IRQ 引腳置高)。在增強型ShockBurstTM 模式下,nRF24L01 有如下的特征:
當工作在應答模式時,快速的空中傳輸及啟動時間,極大的降低了電流消耗。
低成本。nRF24L01 集成了所有高速鏈路層操作,比如:重發丟失數據包和產生應答信號。無需單片機硬件上一定有SPI 口與其相連。SPI 接口可以利用單片機通用I/O 口進行模擬
由于空中傳輸時間很短,極大的降低了無線傳輸中的碰撞現象
由于鏈路層完全集成在芯片上,非常便于軟硬件的開發。
增強型ShockBurstTM 發送模式:
1、 配置寄存器位PRIM_RX 為低
2、 當MCU 有數據要發送時,接收節點地址(TX_ADDR)和有效數據(TX_PLD)通過SPI 接口寫入nRF24L01。發送數據的長度以字節計數從MCU 寫入TX FIFO。當CSN 為低時數據被不斷的寫入。發送端發送完數據后,將通道0 設置為接收模式來接收應答信號,其接收地址(RX_ADDR_P0)與接收端地址(TX_ADDR)相同。例:在圖5 中數據通道5 的發送端(TX5)及接收端(RX)地址設置如下:
TX5:TX_ADDR=0xB3B4B5B605
TX5:RX_ADDR_P0=0xB3B4B5B605
RX:RX_ADDR_P5=0xB3B4B5B605
3、 設置CE 為高,啟動發射。CE 高電平持續時間最小為10 us。
4、 nRF24L01 ShockBurstTM 模式:
無線系統上電
啟動內部16MHz 時鐘
無線發送數據打包(見數據包描述)
高速發送數據(由MCU 設定為1Mbps 或2Mbps)
5、 如果啟動了自動應答模式(自動重發計數器不等于0,ENAA_P0=1),無線芯片立即進入接收模式。如果在有效應答時間范圍內收到應答信號,則認為數據成功發送到了接收端,此時狀態寄存器的TX_DS 位置高并把數據從TX FIFO 中清除掉。如果在設定時間范圍內沒有接收到應答信號,則重新發送數據。如果自動重發計數器(ARC_CNT)溢出(超過了編程設定的值),則狀態寄存器的MAX_RT 位置高。不清除TX FIFO 中的數據。當MAX_RT 或TX_DS 為高電平時IRQ 引腳產生中斷。IRQ 中斷通過寫狀態寄存器來復位(見中斷章節)。如果重發次數在達到設定的最大重發次數時還沒有收到應答信號的話,在MAX_RX 中斷清除之前不會重發數據包。數據包丟失計數器(PLOS_CNT)在每次產生MAX_RT 中斷后加一。也就是說:重發計數器ARC_CNT 計算重發數據包次數,PLOS_CNT 計算在達到最大允許重發次數時仍沒有發送成功的數據包個數。
6、 如果CE 置低,則系統進入待機模式I。如果不設置CE 為低,則系統會發送TX FIFO 寄存器中下一包數據。如果TX FIFO 寄存器為空并且CE 為高則系統進入待機模式II.
發送端發送完數據后,將通道0 設置為接收模式來接收應答信號,其接收地址(RX_ADDR_P0)與接收端地址(TX_ADDR)相同。例:在圖5 中數據通道5 的發送端(TX5)及接收端(RX)地址設置如下:
TX5:TX_ADDR=0xB3B4B5B605
TX5:RX_ADDR_P0=0xB3B4B5B605
RX:RX_ADDR_P5=0xB3B4B5B605
增強型ShockBurstTM接受模式:
1、ShockBurstTM接受模式是通過設置寄存器中PRIM_RX 位為高來選擇的。準備接收數據的通道必須被使能(EN_RXADDR 寄存器),所有工作在增強型ShockBurstTM 模式下的數據通道的自動應答功能是由(EN_AA 寄存器)來使能的,有效數據寬度是由RX_PW_Px 寄存器來設置的。地址的建立過程見增強型ShockBurstTM 發送章節。
2、 接收模式由設置CE 為高來啟動。
3、 130us 后nRF24L01 開始檢測空中信息。
4、 接收到有效的數據包后(地址匹配、CRC 檢驗正確),數據存儲在RX_FIFO 中,同時RX_DR 位置高,并產生中斷。狀態寄存器中RX_P_NO 位顯示數據是由哪個通道接收到的。
5、 如果使能自動確認信號,則發送確認信號。
6、 MCU 設置CE 腳為低,進入待機模式I(低功耗模式)。
7、 MCU 將數據以合適的速率通過SPI 口將數據讀出。
8、 芯片準備好進入發送模式、接收模式或掉電模式
兩種數據雙方向的通訊方式
如果想要數據在雙方向上通訊,PRIM_RX 寄存器必須緊隨芯片工作模式的變化而變化。處理器必須保證PTX 和PRX 端的同步性。在RX_FIFO和TX_FIFO 寄存器中可能同時存有數據。
自動應答(RX):
自動應答功能減少了外部MCU 的工作量,并且在鼠標/鍵盤等應用中也可以不要求硬件一定有SPI 接口,因此降低成本減少電流消耗。自動重應答功能可以通過SPI 口對不同的數據通道分別進行配置。
在自動應答模式使能的情況下,收到有效的數據包后,系統將進入發送模式并發送確認信號。發送完確認信號后,系統進入正常工作模式(工作模式由PRIM_RX 位和CE 引腳決定)。
自動重發功能(ART(TX)
自動重發功能是針對自動應答系統的發送方。SETUP_RETR 寄存器設置:啟動重發數據的時間長度。在每次發送結束后系統都會進入接收模式并在設定的時間范圍內等待應答信號。接收到應答信號后,系統轉入正常發送模式。如果TX FIFO 中沒有待發送的數據且CE 腳電平為低,則系統將進入待機模式I。如果沒有收到確認信號,則系統返回到發送模式并重發數據直到收到確認信號或重發次數超過設定值(達到最大的重發次數)。有新的數據發送或PRIM_RX 寄存器配置改變時丟包計數器復位。
數據包識別和CRC 校驗應用于增強型ShockBurstTM 模式下:
每一包數據都包括兩位的PID(數據包識別)來識別接收的數據是新數據包還是重發的數據包。PID識別可以防止接收端同一數據包多次送入MCU。在發送方每從MCU 取得一包新數據后PID 值加一。PID和CRC 校驗應用在接收方識別接收的數據是重發的數據包還是新數據包。如果在鏈接中有一些數據丟失
了,則PID 值與上一包數據的PID 值相同。如果一包數據擁有與上一包數據相同的PID 值,nRF24L01 將
對兩包數據的CRC 值進行比較。如果CRC 值也相同的話就認為后面一包是前一包的重發數據包而被舍棄。
1:接收方:
接收方對新接收數據包的PID 值與上一包進行比較。如果PID 值不同,則認為接收的數據包是新
數據包。如果PID 值與上一包相同,則新接收的數據包有可能與前一包相同。接收方必須確認CRC
值是否相等,如果CRC 值與前一包數據的CRC 值相等,則認為是同一包數據并將其舍棄。
2:發送方:
每發送一包新的數據則發送方的PID 值加一。
和CRC 校驗應用在接收方識別接收的數據是重發的數據包還是新數據包。如果在鏈接中有一些數據丟失
了,則PID 值與上一包數據的PID 值相同。如果一包數據擁有與上一包數據相同的PID 值,nRF24L01 將
對兩包數據的CRC 值進行比較。如果CRC 值也相同的話就認為后面一包是前一包的重發數據包而被舍棄。
CRC 校驗的長度是通過SPI 接口進行配置的。一定要注意CRC 計算范圍包括整個數據包:地址、PID和有效數據等。若CRC 校驗錯誤則不會接收數據包,這一點是接收數據包的附加要求,在上圖沒有說明。
載波檢測—CD
當接收端檢測到射頻范圍內的信號時將CD 置高,否則CD 為低。內部的CD 信號在寫入寄存器之前是經過濾波的,內部CD 高電平狀態至少保持128us 以上。
在增強型ShockBurstTM模式中只有當發送模塊沒有成功發送數據時,推薦使用CD檢測功能。如果發送端PLOS_CNT顯示數據包丟失率太高時,可將其設置位接收模式檢測CD值,如果CD為高(說明通道出現了擁擠現象),需要更改通信頻道;如果CD為低電平狀態(距離超出通信范圍),可保持原有通信頻道,但需作其它調整。
數據通道:
nRF24L01 配置為接收模式時可以接收6 路不同地址相同頻率的數據。每個數據通道擁有自己的地址并且可以通過寄存器來進行分別配置。
數據通道是通過寄存器EN_RXADDR 來設置的,默認狀態下只有數據通道0 和數據通道1 是開啟狀態的。
每一個數據通道的地址是通過寄存器RX_ADDR_Px 來配置的。通常情況下不允許不同的數據通道設置完全相同的地址。
數據通道0 有40 位可配置地址。數據通道1~5 的地址為:32 位共用地址+各自的地址(最低字節)。圖7 所示的是數據通道1~5 的地址設置方法舉例。所有數據通道可以設置為多達40 位,但是1~5 數據通道的最低位必須不同。
當從一個數據通道縱接收到數據,并且此數據通道設置為應答方式的話,則nRF24L01 在收到數據后產生應答信號,此應答信號的目標地址為接收通道地址。
寄存器配置有些是針對所有數據通道的,有些則是針對個別的。如下設置舉例是針對所有數據通道的:
● CRC 使能/禁止
● CRC 計算
● 接收地址寬度
● 頻道設置
● 無線數據通信速率
● LNA 增益
● 射頻輸出功率
寄存器配置:
nRF24L01 所有配置都在配置寄存器中,所有寄存器都是通過SPI 口進行配置的。
SPI 接口:
SPI 接口是標準的SPI 接口,其最大的數據傳輸率為10Mbps。大多數寄存器是可讀的。
SPI 指令設置:
SPI 接口可能用到的指令在下面有所說明。CSN 為低后SPI 接口等待執行指令。每一條指令的執行都必須通過一次CSN 由高到低的變化。
SPI 指令格式:
<命令字:由高位到低位(每字節)>
<數據字節:低字節到高字節,每一字節高位在前>參看圖8 及圖9
R_REGISTER 和W_REGISTER 寄存器可能操作單字節或多字節寄存器。當訪問多字節寄存器時首先要讀/寫的是最低字節的高位。在所有多字節寄存器被寫完之前可以結束寫SPI 操作,在這種情況下沒有寫完的高字節保持原有內容不變。例如:RX_ADDR_P0 寄存器的最低字節可以通過寫一個字節給寄存器RX_ADDR_P0 來改變。在CSN 狀態由高變低后可以通過MISO 來讀取狀態寄存器的內容。
中斷:
nRF24L01 的中斷引腳(IRQ)為低電平觸發,當狀態寄存器中TX_DS、RX_DR 或MAX_RT 為高時觸發中斷。當MCU 給中斷源寫‘1’時,中斷引腳被禁止。可屏蔽中斷可以被IRQ 中斷屏蔽。通過設置可屏蔽中斷位為高,則中斷響應被禁止。默認狀態下所有的中斷源是被禁止的。
SPI 時序:
圖8、9、10 和表9、10 給出了SPI 操作及時序。在寫寄存器之前一定要進入待機模式或掉電模式。在圖8 至圖10 中用到了下面的符號:
Cn-SPI 指令位
Sn-狀態寄存器位
Dn-數據位(備注:由低字節到高字節,每個字節中高位在前)
nRF24XX 兼容的寄存器配置:
如何建立nRF24L01 nRF2401/ nRF2402/ nRF24E1/ nRF24E2 接收數據:
使用與nRF2401/ nRF2402/ nRF24E1/ nRF24E2 相同的CRC 配置
設置PRIM_RX 位為1
相應通道禁止自動應答功能
與發射模塊使用相同的地址寬度
與發射模塊使用相同的頻道
在nRF24L01 和nRF2401/ nRF2402/ nRF24E1/ nRF24E2 兩端都選擇1Mbit/s 的數據傳輸率
設置正確的數據寬度
設置PWR_UP 和CE 為高
如何建立nRF24L01 發射,nRF2401/ nRF2402/ nRF24E1/ nRF24E2 接收數據:
使用與nRF2401/ nRF2402/ nRF24E1/ nRF24E2 相同的CRC 配置
設置PRIM_RX 位為0
設置自動重發計數器為0 禁止自動重發功能
與nRF2401/ nRF2402/ nRF24E1/ nRF24E2 使用相同的地址寬度
與nRF2401/ nRF2402/ nRF24E1/ nRF24E2 使用相同的頻道
在nRF24L01 和nRF2401/ nRF2402/ nRF24E1/ nRF24E2 兩端都選擇1Mbit/s的數據傳輸率
設置PWR_UP 為高
發送與nRF2401/ nRF2402/ nRF24E1/ nRF24E2 寄存器配置數據寬度相同的數據長度。
設置CE 為高啟動發射
打包格式描述:
增強型ShockBurstTM 模式下的數據包形式。
重要的時序數據
下面是nRF24L01 部分工作時序數據。
nRF24L01 時序信息
nRF24L01 在掉電模式下轉入發射模式或接收模式前必須經過1.5ms 的待機模式。注意:當關掉電源VDD 后寄存器配置內容丟失,模塊上電后需重新進行配置。
(2)nRF24L01模塊簡介
、產品特性
2.4GHz 全球開放ISM 頻段,最大0dBm 發射功率,免許可
證使用
支持六路通道的數據接收
低工作電壓:1.9~3.6V低電壓工作
高速率:2Mbps,由于空中傳輸時間很短,極大的降低了無
線傳輸中的碰撞現象(軟件設置1Mbps或者2Mbps的空中傳輸速
率)
多頻點:125 頻點,滿足多點通信和跳頻通信需要
超小型:內置2.4GHz天線,體積小巧,15x29mm(包括天線)
低功耗:當工作在應答模式通信時,快速的空中傳輸及啟動
時間,極大的降低了電流消耗。
低應用成本:NRF24L01 集成了所有與RF協議相關的高速信
號處理部分,比如:自動重發丟失數據
包和自動產生應答信號等,NRF24L01的SPI接口可以利用單片機
的硬件SPI口連接或用單片機I/O口進行模擬,內部有FIFO可以與
各種高低速微處理器接口,便于使用低成本單片機。
便于開發:由于鏈路層完全集成在模塊上,非常便于開發。
自動重發功能,自動檢測和重發丟失的數據包,重發時間及
重發次數可軟件控制
自動存儲未收到應答信號的數據包
自動應答功能,在收到有效數據后,模塊自動發送應答信號,
無須另行編程
載波檢測—固定頻率檢測
內置硬件CRC 檢錯和點對多點通信地址控制
數據包傳輸錯誤計數器及載波檢測功能可用于跳頻設置
可同時設置六路接收通道地址,可有選擇性的打開接收通道
標準插針Dip2.54MM 間距接口,便于嵌入式應用
  • 、基本電氣特性
引腳說明
說明:
1) VCC腳接電壓范圍為1.9V~3.6V之間,不能在這個區間之外,超
過3.6V將會燒毀模塊。推薦電壓3.3V左右。
2) 除電源VCC和接地端,其余腳都可以直接和普通的5V單片機IO口
直接相連,無需電平轉換。當然對3V左右的單片機更加適用了。
3) 硬件上面沒有SPI的單片機也可以控制本模塊,用普通單片機IO
口模擬SPI不需要單片機真正的串口介入,只需要普通的單片機IO口
就可以了,當然用串口也可以了(a:51系列單片機P0口連接時候,
需要加10K的上拉電阻,與其余口連接不需要。
b:其他系列的單片機,如果是5V的,請參考該系列單片機IO口輸出電流大小,如果超過10mA,需要串聯電阻分壓,否則容易燒毀模塊! 如果是3.3V的,可以
直接和RF24l01模塊的IO口線連接。比如AVR系列單片機如果是5V的,一般串接2K的電阻)
  • 單片機89C52RC
  • 軟件設計
api.h文件(采集點1、2,接收點共用)

  1. #ifndef _API_DEF_
  2. #define _API_DEF_

  3. // Define interface to nRF24L01

  4. // Define SPI pins
  5. sbit CE   = P1^0;  // Chip Enable pin signal (output)
  6. sbit CSN  = P1^1;  // Slave Select pin, (output to CSN, nRF24L01)
  7. sbit IRQ  = P1^5;  // Interrupt signal, from nRF24L01 (input)
  8. sbit MISO = P1^4;  // Master In, Slave Out pin (input)
  9. sbit MOSI = P1^3;  // Serial Clock pin, (output)
  10. sbit SCK  = P1^2;  // Master Out, Slave In pin (output)

  11. // SPI(nRF24L01) commands
  12. #define READ_REG    0x00  // Define read command to register
  13. #define WRITE_REG   0x20  // Define write command to register
  14. #define RD_RX_PLOAD 0x61  // Define RX payload register address
  15. #define WR_TX_PLOAD 0xA0  // Define TX payload register address
  16. #define FLUSH_TX    0xE1  // Define flush TX register command
  17. #define FLUSH_RX    0xE2  // Define flush RX register command
  18. #define REUSE_TX_PL 0xE3  // Define reuse TX payload register command
  19. #define NOP         0xFF  // Define No Operation, might be used to read status register

  20. // SPI(nRF24L01) registers(addresses)
  21. #define CONFIG      0x00  // 'Config' register address
  22. #define EN_AA       0x01  // 'Enable Auto Acknowledgment' register address
  23. #define EN_RXADDR   0x02  // 'Enabled RX addresses' register address
  24. #define SETUP_AW    0x03  // 'Setup address width' register address
  25. #define SETUP_RETR  0x04  // 'Setup Auto. Retrans' register address
  26. #define RF_CH       0x05  // 'RF channel' register address
  27. #define RF_SETUP    0x06  // 'RF setup' register address
  28. #define STATUS      0x07  // 'Status' register address
  29. #define OBSERVE_TX  0x08  // 'Observe TX' register address
  30. #define CD          0x09  // 'Carrier Detect' register address
  31. #define RX_ADDR_P0  0x0A  // 'RX address pipe0' register address
  32. #define RX_ADDR_P1  0x0B  // 'RX address pipe1' register address
  33. #define RX_ADDR_P2  0x0C  // 'RX address pipe2' register address
  34. #define RX_ADDR_P3  0x0D  // 'RX address pipe3' register address
  35. #define RX_ADDR_P4  0x0E  // 'RX address pipe4' register address
  36. #define RX_ADDR_P5  0x0F  // 'RX address pipe5' register address
  37. #define TX_ADDR     0x10  // 'TX address' register address
  38. #define RX_PW_P0    0x11  // 'RX payload width, pipe0' register address
  39. #define RX_PW_P1    0x12  // 'RX payload width, pipe1' register address
  40. #define RX_PW_P2    0x13  // 'RX payload width, pipe2' register address
  41. #define RX_PW_P3    0x14  // 'RX payload width, pipe3' register address
  42. #define RX_PW_P4    0x15  // 'RX payload width, pipe4' register address
  43. #define RX_PW_P5    0x16  // 'RX payload width, pipe5' register address
  44. #define FIFO_STATUS 0x17  // 'FIFO Status Register' register address
  45. #endif   /* _API_DEF_ */
復制代碼

(1)采集點1發送程序:
#include <reg51.h>
#include <intrins.h>
#include <api.h>

#define uchar unsigned char
#define uint unsigned int

/***************************************************/
#define TX_ADR_WIDTH   5  // 5字節寬度的發送/接收地址
#define TX_PLOAD_WIDTH 6  // 數據通道有效數據寬度


uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定義一個靜態發送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar flag;
uchar str_1[TX_PLOAD_WIDTH]="AZainm",outdata[TX_PLOAD_WIDTH];                            //第一位為地址位
uchar bdata sta;
int                count,h;
uchar U8FLAG,k;
uchar U8count,U8temp;
uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar U8comdata;
uint  U16temp1,U16temp2;
sbit  RX_DR              = sta^6;
sbit  TX_DS              = sta^5;
sbit  MAX_RT = sta^4;
sbit  P2_3  = P2^3 ;                                                        //DHT11信號
/**************************************************/

/**************************************************
函數: init_io()

描述:
    初始化IO
/**************************************************/
void init_io(void)
{
              CE  = 0;        // 待機
              CSN = 1;        // SPI禁止
              SCK = 0;        // SPI時鐘置低
              IRQ = 1;        // 中斷復位
}
/**************************************************/
/**************************************************
函數: init_ser()

描述:
    初始化串口
/**************************************************/
void init_ser(){
              TMOD = 0x20;                //定時器T1使用工作方式2
              TH1 = 253;        // 設置初值
              TL1 = 253;
              TR1 = 1;          // 開始計時
              SCON = 0x50;                //工作方式1,波特率9600bps,允許接收  
              ES = 1;
              EA = 1;           // 打開所以中斷  
              TI = 0;
              RI = 0;
}
/**************************************************
函數:delay_ms()

描述:
    延遲x毫秒
/**************************************************/
void delay_ms(uchar x)
{
    uchar i, j;
    i = 0;
    for(i=0; i<x; i++)
    {
       j = 250;
       while(--j);
                 j = 250;
       while(--j);
    }
}
/**************************************************/

/**************************************************
函數:SPI_RW()

描述:
    根據SPI協議,寫一字節數據到nRF24L01,同時從nRF24L01
              讀出一字節
/**************************************************/
uchar SPI_RW(uchar byte)
{
              uchar i;
                 for(i=0; i<8; i++)          // 循環8次
                 {
                               MOSI = (byte & 0x80);   // byte最高位輸出到MOSI
                               byte <<= 1;             // 低一位移位到最高位
                               SCK = 1;                // 拉高SCK,nRF24L01從MOSI讀入1位數據,同時從MISO輸出1位數據
                               byte |= MISO;                     // 讀MISO到byte最低位
                               SCK = 0;                          // SCK置低
                 }
    return(byte);                         // 返回讀出的一字節
}
/**************************************************/

/**************************************************
函數:SPI_RW_Reg()

描述:
    寫數據value到reg寄存器
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
              uchar status;
                CSN = 0;                   // CSN置低,開始傳輸數據
                status = SPI_RW(reg);      // 選擇寄存器,同時返回狀態字
                SPI_RW(value);             // 然后寫數據到該寄存器
                CSN = 1;                   // CSN拉高,結束數據傳輸
                return(status);            // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:SPI_Read()

描述:
    從reg寄存器讀一字節
/**************************************************/
uchar SPI_Read(uchar reg)
{
              uchar reg_val;
                CSN = 0;                    // CSN置低,開始傳輸數據
                SPI_RW(reg);                // 選擇寄存器
                reg_val = SPI_RW(0);        // 然后從該寄存器讀數據
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(reg_val);            // 返回寄存器數據
}
/**************************************************/

/**************************************************
函數:SPI_Read_Buf()

描述:
    從reg寄存器讀出bytes個字節,通常用來讀取接收通道
              數據或接收/發送地址
/**************************************************/
uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
              uchar status, i;
                CSN = 0;                    // CSN置低,開始傳輸數據
                status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
                for(i=0; i<bytes; i++)
                  pBuf[ i] = SPI_RW(0);    // 逐個字節從nRF24L01讀出
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(status);             // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:SPI_Write_Buf()

描述:
    把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發
              射通道數據或接收/發送地址
/**************************************************/
uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
              uchar status, i;
                CSN = 0;                    // CSN置低,開始傳輸數據
                status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
                for(i=0; i<bytes; i++)
                  SPI_RW(pBuf[ i]);        // 逐個字節寫入nRF24L01
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(status);             // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:RX_Mode()

描述:
    這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包
/**************************************************/
void RX_Mode(void)
{
              CE = 0;
                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 接收設備接收通道0使用和發送設備相同的發送地址
                SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);               // 使能接收通道0自動應答
                SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0
                SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 選擇射頻通道0x40
                SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0選擇和發送通道相同有效數據寬度
                SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
                SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校驗,上電,接收模式
                CE = 1;                                            // 拉高CE啟動接收設備
}
/**************************************************/

/**************************************************
函數:TX_Mode()

描述:
    這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),
              130us后啟動發射,數據發送結束后,發送模塊自動轉入接收
              模式等待應答信號。
/**************************************************/
void TX_Mode(uchar * BUF)
{
              CE = 0;
                SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 寫入發送地址
                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 為了應答接收設備,接收通道0地址和發送地址相同
                SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                  // 寫數據包到TX FIFO
                SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道0自動應答
                SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0
                SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自動重發延時等待250us+86us,自動重發10次
                SPI_RW_Reg(WRITE_REG + RF_CH, 40);         // 選擇射頻通道0x40
                SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
                SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校驗,上電
              CE = 1;
}
/**************************************************/

/**************************************************
函數:SendData(uchar *a)

描述:
    串口發送數據
/**************************************************/
SendData(uchar a[TX_PLOAD_WIDTH])
{              int i;
              for(i=0;i<TX_PLOAD_WIDTH;i++){
              outdata[ i] = a[ i];
              }
              count = 1;
              SBUF=outdata[0];
}
/**************************************************/

/**************************************************
函數:Check_ACK()

描述:
    檢查接收設備有無接收到數據包,設定沒有收到應答信
              號是否重發
/**************************************************/
uchar Check_ACK(bit clear)
{
              while(IRQ);
              sta = SPI_RW(NOP);                    // 返回狀態寄存器
              if(MAX_RT)
                            if(clear)                         // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
                                          SPI_RW(FLUSH_TX);
              SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中斷標志
              IRQ = 1;
              if(TX_DS)
                            return(0x00);
              else
                            return(0xff);
}
/**************************************************/

/**************************************************/
//DHT11部分


//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//

void Delay(uint j)
{              uchar i;
              for(;j>0;j--)
              {              
              for(i=0;i<27;i++);

              }
}
void  Delay_10us(void)
{
              uchar i;
    i--;
    i--;
    i--;
    i--;
    i--;
    i--;
}
void  COM(void)
{

              uchar i;

    for(i=0;i<8;i++)               
              {
                           
                            U8FLAG=2;            
                               while((!P2_3)&&U8FLAG++);
                            Delay_10us();
                            Delay_10us();
                            Delay_10us();
                              U8temp=0;
                  if(P2_3)U8temp=1;
                            U8FLAG=2;
                            while((P2_3)&&U8FLAG++);
                               //超時則跳出for循環                             
                               if(U8FLAG==1)break;
                               //判斷數據位是0還是1            
                            // 如果高電平高過預定0高電平值則數據位為 1
                            U8comdata<<=1;
                               U8comdata|=U8temp;        //0
                  }//rof
               
}

              //--------------------------------
              //-----濕度讀取子程序 ------------
              //--------------------------------
              //----以下變量均為全局變量--------
              //----溫度高8位== U8T_data_H------
              //----溫度低8位== U8T_data_L------
              //----濕度高8位== U8RH_data_H-----
              //----濕度低8位== U8RH_data_L-----
              //----校驗 8位 == U8checkdata-----
              //----調用相關子程序如下----------
              //---- Delay();, Delay_10us();,COM();
              //--------------------------------

void RH(void)
{
                //主機拉低18ms
              P2_3=0;
              Delay(180);
              P2_3=1;
              //總線由上拉電阻拉高 主機延時20us
              Delay_10us();
              Delay_10us();
              Delay_10us();
              Delay_10us();
              //主機設為輸入 判斷從機響應信號
              P2_3=1;
              //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行               
              if(!P2_3)                            //T !               
              {
                            U8FLAG=2;
                            //判斷從機是否發出 80us 的低電平響應信號是否結束            
                            while((!P2_3)&&U8FLAG++);
                            U8FLAG=2;
                            //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
                            while((P2_3)&&U8FLAG++);
                            //數據接收狀態                           
                            COM();
                            U8RH_data_H_temp=U8comdata;
                            COM();
                            U8RH_data_L_temp=U8comdata;
                            COM();
                            U8T_data_H_temp=U8comdata;
                            COM();
                            U8T_data_L_temp=U8comdata;
                            COM();
                            U8checkdata_temp=U8comdata;
                            P2_3=1;
                            //數據校驗
                            U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                            if(U8temp==U8checkdata_temp)
                            {
                            U8RH_data_H=U8RH_data_H_temp;
                            U8RH_data_L=U8RH_data_L_temp;
                            U8T_data_H=U8T_data_H_temp;
                            U8T_data_L=U8T_data_L_temp;
                            U8checkdata=U8checkdata_temp;
                            }//fi
              }//fi

}

/**************************************************
函數:main()

描述:
    主函數
/**************************************************/
void main(void)
{
              init_io();                                          // 初始化IO
              init_ser();                                                                        // 初始化串口
              RX_Mode();                                                                        // 設置為接收模式
              Delay(1);                                       
              while(1)
              {            
                            //------------------------
                            //調用溫濕度讀取子程序
                            RH();
                            //串口顯示程序
                            //--------------------------
                            str_1[0]=0x01;                                                        //地址位
                            str_1[1]=U8RH_data_H;
                            str_1[2]=U8RH_data_L;
                            str_1[3]=U8T_data_H;
                            str_1[4]=U8T_data_L;
                            str_1[5]=U8checkdata;
                            //讀取模塊數據周期不易小于 2S
                            Delay(20000);
                            for(h=0;h<TX_PLOAD_WIDTH;h++){
                                          TX_BUF[h] = str_1[h];          // 數據送到緩存
                            }
                            TX_Mode(TX_BUF);                                          // 把nRF24L01設置為發送模式并發送數據
                            Check_ACK(1);               // 等待發送完畢,清除TX FIFO
                            delay_ms(500);
                            RX_Mode();                                                                // 設置為接收模式
                            delay_ms(500);
                            SendData(TX_BUF);
              }
}
/**************************************************/
/**************************************************
函數:RISINTR()

描述:
    中斷函數
/**************************************************/
void RSINTR() interrupt 4 using 2
{
              if(TI==1) //發送中斷               
              {
                            TI=0;
                            if(count!=TX_PLOAD_WIDTH) //發送完TX_PLOAD_WIDTH位數據            
                            {
                                          SBUF= outdata[count];
                                          count++;
                            }
              }
}
(2)采集點2程序;
#include <reg51.h>
#include <intrins.h>
#include <api.h>

#define uchar unsigned char
#define uint unsigned int

/***************************************************/
#define TX_ADR_WIDTH   5  // 5字節寬度的發送/接收地址
#define TX_PLOAD_WIDTH 6  // 數據通道有效數據寬度


uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0xC2,0xC2,0xC2,0xC2,0xC2};  // 定義一個靜態發送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar flag;
uchar str_1[TX_PLOAD_WIDTH]="BZainm",outdata[TX_PLOAD_WIDTH];
uchar bdata sta;
int                count,h;
uchar U8FLAG,k;
uchar U8count,U8temp;
uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar U8comdata;
uint  U16temp1,U16temp2;
sbit  RX_DR              = sta^6;
sbit  TX_DS              = sta^5;
sbit  MAX_RT = sta^4;
sbit  P2_3  = P2^3 ;                                                        //DHT11信號
/**************************************************/

/**************************************************
函數: init_io()

描述:
    初始化IO
/**************************************************/
void init_io(void)
{
              CE  = 0;        // 待機
              CSN = 1;        // SPI禁止
              SCK = 0;        // SPI時鐘置低
              IRQ = 1;        // 中斷復位
              //LED = 0xff;                            // 關閉指示燈
}
/**************************************************/
/**************************************************
函數: init_ser()

描述:
    初始化串口
/**************************************************/
void init_ser(){
              TMOD = 0x20;                //定時器T1使用工作方式2
              TH1 = 253;        // 設置初值
              TL1 = 253;
              TR1 = 1;          // 開始計時
              SCON = 0x50;                //工作方式1,波特率9600bps,允許接收  
              ES = 1;
              EA = 1;           // 打開所以中斷  
              TI = 0;
              RI = 0;
}
/**************************************************
函數:delay_ms()

描述:
    延遲x毫秒
/**************************************************/
void delay_ms(uchar x)
{
    uchar i, j;
    i = 0;
    for(i=0; i<x; i++)
    {
       j = 250;
       while(--j);
                 j = 250;
       while(--j);
    }
}
/**************************************************/

/**************************************************
函數:SPI_RW()

描述:
    根據SPI協議,寫一字節數據到nRF24L01,同時從nRF24L01
              讀出一字節
/**************************************************/
uchar SPI_RW(uchar byte)
{
              uchar i;
                 for(i=0; i<8; i++)          // 循環8次
                 {
                               MOSI = (byte & 0x80);   // byte最高位輸出到MOSI
                               byte <<= 1;             // 低一位移位到最高位
                               SCK = 1;                // 拉高SCK,nRF24L01從MOSI讀入1位數據,同時從MISO輸出1位數據
                               byte |= MISO;                     // 讀MISO到byte最低位
                               SCK = 0;                          // SCK置低
                 }
    return(byte);                         // 返回讀出的一字節
}
/**************************************************/

/**************************************************
函數:SPI_RW_Reg()

描述:
    寫數據value到reg寄存器
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
              uchar status;
                CSN = 0;                   // CSN置低,開始傳輸數據
                status = SPI_RW(reg);      // 選擇寄存器,同時返回狀態字
                SPI_RW(value);             // 然后寫數據到該寄存器
                CSN = 1;                   // CSN拉高,結束數據傳輸
                return(status);            // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:SPI_Read()

描述:
    從reg寄存器讀一字節
/**************************************************/
uchar SPI_Read(uchar reg)
{
              uchar reg_val;
                CSN = 0;                    // CSN置低,開始傳輸數據
                SPI_RW(reg);                // 選擇寄存器
                reg_val = SPI_RW(0);        // 然后從該寄存器讀數據
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(reg_val);            // 返回寄存器數據
}
/**************************************************/

/**************************************************
函數:SPI_Read_Buf()

描述:
    從reg寄存器讀出bytes個字節,通常用來讀取接收通道
              數據或接收/發送地址
/**************************************************/
uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
              uchar status, i;
                CSN = 0;                    // CSN置低,開始傳輸數據
                status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
                for(i=0; i<bytes; i++)
                  pBuf[ i] = SPI_RW(0);    // 逐個字節從nRF24L01讀出
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(status);             // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:SPI_Write_Buf()

描述:
    把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發
              射通道數據或接收/發送地址
/**************************************************/
uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
              uchar status, i;
                CSN = 0;                    // CSN置低,開始傳輸數據
                status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
                for(i=0; i<bytes; i++)
                  SPI_RW(pBuf[ i]);        // 逐個字節寫入nRF24L01
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(status);             // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:RX_Mode()

描述:
    這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包
/**************************************************/
void RX_Mode(void)
{
              CE = 0;
                SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, TX_ADDRESS, TX_ADR_WIDTH);  // 接收設備接收通道0使用和發送設備相同的發送地址
                SPI_RW_Reg(WRITE_REG + EN_AA, 0x02);               // 使能接收通道1自動應答
                SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x02);           // 使能接收通道1
                SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 選擇射頻通道0x40
                SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0選擇和發送通道相同有效數據寬度
                SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
                SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校驗,上電,接收模式
                CE = 1;                                            // 拉高CE啟動接收設備
}
/**************************************************/

/**************************************************
函數:TX_Mode()

描述:
    這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),
              130us后啟動發射,數據發送結束后,發送模塊自動轉入接收
              模式等待應答信號。
/**************************************************/
void TX_Mode(uchar * BUF)
{
              CE = 0;
                SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 寫入發送地址
                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 為了應答接收設備,接收通道0地址和發送地址相同
                SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                  // 寫數據包到TX FIFO
                SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道1自動應答
                SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道1
                SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自動重發延時等待250us+86us,自動重發10次
                SPI_RW_Reg(WRITE_REG + RF_CH, 40);         // 選擇射頻通道0x40
                SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
                SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校驗,上電
              CE = 1;
}
/**************************************************/

/**************************************************
函數:SendData(uchar *a)

描述:
    串口發送數據
/**************************************************/
SendData(uchar a[TX_PLOAD_WIDTH])
{              int i;
              for(i=0;i<TX_PLOAD_WIDTH;i++){
              outdata[ i] = a[ i];
              }
              count = 1;
              SBUF=outdata[0];
}
/**************************************************/

/**************************************************
函數:Check_ACK()

描述:
    檢查接收設備有無接收到數據包,設定沒有收到應答信
              號是否重發
/**************************************************/
uchar Check_ACK(bit clear)
{
              while(IRQ);
              sta = SPI_RW(NOP);                    // 返回狀態寄存器
              if(MAX_RT)
                            if(clear)                         // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
                                          SPI_RW(FLUSH_TX);
              SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中斷標志
              IRQ = 1;
              if(TX_DS)
                            return(0x00);
              else
                            return(0xff);
}
/**************************************************/

/**************************************************/
//DHT11部分


//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//

void Delay(uint j)
{              uchar i;
              for(;j>0;j--)
              {              
              for(i=0;i<27;i++);

              }
}
void  Delay_10us(void)
{
              uchar i;
    i--;
    i--;
    i--;
    i--;
    i--;
    i--;
}
void  COM(void)
{

              uchar i;

    for(i=0;i<8;i++)               
              {
                           
                            U8FLAG=2;            
                               while((!P2_3)&&U8FLAG++);
                            Delay_10us();
                            Delay_10us();
                            Delay_10us();
                              U8temp=0;
                  if(P2_3)U8temp=1;
                            U8FLAG=2;
                            while((P2_3)&&U8FLAG++);
                               //超時則跳出for循環                             
                               if(U8FLAG==1)break;
                               //判斷數據位是0還是1            
                            // 如果高電平高過預定0高電平值則數據位為 1
                            U8comdata<<=1;
                               U8comdata|=U8temp;        //0
                  }//rof
               
}

              //--------------------------------
              //-----濕度讀取子程序 ------------
              //--------------------------------
              //----以下變量均為全局變量--------
              //----溫度高8位== U8T_data_H------
              //----溫度低8位== U8T_data_L------
              //----濕度高8位== U8RH_data_H-----
              //----濕度低8位== U8RH_data_L-----
              //----校驗 8位 == U8checkdata-----
              //----調用相關子程序如下----------
              //---- Delay();, Delay_10us();,COM();
              //--------------------------------

void RH(void)
{
                //主機拉低18ms
              P2_3=0;
              Delay(180);
              P2_3=1;
              //總線由上拉電阻拉高 主機延時20us
              Delay_10us();
              Delay_10us();
              Delay_10us();
              Delay_10us();
              //主機設為輸入 判斷從機響應信號
              P2_3=1;
              //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行               
              if(!P2_3)                            //T !               
              {
                            U8FLAG=2;
                            //判斷從機是否發出 80us 的低電平響應信號是否結束            
                            while((!P2_3)&&U8FLAG++);
                            U8FLAG=2;
                            //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
                            while((P2_3)&&U8FLAG++);
                            //數據接收狀態                           
                            COM();
                            U8RH_data_H_temp=U8comdata;
                            COM();
                            U8RH_data_L_temp=U8comdata;
                            COM();
                            U8T_data_H_temp=U8comdata;
                            COM();
                            U8T_data_L_temp=U8comdata;
                            COM();
                            U8checkdata_temp=U8comdata;
                            P2_3=1;
                            //數據校驗
                            U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                            if(U8temp==U8checkdata_temp)
                            {
                            U8RH_data_H=U8RH_data_H_temp;
                            U8RH_data_L=U8RH_data_L_temp;
                            U8T_data_H=U8T_data_H_temp;
                            U8T_data_L=U8T_data_L_temp;
                            U8checkdata=U8checkdata_temp;
                            }//fi
              }//fi

}

/**************************************************
函數:main()

描述:
    主函數
/**************************************************/
void main(void)
{
              init_io();                                          // 初始化IO
              init_ser();                                                                        // 初始化串口
              RX_Mode();                                                                        // 設置為接收模式
              Delay(1);                                       
              while(1)
              {            
                            //------------------------
                            //調用溫濕度讀取子程序
                            RH();
                            //串口顯示程序
                            //--------------------------
                            str_1[0]=0x02;
                            str_1[1]=U8RH_data_H;
                            str_1[2]=U8RH_data_L;
                            str_1[3]=U8T_data_H;
                            str_1[4]=U8T_data_L;
                            str_1[5]=U8checkdata;
                            //讀取模塊數據周期不易小于 2S
                            Delay(20000);
                            for(h=0;h<TX_PLOAD_WIDTH;h++){
                                          TX_BUF[h] = str_1[h];          // 數據送到緩存
                            }
                            TX_Mode(TX_BUF);                                          // 把nRF24L01設置為發送模式并發送數據
                            Check_ACK(1);               // 等待發送完畢,清除TX FIFO
                            delay_ms(500);
                            RX_Mode();                                                                // 設置為接收模式
                            delay_ms(500);
                            SendData(TX_BUF);
              }
}
/**************************************************/
/**************************************************
函數:RISINTR()

描述:
    中斷函數
/**************************************************/
void RSINTR() interrupt 4 using 2
{
              if(TI==1) //發送中斷               
              {
                            TI=0;
                            if(count!=TX_PLOAD_WIDTH) //發送完TX_PLOAD_WIDTH位數據            
                            {
                                          SBUF= outdata[count];
                                          count++;
                            }
              }
}
(3)接收點程序
#include <reg51.h>
#include <api.h>

#define uchar unsigned char

/***************************************************/
#define TX_ADR_WIDTH   5  // 5字節寬度的發送/接收地址
#define TX_PLOAD_WIDTH 6  // 數據通道有效數據寬度

uchar code TX_ADDRESS_0[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定義一個靜態發送地址
uchar code TX_ADDRESS_1[TX_ADR_WIDTH] = {0xC2,0xC2,0xC2,0xC2,0xC2};  // 定義一個靜態發送地址
uchar RX_BUF_0[TX_PLOAD_WIDTH];//0通道數據
uchar RX_BUF_1[TX_PLOAD_WIDTH];//1通道數據
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar flag;
uchar str[TX_PLOAD_WIDTH],outdata[TX_PLOAD_WIDTH];
uchar bdata sta;
int                count,n;
sbit  RX_P_NO1=sta^1;
sbit  RX_P_NO2=sta^2;
sbit  RX_P_NO3=sta^3;
sbit  MAX_RT = sta^4;
sbit  TX_DS              = sta^5;
sbit  RX_DR              = sta^6;

/**************************************************/

/**************************************************
函數: init_io()

描述:
    初始化IO
/**************************************************/
void init_io(void)
{
              CE  = 0;        // 待機
              CSN = 1;        // SPI禁止
              SCK = 0;        // SPI時鐘置低
              IRQ = 1;        // 中斷復位
              //LED = 0xff;                            // 關閉指示燈
}
/**************************************************/
/**************************************************
函數: init_ser()

描述:
    初始化串口
/**************************************************/
void init_ser(){
              TMOD = 0x20;                //定時器T1使用工作方式2
              TH1 = 253;        // 設置初值
              TL1 = 253;
              TR1 = 1;          // 開始計時
              SCON = 0x50;                //工作方式1,波特率9600bps,允許接收  
              ES = 1;
              EA = 1;           // 打開所以中斷  
              TI = 0;
              RI = 0;
}
/**************************************************
函數:delay_ms()

描述:
    延遲x毫秒
/**************************************************/
void delay_ms(uchar x)
{
    uchar i, j;
    i = 0;
    for(i=0; i<x; i++)
    {
       j = 250;
       while(--j);
                 j = 250;
       while(--j);
    }
}
/**************************************************/

/**************************************************
函數:SPI_RW()

描述:
    根據SPI協議,寫一字節數據到nRF24L01,同時從nRF24L01
              讀出一字節
/**************************************************/
uchar SPI_RW(uchar byte)
{
              uchar i;
                 for(i=0; i<8; i++)          // 循環8次
                 {
                               MOSI = (byte & 0x80);   // byte最高位輸出到MOSI
                               byte <<= 1;             // 低一位移位到最高位
                               SCK = 1;                // 拉高SCK,nRF24L01從MOSI讀入1位數據,同時從MISO輸出1位數據
                               byte |= MISO;                     // 讀MISO到byte最低位
                               SCK = 0;                          // SCK置低
                 }
    return(byte);                         // 返回讀出的一字節
}
/**************************************************/

/**************************************************
函數:SPI_RW_Reg()

描述:
    寫數據value到reg寄存器
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
              uchar status;
                CSN = 0;                   // CSN置低,開始傳輸數據
                status = SPI_RW(reg);      // 選擇寄存器,同時返回狀態字
                SPI_RW(value);             // 然后寫數據到該寄存器
                CSN = 1;                   // CSN拉高,結束數據傳輸
                return(status);            // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:SPI_Read()

描述:
    從reg寄存器讀一字節
/**************************************************/
uchar SPI_Read(uchar reg)
{
              uchar reg_val;
                CSN = 0;                    // CSN置低,開始傳輸數據
                SPI_RW(reg);                // 選擇寄存器
                reg_val = SPI_RW(0);        // 然后從該寄存器讀數據
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(reg_val);            // 返回寄存器數據
}
/**************************************************/

/**************************************************
函數:SPI_Read_Buf()

描述:
    從reg寄存器讀出bytes個字節,通常用來讀取接收通道
              數據或接收/發送地址
/**************************************************/
uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
              uchar status, i;
                CSN = 0;                    // CSN置低,開始傳輸數據
                status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
                for(i=0; i<bytes; i++)
                  pBuf[ i] = SPI_RW(0);    // 逐個字節從nRF24L01讀出
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(status);             // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:SPI_Write_Buf()

描述:
    把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發
              射通道數據或接收/發送地址
/**************************************************/
uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
              uchar status, i;
                CSN = 0;                    // CSN置低,開始傳輸數據
                status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
                for(i=0; i<bytes; i++)
                  SPI_RW(pBuf[ i]);        // 逐個字節寫入nRF24L01
                CSN = 1;                    // CSN拉高,結束數據傳輸
                return(status);             // 返回狀態寄存器
}
/**************************************************/

/**************************************************
函數:RX_Mode()

描述:
    這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包
/**************************************************/
void RX_Mode_0(void)
{
              CE = 0;
                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS_0, TX_ADR_WIDTH);  // 接收設備接收通道0使用和發送設備相同的發送地址
                SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);               // 使能接收通道0自動應答
                SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0
                SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 選擇射頻通道0x40
                SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0選擇和發送通道相同有效數據寬度
                SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
                SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校驗,上電,接收模式
                CE = 1;                                            // 拉高CE啟動接收設備
}
/**************************************************/
/**************************************************
函數:RX_Mode()

描述:
    這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包
/**************************************************/
void RX_Mode_1(void)
{
              CE = 0;
                SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, TX_ADDRESS_1, TX_ADR_WIDTH);  // 接收設備接收通道0使用和發送設備相同的發送地址
                SPI_RW_Reg(WRITE_REG + EN_AA, 0x02);               // 使能接收通道0自動應答
                SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x02);           // 使能接收通道0
                SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 選擇射頻通道0x40
                SPI_RW_Reg(WRITE_REG + RX_PW_P1, TX_PLOAD_WIDTH);  // 接收通道0選擇和發送通道相同有效數據寬度
                SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
                SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校驗,上電,接收模式
                CE = 1;                                            // 拉高CE啟動接收設備
}
/**************************************************/

/**************************************************
函數:TX_Mode()

描述:
    這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),
              130us后啟動發射,數據發送結束后,發送模塊自動轉入接收
              模式等待應答信號。
/**************************************************/
/*void TX_Mode(uchar * BUF)
{
              CE = 0;
                SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 寫入發送地址
                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 為了應答接收設備,接收通道0地址和發送地址相同
                SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                  // 寫數據包到TX FIFO
                SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道0自動應答
                SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0
                SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自動重發延時等待250us+86us,自動重發10次
                SPI_RW_Reg(WRITE_REG + RF_CH, 40);         // 選擇射頻通道0x40
                SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
                SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校驗,上電
              CE = 1;
}*/
/**************************************************/

/**************************************************
函數:SendData(uchar *a)

描述:
    串口發送數據
/**************************************************/
SendData(uchar a[TX_PLOAD_WIDTH])
{              int i;
              for(i=0;i<TX_PLOAD_WIDTH;i++){
              outdata[ i] = a[ i];
              }
              count = 1;
              SBUF=outdata[0];
}
/**************************************************/

/**************************************************
函數:Check_ACK()

描述:
    檢查接收設備有無接收到數據包,設定沒有收到應答信
              號是否重發
/**************************************************/
uchar Check_ACK(bit clear)
{
              while(IRQ);
              sta = SPI_RW(NOP);                    // 返回狀態寄存器
              if(MAX_RT)
                            if(clear)                         // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
                                          SPI_RW(FLUSH_TX);
              SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中斷標志
              IRQ = 1;
              if(TX_DS)
                            return(0x00);
              else
                            return(0xff);
}
/**************************************************/

/**************************************************
函數:main()

描述:
    主函數
/**************************************************/
void main(void)
{
              init_io();                                          // 初始化IO
              init_ser();                                                                        // 初始化串口
              RX_Mode_0();                            // 設置為接收模式
              while(1)
              {            
                            RX_Mode_0();                                             //通道0
                            sta = SPI_Read(STATUS);                // 讀狀態寄存器
                            if(RX_DR)                                                          // 判斷是否接受到數據
                            {
                                          SPI_Read_Buf(RD_RX_PLOAD, RX_BUF_0, TX_PLOAD_WIDTH);  // 從RX FIFO讀出數據
                                          flag = 1;
                            }
                            SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中斷標志
                            if(flag)                                       // 接受完成
                            {
                                          flag = 0;                                   // 清標志
                                          delay_ms(250);
                                          delay_ms(250);
                            }
                            delay_ms(2500);
                            SendData(RX_BUF_0);
                            delay_ms(5000);
                            RX_Mode_1();                                            // 通道1
                            sta = SPI_Read(STATUS);                // 讀狀態寄存器
                            if(RX_DR)                                                          // 判斷是否接受到數據
                            {
                                          SPI_Read_Buf(RD_RX_PLOAD, RX_BUF_1, TX_PLOAD_WIDTH);  // 從RX FIFO讀出數據
                                          flag = 1;
                            }
                            SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中斷標志
                            if(flag)                                       // 接受完成
                            {
                                          flag = 0;                                   // 清標志
                                          delay_ms(250);
                                          delay_ms(250);
                            }
                            delay_ms(5000);
                            SendData(RX_BUF_1);
              }
}
/**************************************************/
/**************************************************
函數:RISINTR()

描述:
    中斷函數
/**************************************************/
void RSINTR() interrupt 4 using 2
{
              if(TI==1) //發送中斷               
              {
                            TI=0;
                            if(count!=TX_PLOAD_WIDTH) //發送完TX_PLOAD_WIDTH位數據            
                            {
                                          SBUF= outdata[count];
                                          count++;
                            }
              }
}

  • 實驗成果

串口截圖(01為采集點1地址位,02為采集點2地址位)
溫濕度顯示為濕度整數位,濕度小數位,溫度整數位,溫度小數位,校驗位,串口為16進制顯示
事物圖片
接收點:
采集點1
采集點2
整體圖片:
  • 參考資料
1、訊通                            《2.4GHz 單片高速2Mbps 無線收發芯片 nRF24L01》;
2、深圳云佳科技有限公司              《NRF24L01高速嵌入式無線數傳模塊說明書》。


完整的Word格式文檔51黑下載地址:
基于DHT11溫濕度傳感器和nrf24l01模塊的多點數據采集.docx (2.77 MB, 下載次數: 60)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:427220 發表于 2018-11-21 09:53 | 只看該作者
你好,請問你使用的晶振頻率是多大的,我看到NRF的手冊的晶振頻率是16MHz的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲在线 | 日本久久网 | 精精国产xxxx视频在线播放7 | 久久精品国产亚洲一区二区三区 | 久久成人精品视频 | 99精品99久久久久久宅男 | 蜜桃视频在线观看免费视频网站www | 久热国产在线 | 精品视频999 | 一区二区三区精品视频 | 中文字幕蜜臀av | 91久久| 日韩不卡在线 | 天堂色区 | 国产偷录视频叫床高潮对白 | 中文字幕日韩三级 | 欧美日韩中文字幕在线播放 | 成人在线免费视频观看 | 欧美自拍另类 | 成人在线观看黄 | 久久精品中文字幕 | 激情一区| 国产一区二区精品在线观看 | 91九色视频 | 亚洲精品久久久久久久久久久久久 | 亚洲精品二区 | 日韩精品国产精品 | 久久手机视频 | 亚洲最新网址 | 日韩精品在线观看一区二区三区 | 久久伊人在| 毛片在线免费 | av在线影院 | 色资源在线视频 | 国产精品一二区 | 女人夜夜春 | 精品久久国产 | 久久综合久色欧美综合狠狠 | 一区二区三区四区电影视频在线观看 | 国产黄色免费网站 | 6080亚洲精品一区二区 |