|
通過NRF24L01接受來自遙控器端的操控
單片機(jī)源程序如下:
- /**********************************************************/
- /* 名 稱:NRF24L01+無線USB通信模塊程序 */
- /* 功 能:發(fā)送接收測試程序 */
- #include<stc15f2k60s2.h>
- #include<intrins.h>
- typedef unsigned char uchar;
- typedef unsigned char uint;
- /********** NRF24L01寄存器操作命令 ***********/
- #define READ_REG 0x00 //讀配置寄存器,低5位為寄存器地址
- #define WRITE_REG 0x20 //寫配置寄存器,低5位為寄存器地址
- #define RD_RX_PLOAD 0x61 //讀RX有效數(shù)據(jù),1~32字節(jié)
- #define WR_TX_PLOAD 0xA0 //寫TX有效數(shù)據(jù),1~32字節(jié)
- #define FLUSH_TX 0xE1 //清除TX FIFO寄存器.發(fā)射模式下用
- #define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用
- #define REUSE_TX_PL 0xE3 //重新使用上一包數(shù)據(jù),CE為高,數(shù)據(jù)包被不斷發(fā)送.
- #define NOP 0xFF //空操作,可以用來讀狀態(tài)寄存器
- /********** NRF24L01寄存器地址 *************/
- #define CONFIG 0x00 //配置寄存器地址
- #define EN_AA 0x01 //使能自動(dòng)應(yīng)答功能
- #define EN_RXADDR 0x02 //接收地址允許
- #define SETUP_AW 0x03 //設(shè)置地址寬度(所有數(shù)據(jù)通道)
- #define SETUP_RETR 0x04 //建立自動(dòng)重發(fā)
- #define RF_CH 0x05 //RF通道
- #define RF_SETUP 0x06 //RF寄存器
- #define STATUS 0x07 //狀態(tài)寄存器
- #define OBSERVE_TX 0x08 // 發(fā)送檢測寄存器
- #define CD 0x09 // 載波檢測寄存器
- #define RX_ADDR_P0 0x0A // 數(shù)據(jù)通道0接收地址
- #define RX_ADDR_P1 0x0B // 數(shù)據(jù)通道1接收地址
- #define RX_ADDR_P2 0x0C // 數(shù)據(jù)通道2接收地址
- #define RX_ADDR_P3 0x0D // 數(shù)據(jù)通道3接收地址
- #define RX_ADDR_P4 0x0E // 數(shù)據(jù)通道4接收地址
- #define RX_ADDR_P5 0x0F // 數(shù)據(jù)通道5接收地址
- #define TX_ADDR 0x10 // 發(fā)送地址寄存器
- #define RX_PW_P0 0x11 // 接收數(shù)據(jù)通道0有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P1 0x12 // 接收數(shù)據(jù)通道1有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P2 0x13 // 接收數(shù)據(jù)通道2有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P3 0x14 // 接收數(shù)據(jù)通道3有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P4 0x15 // 接收數(shù)據(jù)通道4有效數(shù)據(jù)寬度(1~32字節(jié))
- #define RX_PW_P5 0x16 // 接收數(shù)據(jù)通道5有效數(shù)據(jù)寬度(1~32字節(jié))
- #define FIFO_STATUS 0x17 // FIFO狀態(tài)寄存器
- /****** STATUS寄存器bit位定義 *******/
- #define MAX_TX 0x10 //達(dá)到最大發(fā)送次數(shù)中斷
- #define TX_OK 0x20 //TX發(fā)送完成中斷
- #define RX_OK 0x40 //接收到數(shù)據(jù)中斷
- /********* 24L01發(fā)送接收數(shù)據(jù)寬度定義 ***********/
- #define TX_ADR_WIDTH 5 //5字節(jié)地址寬度
- #define RX_ADR_WIDTH 5 //5字節(jié)地址寬度
- #define TX_PLOAD_WIDTH 32 //32字節(jié)有效數(shù)據(jù)寬度
- #define RX_PLOAD_WIDTH 32 //32字節(jié)有效數(shù)據(jù)寬度
- const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //發(fā)送地址
- const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //發(fā)送地址
- sbit NRF_CE = P3^2;
- sbit NRF_CSN = P1^2;
- sbit NRF_MISO = P1^4;
- sbit NRF_MOSI = P1^3;
- sbit NRF_SCK = P1^5;
- sbit NRF_IRQ = P3^3;
- sbit IN1 = P1^1; // 0 后退
- sbit IN2 = P1^0; // 0 前進(jìn)
- sbit IN3 = P3^7; // 0 右轉(zhuǎn)
- sbit IN4 = P3^6; // 0 左轉(zhuǎn)
- uchar rece_buf[32];
- void delay_150us()
- {
- uint i;
- for(i=0;i>150;i++);
- }
- /***************************************************************/
- /*******************************************************************/
- uchar SPI_RW(uchar byte)
- {
- uchar bit_ctr;
- for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 輸出8位
- {
- NRF_MOSI=(byte&0x80); // MSB TO MOSI
- byte=(byte<<1); // shift next bit to MSB
- NRF_SCK=1;
- byte|=NRF_MISO; // capture current MISO bit
- NRF_SCK=0;
- }
- return byte;
- }
- /*********************************************/
- /* 函數(shù)功能:給24L01的寄存器寫值(一個(gè)字節(jié)) */
- /* 入口參數(shù):reg 要寫的寄存器地址 */
- /* value 給寄存器寫的值 */
- /* 出口參數(shù):status 狀態(tài)值 */
- /*********************************************/
- uchar NRF24L01_Write_Reg(uchar reg,uchar value)
- {
- uchar status;
- NRF_CSN=0; //CSN=0;
- status = SPI_RW(reg); //發(fā)送寄存器地址,并讀取狀態(tài)值
- SPI_RW(value);
- NRF_CSN=1; //CSN=1;
- return status;
- }
- /*************************************************/
- /* 函數(shù)功能:讀24L01的寄存器值 (一個(gè)字節(jié)) */
- /* 入口參數(shù):reg 要讀的寄存器地址 */
- /* 出口參數(shù):value 讀出寄存器的值 */
- /*************************************************/
- uchar NRF24L01_Read_Reg(uchar reg)
- {
- uchar value;
- NRF_CSN=0; //CSN=0;
- SPI_RW(reg); //發(fā)送寄存器值(位置),并讀取狀態(tài)值
- value = SPI_RW(NOP);
- NRF_CSN=1; //CSN=1;
- return value;
- }
- /*********************************************/
- /* 函數(shù)功能:讀24L01的寄存器值(多個(gè)字節(jié)) */
- /* 入口參數(shù):reg 寄存器地址 */
- /* *pBuf 讀出寄存器值的存放數(shù)組 */
- /* len 數(shù)組字節(jié)長度 */
- /* 出口參數(shù):status 狀態(tài)值 */
- /*********************************************/
- uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
- {
- uchar status,u8_ctr;
- NRF_CSN=0; //CSN=0
- status=SPI_RW(reg); //發(fā)送寄存器地址,并讀取狀態(tài)值
- for(u8_ctr=0;u8_ctr<len;u8_ctr++)
- pBuf[u8_ctr]=SPI_RW(0XFF); //讀出數(shù)據(jù)
- NRF_CSN=1; //CSN=1
- return status; //返回讀到的狀態(tài)值
- }
- /**********************************************/
- /* 函數(shù)功能:給24L01的寄存器寫值(多個(gè)字節(jié)) */
- /* 入口參數(shù):reg 要寫的寄存器地址 */
- /* *pBuf 值的存放數(shù)組 */
- /* len 數(shù)組字節(jié)長度 */
- /**********************************************/
- uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
- {
- uchar status,u8_ctr;
- NRF_CSN=0;
- status = SPI_RW(reg); //發(fā)送寄存器值(位置),并讀取狀態(tài)值
- for(u8_ctr=0; u8_ctr<len; u8_ctr++)
- SPI_RW(*pBuf++); //寫入數(shù)據(jù)
- NRF_CSN=1;
- return status; //返回讀到的狀態(tài)值
- }
- /*********************************************/
- /* 函數(shù)功能:24L01接收數(shù)據(jù) */
- /* 入口參數(shù):rxbuf 接收數(shù)據(jù)數(shù)組 */
- /* 返回值: 0 成功收到數(shù)據(jù) */
- /* 1 沒有收到數(shù)據(jù) */
- /*********************************************/
- uchar NRF24L01_RxPacket(uchar *rxbuf)
- {
- uchar state;
-
- state=NRF24L01_Read_Reg(STATUS); //讀取狀態(tài)寄存器的值
- NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中斷標(biāo)志
- if(state&RX_OK) //接收到數(shù)據(jù)
- {
- NRF_CE = 0;
- NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//讀取數(shù)據(jù)
- NRF24L01_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO寄存器
- NRF_CE = 1;
- delay_150us();
- return 0;
- }
- return 1;//沒收到任何數(shù)據(jù)
- }
- /********************************************/
- /* 函數(shù)功能:檢測24L01是否存在 */
- /* 返回值; 0 存在 */
- /* 1 不存在 */
- /********************************************/
- uchar NRF24L01_Check(void)
- {
- uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
- uchar check_out_buf[5]={0x00};
- NRF_SCK=0;
- NRF_CSN=1;
- NRF_CE=0;
- NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);
- NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
- if((check_out_buf[0] == 0x11)&&\
- (check_out_buf[1] == 0x22)&&\
- (check_out_buf[2] == 0x33)&&\
- (check_out_buf[3] == 0x44)&&\
- (check_out_buf[4] == 0x55))return 0;
- else return 1;
- }
- void NRF24L01_RT_Init(void)
- {
- NRF_CE=0;
- NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數(shù)據(jù)寬度
- NRF24L01_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO寄存器
- NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節(jié)點(diǎn)地址
- NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //設(shè)置TX節(jié)點(diǎn)地址,主要為了使能ACK
- NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01); //使能通道0的自動(dòng)應(yīng)答
- NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
- NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//設(shè)置自動(dòng)重發(fā)間隔時(shí)間:500us + 86us;最大自動(dòng)重發(fā)次數(shù):10次
- NRF24L01_Write_Reg(WRITE_REG+RF_CH,0); //設(shè)置RF通道為2.400GHz 頻率=2.4+0GHz
- NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0F); //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開啟
- NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f); //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
- NRF_CE=1; //CE置高,使能發(fā)送
- }
- void main()
- {
- // P3M0=0X00;
- // P3M1=0X00;
- // P5M0=0X00;
- // P5M1=0X00;
- while(NRF24L01_Check()); // 等待檢測到NRF24L01,程序才會(huì)向下執(zhí)行
- NRF24L01_RT_Init();
- //LED=1;
- while(1)
- {
- if(NRF24L01_RxPacket(rece_buf)==0)
- {
- // LED = 0;
- switch(rece_buf[1])
- {
- case 'G':
- IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 1; //前進(jìn)
- break;
-
- case 'S':
- IN1 = 1; IN2 = 1; IN3 = 1; IN4 = 1; //停止
- break;
-
- case 'B':
- IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 1; //后退
- break;
-
- case 'L':
- IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; //前進(jìn)左
- break;
-
- case 'R':
- IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; //前進(jìn)右
- break;
-
- case 'Q':
- IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0; //后退左
- break;
-
- case 'W':
- IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1; //后退右
- break;
- }
- //LED=1;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
接受1-最終.zip
(40.73 KB, 下載次數(shù): 49)
2018-6-30 10:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|