




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、/許多人都在找nrf24l01無線模塊的c程序;我以前剛接觸無線/時用的就是nrf24l01模塊;搜索了許多程序有很多都沒法直接用;甚至還懷疑模塊是不是被我搞壞了;拿去讓別人檢測模塊又是好的;為避免大家走彎路;我將我的程序發(fā)出來供大家參考;這是nrf24l01無線模塊pcb圖;下面有 nrf24l01無線模塊的收發(fā)c程序; 以下程序經(jīng)本人親自測試;絕對能用! 請注意以下幾點:1、24l01模塊的電源電壓是否為3v-3.6v之間;2、如果您用的單片機是5v的話,請在io口與模塊接口之間串一個1k電阻;3、檢查模塊的gnd是否與單片機的gnd相連接4、先用程序進(jìn)行調(diào)試,如果io口不同,請更改io口
2、或相關(guān)時序;5、如果是51系列單片機,晶振請選用11.0592m hz;模塊供電最好用asm1117 5v轉(zhuǎn)3.3v 穩(wěn)壓測試單片機是 stc89c52 ;at89c52 通用; 收發(fā)一體;一大截不廢話了;上程序;此程序是按鍵控制led;當(dāng)按下s的時候?qū)?yīng)接受的led會閃閃發(fā)光;很簡單的如果要實現(xiàn)其他更先進(jìn)的功能;自己發(fā)掘吧務(wù)必將硬件連接正確;否則;它不會工作的當(dāng)然做什么都要嚴(yán)謹(jǐn)錯一點就差大了收發(fā)一體程序#include <reg52.h>#include <intrins.h>typedef unsigned char uchar;typedef unsig
3、ned char uint;/*nrf24l01端口定義*sbit miso=p13;sbit mosi=p14;sbitsck =p12;sbitce =p11;sbitcsn=p32;sbitirq=p33;/*按鍵*sbitkey=p20;/*sbitled=p21;/*nrf24l01*#define tx_adr_width 5 / 5 uints tx address width#define rx_adr_width 5 / 5 uints rx address width#define tx_pload_width 20 / 20 uints tx payload#define
4、 rx_pload_width 20 / 20 uints tx payloaduint const tx_addresstx_adr_width= 0x34,0x43,0x10,0x10,0x01;/本地地址uint const rx_addressrx_adr_width= 0x34,0x43,0x10,0x10,0x01;/接收地址/*nrf24l01寄存器指令*#define read_reg 0x00 / 讀寄存器指令#define write_reg 0x20 / 寫寄存器指令#define rd_rx_pload 0x61 / 讀取接收數(shù)據(jù)指令#define wr_tx_ploa
5、d 0xa0 / 寫待發(fā)數(shù)據(jù)指令#define flush_tx 0xe1 / 沖洗發(fā)送 fifo指令#define flush_rx 0xe2 / 沖洗接收 fifo指令#define reuse_tx_pl 0xe3 / 定義重復(fù)裝載數(shù)據(jù)指令#define nop 0xff / 保留/*spi(nrf24l01)寄存器地址*#define config 0x00 / 配置收發(fā)狀態(tài),crc校驗?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#define en_aa 0x01 / 自動應(yīng)答功能設(shè)置#define en_rxaddr 0x02 / 可用信道設(shè)置#define setup_aw 0x03 / 收發(fā)地址寬
6、度設(shè)置#define setup_retr 0x04 / 自動重發(fā)功能設(shè)置#define rf_ch 0x05 / 工作頻率設(shè)置#define rf_setup 0x06 / 發(fā)射速率、功耗功能設(shè)置#define status 0x07 / 狀態(tài)寄存器#define observe_tx 0x08 / 發(fā)送監(jiān)測功能#define cd 0x09 / 地址檢測 #define rx_addr_p0 0x0a / 頻道0接收數(shù)據(jù)地址#define rx_addr_p1 0x0b / 頻道1接收數(shù)據(jù)地址#define rx_addr_p2 0x0c / 頻道2接收數(shù)據(jù)地址#define rx_add
7、r_p3 0x0d / 頻道3接收數(shù)據(jù)地址#define rx_addr_p4 0x0e / 頻道4接收數(shù)據(jù)地址#define rx_addr_p5 0x0f / 頻道5接收數(shù)據(jù)地址#define tx_addr 0x10 / 發(fā)送地址寄存器#define rx_pw_p0 0x11 / 接收頻道0接收數(shù)據(jù)長度#define rx_pw_p1 0x12 / 接收頻道0接收數(shù)據(jù)長度#define rx_pw_p2 0x13 / 接收頻道0接收數(shù)據(jù)長度#define rx_pw_p3 0x14 / 接收頻道0接收數(shù)據(jù)長度#define rx_pw_p4 0x15 / 接收頻道0接收數(shù)據(jù)長度#def
8、ine rx_pw_p5 0x16 / 接收頻道0接收數(shù)據(jù)長度#define fifo_status 0x17 / fifo棧入棧出狀態(tài)寄存器設(shè)置/*void delay(unsigned int s);void inerdelay_us(unsigned char n);void init_nrf24l01(void);uint spi_rw(uint uchar);uchar spi_read(uchar reg);void setrx_mode(void);uint spi_rw_reg(uchar reg, uchar value);uint spi_read_buf(uchar re
9、g, uchar *pbuf, uchar uchars);uint spi_write_buf(uchar reg, uchar *pbuf, uchar uchars);unsigned char nrf24l01_rxpacket(unsigned char* rx_buf);void nrf24l01_txpacket(unsigned char * tx_buf);/*長延時*void delay(unsigned int s)unsigned int i;for(i=0; i<s; i+);for(i=0; i<s; i+);/*uint bdata sta; /狀態(tài)標(biāo)
10、志sbitrx_dr=sta6;sbittx_ds=sta5;sbitmax_rt=sta4;/*/*延時函數(shù)/*/void inerdelay_us(unsigned char n)for(;n>0;n-)_nop_();/*/*nrf24l01初始化/*/void init_nrf24l01(void) inerdelay_us(100); ce=0; / chip enable csn=1; / spi disable sck=0; / spi_write_buf(write_reg + tx_addr, tx_address, tx_adr_width); / 寫本地地址spi_
11、write_buf(write_reg + rx_addr_p0, rx_address, rx_adr_width); / 寫接收端地址spi_rw_reg(write_reg + en_aa, 0x01); / 頻道0自動ack應(yīng)答允許spi_rw_reg(write_reg + en_rxaddr, 0x01); / 允許接收地址只有頻道0,如果需要多頻道可以參考page21 spi_rw_reg(write_reg + rf_ch, 0); / 設(shè)置信道工作為2.4ghz,收發(fā)必須一致spi_rw_reg(write_reg + rx_pw_p0, rx_pload_width); /
12、設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)spi_rw_reg(write_reg + rf_setup, 0x07); /設(shè)置發(fā)射速率為1mhz,發(fā)射功率為最大值0db/*/*函數(shù):uint spi_rw(uint uchar)/*功能:nrf24l01的spi寫時序/*/uint spi_rw(uint uchar)uint bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr+) / output 8-bit mosi = (uchar & 0x80); / output 'uchar', msb to mosiuchar = (uch
13、ar << 1); / shift next bit into msb.sck = 1; / set sck high.uchar |= miso; / capture current miso bitsck = 0; / .then set sck low again return(uchar); / return read uchar/*/*函數(shù):uchar spi_read(uchar reg)/*功能:nrf24l01的spi時序/*/uchar spi_read(uchar reg)uchar reg_val;csn = 0; / csn low, initialize
14、spi communication.spi_rw(reg); / select register to read from.reg_val = spi_rw(0); / .then read registervaluecsn = 1; / csn high, terminate spi communicationreturn(reg_val); / return register value/*/*功能:nrf24l01讀寫寄存器函數(shù)/*/uint spi_rw_reg(uchar reg, uchar value)uint status;csn = 0; / csn low, init sp
15、i transactionstatus = spi_rw(reg); / select registerspi_rw(value); / .and write value to it.csn = 1; / csn high againreturn(status); / return nrf24l01 status uchar/*/*函數(shù):uint spi_read_buf(uchar reg, uchar *pbuf, uchar uchars)/*功能: 用于讀數(shù)據(jù),reg:為寄存器地址,pbuf:為待讀出數(shù)據(jù)地址,uchars:讀出數(shù)據(jù)的個數(shù)/*/uint spi_read_buf(uch
16、ar reg, uchar *pbuf, uchar uchars)uint status,uchar_ctr;csn = 0; / set csn low, init spi tranactionstatus = spi_rw(reg); / select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+)pbufuchar_ctr = spi_rw(0); / csn = 1; return(status); / return nrf24l01 status uc
17、har/*/*函數(shù):uint spi_write_buf(uchar reg, uchar *pbuf, uchar uchars)/*功能: 用于寫數(shù)據(jù):為寄存器地址,pbuf:為待寫入數(shù)據(jù)地址,uchars:寫入數(shù)據(jù)的個數(shù)/*/uint spi_write_buf(uchar reg, uchar *pbuf, uchar uchars)uint status,uchar_ctr;csn = 0; /spi使能 status = spi_rw(reg); for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr+) /spi_rw(*pbuf+);cs
18、n = 1; /關(guān)閉spireturn(status); / /*/*函數(shù):void setrx_mode(void)/*功能:數(shù)據(jù)接收配置 /*/void setrx_mode(void)ce=0;spi_rw_reg(write_reg + config, 0x0f); / irq收發(fā)完成中斷響應(yīng),16位crc,主接收ce = 1; inerdelay_us(130);/*/*函數(shù):unsigned char nrf24l01_rxpacket(unsigned char* rx_buf)/*功能:數(shù)據(jù)讀取后放如rx_buf接收緩沖區(qū)中/*/unsigned char nrf24l01_r
19、xpacket(unsigned char* rx_buf) unsigned char revale=0;sta=spi_read(status);/ 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況if(rx_dr)/ 判斷是否接收到數(shù)據(jù) ce = 0; /spi使能spi_read_buf(rd_rx_pload,rx_buf,tx_pload_width);/ read receive payload from rx_fifo bufferrevale =1;/讀取數(shù)據(jù)完成標(biāo)志spi_rw_reg(write_reg+status,sta); /接收到數(shù)據(jù)后rx_dr,tx_ds,max_pt都置高為1,通過寫1來清楚中斷標(biāo)志return revale;/*/*函數(shù):void nrf24l01_txpacket(unsigned char * tx_buf)/*功能:發(fā)送 tx_buf中數(shù)據(jù)/*/void nrf24l01_txpacket(unsigned char * tx_buf)ce=0;/standby i模式spi_write_buf(write_reg + rx_ad
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專題3.1 導(dǎo)數(shù)的概念及其意義、導(dǎo)數(shù)的運算(原卷版)-2024年高考數(shù)學(xué)一輪復(fù)習(xí)精講精練寶典(新高考專用)
- 2020-2021深圳華南中英文學(xué)校小學(xué)三年級數(shù)學(xué)下期末一模試卷及答案
- 《跨境電子商務(wù)基礎(chǔ)》高職全套教學(xué)課件
- 內(nèi)墻腳手架施工方案
- 歷史與社會人教版九年級第三單元第二課第一框《歐洲戰(zhàn)爭策源地的形成》教學(xué)設(shè)計
- 江西省景德鎮(zhèn)市2025屆中考考前最后一卷生物試卷含解析
- 安徽省宣城市培訓(xùn)校2025屆中考生物模擬預(yù)測題含解析
- 農(nóng)場員工合同范例
- 供電施工合同范例
- 企業(yè)產(chǎn)權(quán)房出租合同范例
- 數(shù)學(xué)-湖北省武漢市2025屆高中畢業(yè)生二月調(diào)研考試(武漢二調(diào))試題和解析
- 【公開課】同一直線上二力的合成+課件+2024-2025學(xué)年+人教版(2024)初中物理八年級下冊+
- (正式版)HGT 22820-2024 化工安全儀表系統(tǒng)工程設(shè)計規(guī)范
- GB/T 10752-2005船用鋼管對焊接頭
- 現(xiàn)代商業(yè)空間展示設(shè)計ppt
- 高家堡副井井筒壁座施工安全技術(shù)措施
- 《民航貨物運輸》課程標(biāo)準(zhǔn)
- 雙胎妊娠 PPT課件
- 脊髓壓迫癥A吳紹勇
- FMEA第五版表格(實例)
- 百斯巴特扒胎機MS63
評論
0/150
提交評論