本教程關于NRF24L01+的內容十分詳細,對于大家的學習和調試及其有幫助
圖片1.png (518.26 KB, 下載次數: 126)
下載附件
2018-9-23 17:30 上傳
內含詳細教程:
0.png (321.82 KB, 下載次數: 116)
下載附件
2018-9-24 03:08 上傳
0.png (273.05 KB, 下載次數: 126)
下載附件
2018-9-24 03:09 上傳
0.png (398.11 KB, 下載次數: 89)
下載附件
2018-9-24 03:09 上傳
0.png (480.81 KB, 下載次數: 106)
下載附件
2018-9-24 03:09 上傳
0.jpg (75.08 KB, 下載次數: 121)
下載附件
2018-9-24 03:10 上傳
單片機源程序如下:
- 接下來我們寫發送程序:
- //**********************************
- // NRF24L01+模塊發射程序
- // 用8個LED調試
- // Txz001 2012.05.16
- //**********************************
- #include <reg52.h>
- typedef unsigned char uchar; //將無符號字節類型重定義為uchar
- typedef unsigned int uint; //將無符號整數類型重定義為Uint
- //*********************NRF24L01函數定義****************************
- void delayms(uint t);//毫秒延時
- void init_NRF24L01(void); //模塊初始化函數
- uchar SPI_RW(uchar reg); //基本SPI讀寫時序
- uchar SPI_Read(uchar reg); //從寄存器reg讀一個字節
- void SetRX_Mode(void); //設置接收模式
- uchar SPI_RW_Reg(uchar reg, uchar value); //向寄存器寫一個字節
- uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); // 從緩沖器讀出uchars字節的數據
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //向緩沖器寫進uchars字節的數據
- void nRF24L01_TxPacket(uchar * tx_buf); //啟動一次發送
- uchar nRF24L01_RxPacket(uchar * rx_buf);//讀取接收的數據,放入rx_buf數組
- //***********NRF24L01模塊IO端口定義******************
- sbit CE=P1^0;
- sbit CSN =P1^1;
- sbit SCK =P1^2;
- sbit MOSI =P1^3;
- sbit MISO =P1^4;
- sbit IRQ =P1^5;
- //*****************NRF24L01常量**********************
- #define TX_ADR_WIDTH 5 //發送地址寬度 5字節
- #define RX_ADR_WIDTH 5 //接收地址寬度 5字節
- #define TX_PLOAD_WIDTH 32 // 發送數據寬度 32字節
- #define RX_PLOAD_WIDTH 32 //接收數據的寬度 32字節
- uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x01,0x02,0x03,0x04,0x05}; //本地地址
- uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x01,0x02,0x03,0x04,0x05}; //接收地址
- //*****************NRF24L01寄存器指令*******************
- #define READ_REG 0x00 // 讀寄存器指令
- #define WRITE_REG 0x20 // 寫寄存器指令
- #define RD_RX_PLOAD 0x61 // 讀取接收數據指令
- #define WR_TX_PLOAD 0xA0 // 寫待發數據指令
- #define FLUSH_TX 0xE1 //清空發送緩沖區
- //**************SPI(nRF24L01)寄存器地址常量*****************
- #define CONFIG 0x00 // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
- #define EN_AA 0x01 // 自動應答功能設置
- #define EN_RXADDR 0x02 // 可用信道設置
- #define SETUP_AW 0x03 // 收發地址寬度設置
- #define SETUP_RETR 0x04 // 自動重發功能設置
- #define RF_CH 0x05 // 工作頻率設置
- #define RF_SETUP 0x06 // 發射速率、功耗功能設置
- #define STATUS 0x07 // 狀態寄存器
- #define OBSERVE_TX 0x08 // 發送監測功能
- #define CD 0x09 // 地址檢測
- #define RX_ADDR_P0 0x0A // 頻道0接收數據地址
- #define RX_ADDR_P1 0x0B // 頻道1接收數據地址
- #define RX_ADDR_P2 0x0C // 頻道2接收數據地址
- #define RX_ADDR_P3 0x0D // 頻道3接收數據地址
- #define RX_ADDR_P4 0x0E // 頻道4接收數據地址
- #define RX_ADDR_P5 0x0F // 頻道5接收數據地址
- #define TX_ADDR 0x10 // 發送地址寄存器
- #define RX_PW_P0 0x11 // 接收頻道0接收數據長度
- #define RX_PW_P1 0x12 // 接收頻道0接收數據長度
- #define RX_PW_P2 0x13 // 接收頻道0接收數據長度
- #define RX_PW_P3 0x14 // 接收頻道0接收數據長度
- #define RX_PW_P4 0x15 // 接收頻道0接收數據長度
- #define RX_PW_P5 0x16 // 接收頻道0接收數據長度
- #define FIFO_STATUS 0x17 // FIFO棧入棧出狀態寄存器設置
- /*****毫秒延時子程序*****/
- void delayms(uint t) //約延時t毫秒
- {
- uint i;
- while(t--)
- {
- for(i=0;i<125;i++);
- }
- }
- /**********************************************
- /*函數:uint SPI_RW(uint uchar)
- /*功能:NRF24L01的SPI寫時序
- /**********************************************/
- uchar SPI_RW(uchar uuchar)
- {
- uchar bit_ctr;
- for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 輸出8個位
- {
- MOSI = (uuchar & 0x80); //輸出uuhar的最高位
- uuchar = (uuchar << 1); //左移一位
- SCK = 1; // 將時鐘線置‘1’
- uuchar |= MISO; //同時讀取STATUS
- SCK = 0; //然后再將時鐘線置‘0’
- }
- return(uuchar); //返回讀取的值
- }
- /***********************************************
- /*函數:uchar SPI_Read(uchar reg)
- /*功能:NRF24L01的SPI讀取一個字節時序
- /***********************************************/
- uchar SPI_Read(uchar reg)
- {
- uchar reg_val;
- CSN = 0; //CSN置'0',允許指令操作
- SPI_RW(reg); //寫一條reg指令
- reg_val = SPI_RW(0); //讀取reg的值到reg_val
- CSN = 1; //CSN置'1',禁示操作
- return(reg_val); //返回讀取的值
- }
- /***********************************************
- /*功能:NRF24L01寫一個字節到寄存器函數
- /***********************************************/
- uchar SPI_RW_Reg(uchar reg, uchar value)
- {
- uchar status;
-
- CSN = 0; // CSN置'0',允許操作
- status = SPI_RW(reg); //這指令,并讀STATUS
- SPI_RW(value); //寫數據值到reg
- CSN = 1; // CSN置'1',禁止操作
- return(status); // return nRF24L01 status uchar
- }
- /*****************************************************************
- /*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
- /*功能: 用于寫數據:reg:為寄存器地址,
- /* pBuf:為待寫入數據地址,
- /* uchars:寫入數據的個數
- /*****************************************************************/
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
- {
- uchar status,uchar_ctr;
- CSN = 0; //SPI使能
- status = SPI_RW(reg);
- for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
- SPI_RW(*pBuf++);
- CSN = 1; //關閉SPI
- return(status); //
- }
- //******************************************
- /*NRF24L01初始化
- //******************************************/
- void init_NRF24L01(void)
- {
- delayms(1);
- CE=0; // 射頻停止工作
- CSN=1; // 停止寄存器讀寫
- SCK=0; //時種信號停止讀寫
- IRQ=1;//中斷復位
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 頻道0自動 ACK應答禁止
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); //禁止自動發送
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,
- SPI_RW_Reg(WRITE_REG + RF_CH, 1); // 設置信道工作為2.4GHZ,收發必須一致
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32字節
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為2MHZ,發射功率為最大值0dB
- }
- /******************************************************
- /*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
- /*功能:發送 tx_buf中數據
- /*******************************************************/
- void nRF24L01_TxPacket(unsigned char * tx_buf)
- {
- CE=0; //StandBy I模式
- 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); // 裝載接收端地址
- SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);// 裝載數據
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
- CE=1; //置高CE,激發數據發送
- delayms(1);
- }
- //************************************
- // 主函數
- //************************************
- void main()
- {
- uchar TxBuf[32];
- uchar status; //定義一個變量用來裝讀取到的STATUS數值
- init_NRF24L01();//NRF24L01初始化
- SPI_RW_Reg(WRITE_REG+STATUS,0XFF); //清狀態寄存器
- status=SPI_Read(STATUS); //讀取狀態
- P0=~status;//P0口顯示讀取的狀態
- delayms(4000);//顯示延時4秒,以便從容看清楚
- P0=0xff;//清除顯示
- delayms(600);
- TxBuf[0]=1; //我們設置個初值1在想要發送的數組的第1個里變量里。
- while(1)
- { TxBuf[0]=~TxBuf[0]; //這句把要發送的第1個變量的值取反,如果原來是1,現再就為0
- nRF24L01_TxPacket(TxBuf);//裝載數據并進行一次發送操作
- status=SPI_Read(STATUS); //發送完后再讀取狀態
- P0=~status; //顯示發送完后的狀態
- delayms(500); //顯示發送后的信息停留1秒
- P0=0xFF; //清除顯示
- delayms(500);
- }
- }
復制代碼
所有資料51hei提供下載:
51單片機應用之無線通訊模塊NRF24L01 .rar
(7.79 MB, 下載次數: 709)
2018-9-23 17:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|