- 发射
- #include "reg52.h"
- #include "string.h"
- // 宏定义
- #define uchar unsigned char
- #define uint unsigned int
- #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址
- #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度
- // LED灯及按键位定义
- sbit LED = P2^0;
- sbit KEY1 = P3^1;
- sbit KEY2 = P3^2;
- sbit BEEP = P1^5;
- 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 DATA = 0x01;
- uchar bdata sta;
- sbit RX_DR = sta^6;
- sbit TX_DS = sta^5;
- sbit MAX_RT = sta^4;
- // NRF24L01 模块引脚位定义
- sbit CE = P1^2;
- sbit CSN = P1^3;
- sbit SCK = P1^7;
- sbit MOSI= P1^1;
- sbit MISO= P1^6;
- sbit IRQ = P1^4;
- /********************** 下面的指令设置 和 寄存器地址设置 ***********************
- * ******************* 参考深圳市云佳科技有限公司给的PDF文档 ***********************
- * ******************* NRF24L01模块说明书 ***********************
- */
- /*
- SPI(nRF24L01) 指令设置
- 指令格式
- <命令字 : 由高位到低位(每字节)>
- <数据字节: 低字节到高字节,每一字节高位在前>
- */
- #define READ_REG 0x00 // Define read command to register
- #define WRITE_REG 0x20 // Define write command to register
- #define RD_RX_PLOAD 0x61 // Define RX payload register address
- #define WR_TX_PLOAD 0xA0 // Define TX payload register address
- #define FLUSH_TX 0xE1 // 清除 TX FIFO寄存器 应用于发射模式下
- #define FLUSH_RX 0xE2 // 清除 RX FIFO寄存器 应用于接收模式下。
- #define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据。 当CE=1,数据包被不断重新发射 发射过程中必须禁止数据包重利用功能
- #define NOP 0xFF // 空操作。可以用来读状态寄存器
- /*
- SPI(nRF24L01) registers(addresses)
- 一下寄存器都是默认只使用 数据通道0 不开启其他通道
- */
- #define CONFIG 0x00 // 'Config' register address
- #define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address
- #define EN_RXADDR 0x02 // 'Enabled RX addresses' register address
- #define SETUP_AW 0x03 // 'Setup address width' register address
- #define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address
- #define RF_CH 0x05 // 'RF channel' register address
- #define RF_SETUP 0x06 // 'RF setup' register address
- #define STATUS 0x07 // 'Status' register address
- #define OBSERVE_TX 0x08 // 'Observe TX' register address
- #define CD 0x09 // 'Carrier Detect' register address
- #define RX_ADDR_P0 0x0A // 'RX address pipe0' register address
- #define RX_ADDR_P1 0x0B // 'RX address pipe1' register address
- #define RX_ADDR_P2 0x0C // 'RX address pipe2' register address
- #define RX_ADDR_P3 0x0D // 'RX address pipe3' register address
- #define RX_ADDR_P4 0x0E // 'RX address pipe4' register address
- #define RX_ADDR_P5 0x0F // 'RX address pipe5' register address
- #define TX_ADDR 0x10 // 'TX address' register address
- #define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address
- #define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address
- #define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address
- #define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address
- #define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address
- #define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address
- #define FIFO_STATUS 0x17 // 'FIFO Status Register' register address
- // 毫秒级延时
- void delay_ms(uint z)
- {
- uint x, y;
- for (x = z; x > 0; x--)
- for (y = 123; y > 0; y--);
- }
- // led闪烁
- void blink(char i)
- {
- while(i--)
- {
- LED = 1;
- delay_ms(500);
- LED = 0;
- delay_ms(500);
- }
- }
- // 初始化IO
- void init_io(void)
- {
- CE = 0; // 待机
- CSN = 1; // SPI禁止
- SCK = 0; // SPI时钟置低
- IRQ = 1; // 中断复位
- LED = 1; // 关闭指示灯
- }
- /*******************************************************************
- @func : SPI_RW(uchar byte)
- @brief : 写一个字节到24L01 同时读出一个字节
- @pram : byte : 要写入24l01的字节
- @retval : 返回读取的字节
- *******************************************************************/
- uchar SPI_RW(uchar byte)
- {
- uchar bit_ctr;
- // output 8-bits
- for (bit_ctr = 0; bit_ctr < 8; bit_ctr++)
- {
- MOSI = (byte & 0x80); // output ‘byte’ MSB to MOSI
- byte = (byte << 1); // shift next bit into MSB..
- SCK = 1; // Set SCK high.. 24L01 read 1-bit from MOSI and output 1-bit to MISO
- byte |= MISO; // capture current MISO bit
- SCK = 0; // ..then set SCK low again
- }
- return (byte); // return read byte
- }
- /*******************************************************************
- @func : SPI_RW_Reg(BYTE reg, BYTE value)
- @brief : 向寄存器reg写一个字节,同时返回状态字节
- @pram : reg : 要写数据的寄存器地址
- value: 要写入寄存器的数据
- @retval : 返回状态寄存器
- @NOTE : 其他提示
- *******************************************************************/
- uchar SPI_RW_Reg(uchar reg, uchar value)
- {
- uchar status;
- CSN = 0; // CSN low, init SPI transaction, start transmitting data
- status = SPI_RW(reg); // select register and return status byte
- SPI_RW(value); // ..and write value to it..
- CSN = 1; // CSN high again, transmission end
- return(status); // return nRF24L01 status byte
- }
- /*******************************************************************
- @func : SPI_Read(uchar reg)
- @brief : 从reg寄存器读一字节
- @pram : reg : 要读取数据的寄存器地址
- @retval : 返回寄存器数据
- *******************************************************************/
- uchar SPI_Read(uchar reg)
- {
- uchar reg_val;
- CSN = 0;
- SPI_RW(reg);
- reg_val = SPI_RW(0);
- CSN = 1;
- return(reg_val);
- }
- /*******************************************************************
- @func : SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
- @brief : 从reg寄存器读 bytes 个字节 通常用来读取接收通道
- @pram : reg : 要从中读取数据的寄存器
- pBuf : 存储读取的数据
- bytes: 读取的字节数
- @retval : 返回状态寄存器
- @NOTE : 其他提示
- *******************************************************************/
- uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
- {
- uchar status,byte_ctr;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // Select register to read & return status byte
-
- for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
- pBuf[byte_ctr] = SPI_RW(0); //逐个字节从nRF24L01读出
- CSN = 1; // set CSN high, stop transaction
- return(status); // return nRF24L01 status byte
- }
- /*******************************************************************
- @func : SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
- @brief : 往reg寄存器写入 bytes 个字节 通常用来写入发射通道或接收/发送地址
- @pram : reg : 要写入数据的寄存器
- pBuf : 要写入的的数据
- bytes: 写入的字节数
- @retval : 返回状态寄存器
- @NOTE : 其他提示
- *******************************************************************/
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
- {
- uchar status,byte_ctr;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // Select register to write to & return status byte
-
- for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
- SPI_RW(*pBuf++); // 逐个字节写入nRF24L01
- CSN = 1; // Set CSN high again 结束数据传输
- return(status); // 返回状态寄存器
- }
- /*******************************************************************
- @func : RX_Mode(void)
- @brief : 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
- @pram : None
- @retval : None
- *******************************************************************/
- void RX_Mode(void)
- {
- CE = 0;
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
- SPI_RW_Reg(WRITE_REG + RF_CH, 40);
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
- delay_ms(150);
- CE = 1;
- }
- /*******************************************************************
- @func : TX_Mode(uchar * BUF)
- @brief : 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
- 130us后启动发射,数据发送结束后,发送模块自动转入接收
- 模式等待应答信号
- @pram : BUF : 要发送的数据
- @retval : None
- *******************************************************************/
- 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);
- SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);
- SPI_RW_Reg(WRITE_REG + RF_CH, 40);
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
- delay_ms(150);
- CE = 1;
- }
- /*******************************************************************
- @func : Check_ACK(bit clear)
- @brief : 检查接收设备有无接收到数据包,设定没有收到应答信号是否重发
- @pram : clear : 判断是否清楚标志位
- @retval : 返回0x00 或 0xff
- *******************************************************************/
- uchar Check_ACK(bit clear)
- {
- delay_ms(200);
- while(IRQ); // 等待数据接收完成
- sta = SPI_RW(NOP); // 返回状态寄存器
- if(TX_DS)
- {
- blink(3);
- }
- //blink(5);
- 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);
- }
- // 按键扫描
- void CheckButtons()
- {
- if(KEY1 == 0)
- {
- delay_ms(10);
- if(KEY1 == 0)
- {
- while(!KEY1);
- TX_BUF[0] = 1; // 数据送到缓存
- TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据
- Check_ACK(0); // 等待发送完毕,清除TX FIFO
- delay_ms(250);
- delay_ms(250);
- }
- }
- if(KEY2 == 0)
- {
- delay_ms(10);
- if(KEY2 == 0)
- {
- while(!KEY2);
- TX_BUF[0] = 2; // 数据送到缓存
- TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据
- Check_ACK(0); // 等待发送完毕,清除TX FIFO
- delay_ms(250);
- delay_ms(250);
- }
- }
- }
- void main(void)
- {
- init_io(); // 初始化IO
- while(1)
- {
- CheckButtons(); // 按键扫描
- }
- }
复制代码- <div>接收</div><div>#include "reg52.h"
- </div>#include "string.h"
- // 宏定义
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址
- #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度
- // LED灯及按键位定义
- sbit LED = P2^0;
- sbit KEY1 = P3^1;
- sbit KEY2 = P3^2;
- sbit BEEP = P1^5;
- 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 DATA = 0x01;
- uchar bdata sta;// 状态寄存器
- sbit RX_DR = sta^6;
- sbit TX_DS = sta^5;
- sbit MAX_RT = sta^4;
- // NRF24L01 模块引脚位定义
- sbit CE = P1^2;
- sbit CSN = P1^3;
- sbit SCK = P1^7;
- sbit MOSI = P1^1;
- sbit MISO = P1^6;
- sbit IRQ = P1^4;
- /*
- SPI(nRF24L01) 指令设置
- 指令格式
- <命令字 : 由高位到低位(每字节)>
- <数据字节: 低字节到高字节,每一字节高位在前>
- */
- #define READ_REG 0x00 // Define read command to register
- #define WRITE_REG 0x20 // Define write command to register
- #define RD_RX_PLOAD 0x61 // Define RX payload register address
- #define WR_TX_PLOAD 0xA0 // Define TX payload register address
- #define FLUSH_TX 0xE1 // 清除 TX FIFO寄存器 应用于发射模式下
- #define FLUSH_RX 0xE2 // 清除 RX FIFO寄存器 应用于接收模式下。
- #define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据。 当CE=1,数据包被不断重新发射 发射过程中必须禁止数据包重利用功能
- #define NOP 0xFF // 空操作。可以用来读状态寄存器
- /*
- SPI(nRF24L01) registers(addresses)
- 一下寄存器都是默认只使用 数据通道0 不开启其他通道
- */
- #define CONFIG 0x00 // 'Config' register address
- #define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address
- #define EN_RXADDR 0x02 // 'Enabled RX addresses' register address
- #define SETUP_AW 0x03 // 'Setup address width' register address
- #define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address
- #define RF_CH 0x05 // 'RF channel' register address
- #define RF_SETUP 0x06 // 'RF setup' register address
- #define STATUS 0x07 // 'Status' register address
- #define OBSERVE_TX 0x08 // 'Observe TX' register address
- #define CD 0x09 // 'Carrier Detect' register address
- #define RX_ADDR_P0 0x0A // 'RX address pipe0' register address
- #define RX_ADDR_P1 0x0B // 'RX address pipe1' register address
- #define RX_ADDR_P2 0x0C // 'RX address pipe2' register address
- #define RX_ADDR_P3 0x0D // 'RX address pipe3' register address
- #define RX_ADDR_P4 0x0E // 'RX address pipe4' register address
- #define RX_ADDR_P5 0x0F // 'RX address pipe5' register address
- #define TX_ADDR 0x10 // 'TX address' register address
- #define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address
- #define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address
- #define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address
- #define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address
- #define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address
- #define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address
- #define FIFO_STATUS 0x17 // 'FIFO Status Register' register address
- // 毫秒级延时
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=123;y>0;y--);
- }
- // led闪烁
- void blink(char i)
- {
- while(i--)
- {
- LED = 1;
- delay_ms(500);
- LED = 0;
- delay_ms(500);
- }
- }
- // 初始化IO
- void init_io(void)
- {
- CE = 0; // 待机
- CSN = 1; // SPI禁止
- SCK = 0; // SPI时钟置低
- IRQ = 1; // 中断复位
- LED = 1; // 关闭指示灯
- }
- /*******************************************************************
- @func : SPI_RW(uchar byte)
- @brief : 写一个字节到24L01 同时读出一个字节
- @pram : byte : 要写入24l01的字节
- @retval : 返回读取的字节
- @NOTE : 其他提示
- *******************************************************************/
- uchar SPI_RW(uchar byte)
- {
- uchar bit_ctr;
- // output 8-bits
- for (bit_ctr = 0; bit_ctr < 8; bit_ctr++)
- {
- MOSI = (byte & 0x80); // output ‘byte’ MSB to MOSI
- byte = (byte << 1); // shift next bit into MSB..
- SCK = 1; // Set SCK high.. 24L01 read 1-bit from MOSI and output 1-bit to MISO
- byte |= MISO; // capture current MISO bit
- SCK = 0; // ..then set SCK low again
- }
- return (byte); // return read byte
- }
- /*******************************************************************
- @func : SPI_RW_Reg(BYTE reg, BYTE value)
- @brief : 向寄存器reg写一个字节,同时返回状态字节
- @pram : reg : 要写数据的寄存器地址
- value: 要写入寄存器的数据
- @retval : 返回状态寄存器
- @NOTE : 其他提示
- *******************************************************************/
- uchar SPI_RW_Reg(uchar reg, uchar value)
- {
- uchar status;
- CSN = 0; // CSN low, init SPI transaction, start transmitting data
- status = SPI_RW(reg); // select register and return status byte
- SPI_RW(value); // ..and write value to it..
- CSN = 1; // CSN high again, transmission end
- return(status); // return nRF24L01 status byte
- }
- /*******************************************************************
- @func : SPI_Read(uchar reg)
- @brief : 从reg寄存器读一字节
- @pram : reg : 要读取数据的寄存器地址
- @retval : 返回寄存器数据
- *******************************************************************/
- 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); // 返回寄存器数据
- }
- /*******************************************************************
- @func : SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
- @brief : 从reg寄存器读 bytes 个字节 通常用来读取接收通道
- @pram : reg : 要从中读取数据的寄存器
- pBuf : 存储读取的数据
- bytes: 读取的字节数
- @retval : 返回状态寄存器
- @NOTE : 其他提示
- *******************************************************************/
- uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
- {
- uchar status, byte_ctr;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // Select register to read & return status byte
-
- for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
- pBuf[byte_ctr] = SPI_RW(0); //逐个字节从nRF24L01读出
- CSN = 1; // set CSN high, stop transaction
- return(status); // return nRF24L01 status byte
- }
- /*******************************************************************
- @func : SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
- @brief : 往reg寄存器写入 bytes 个字节 通常用来写入发射通道或接收/发送地址
- @pram : reg : 要写入数据的寄存器
- pBuf : 要写入的的数据
- bytes: 写入的字节数
- @retval : 返回状态寄存器
- @NOTE : 其他提示
- *******************************************************************/
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
- {
- uchar status, byte_ctr;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // Select register to write to & return status byte
-
- for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
- SPI_RW(*pBuf++); // 逐个字节写入nRF24L01
- CSN = 1; // Set CSN high again 结束数据传输
- return(status); // 返回状态寄存器
- }
- /*******************************************************************
- @func : RX_Mode(void)
- @brief : 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
- @pram : None
- @retval : None
- *******************************************************************/
- void RX_Mode(void)
- {
- CE = 0;
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
- SPI_RW_Reg(WRITE_REG + RF_CH, 40);
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
- delay_ms(150);
- CE = 1;
- }
- /*******************************************************************
- @func : TX_Mode(uchar * BUF)
- @brief : 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
- 130us后启动发射,数据发送结束后,发送模块自动转入接收
- 模式等待应答信号
- @pram : BUF : 要发送的数据
- @retval : None
- *******************************************************************/
- 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);
- SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);
- SPI_RW_Reg(WRITE_REG + RF_CH, 40);
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
- delay_ms(150);
- CE = 1;
- }
- /*******************************************************************
- @func : Check_ACK(bit clear)
- @brief : 检查接收设备有无接收到数据包,设定没有收到应答信号是否重发
- @pram : clear : 判断是否清楚标志位
- @retval : 返回0x00 或 0xff
- *******************************************************************/
- uchar Check_ACK(bit clear)
- {
- //delay_ms(200);
- while(IRQ); // 等待数据接收完成
- sta = SPI_RW(NOP); // 返回状态寄存器
- if(TX_DS)
- {
- //blink(3);
- }
- //blink(5);
- 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);
- }
- // 按键扫描
- /*void CheckButtons()
- {
- P3 |= 0x00;
- if(!(P3 & 0x01)) // 读取P3^0状态
- {
- delay_ms(20);
- if(!(P3 & 0x01)) // 读取P3^0状态
- {
- TX_BUF[0] = ~DATA; // 数据送到缓存
- //TX_BUF[0] = 0xff; // 数据送到缓存
- TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据
- //LED = ~DATA; // 数据送到LED显示
- Check_ACK(0); // 等待发送完毕,清除TX FIFO
- delay_ms(250);
- delay_ms(250);
- LED = 1; // 关闭LED
- RX_Mode(); // 设置为接收模式
- while(!(P3 & 0x01));
- DATA <<= 1;
- if(!DATA)
- DATA = 0x01;
- }
- }
- } */
- void main(void)
- {
- init_io(); // 初始化IO
- RX_Mode(); // 设置为接收模式
- while(1)
- {
- sta = SPI_Read(STATUS); // 读状态寄存器
- //delay_ms(200);
- if(RX_DR) // 判断是否接受到数据
- {
- SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH); // 从RX FIFO读出数据
- flag = 1;
- }
- SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除RX_DS中断标志
- if(flag) // 接受完成
- {
- if(RX_BUF[0] == 1) // RX_BUF[0] = 1 则蜂鸣器响一下
- {
- BEEP = 0;
- delay_ms(500);
- BEEP = 1;
- delay_ms(500);
- }
- if(RX_BUF[0] == 2) // RX_BUF[0] = 2 则LED闪烁三下
- {
- BEEP = 0;
- delay_ms(500);
- BEEP = 1;
- delay_ms(500);
- BEEP = 0;
- delay_ms(500);
- BEEP = 1;
- delay_ms(500);
- BEEP = 0;
- delay_ms(500);
- BEEP = 1;
- delay_ms(500);
- }
- flag = 0; // 清标志
- delay_ms(250);
- delay_ms(250);
- LED = 1; // 关闭LED
- }
- }
- }
复制代码
|