nrf24l01 2.4GHZ无线发射接收模块接收程序
时间:2026-01-23
时间:2026-01-23
nrf24l01 2.4GHZ无线发射接收模块接收程序
nrf24l01 2.4GHZ无线发射接收模块接收程序
(2011-06-19 20:01:19)转载
标签: nrf24l01 2.4ghz 无线 发射 接收 模块 接收程序 杂谈
分类: 射频nrf24l01
发射程序是用51写的
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define TX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 4
// SPI(nRF24L01) commands
#define READ_REG 0x00
#define WRITE_REG 0x20
#define RD_RX_PLOAD 0x61
#define WR_TX_PLOAD 0xA0
#define FLUSH_TX 0xE1
#define FLUSH_RX 0xE2
#define REUSE_TX_PL 0xE3
#define NOP 0xFF
#define CONFIG 0x00
#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
#define RX_ADDR_P3 0x0D
#define RX_ADDR_P4 0x0E
#define RX_ADDR_P5 0x0F
#define TX_ADDR 0x10
#define RX_PW_P0 0x11
#define RX_PW_P1 0x12
#define RX_PW_P2 0x13
#define RX_PW_P3 0x14
#define RX_PW_P4 0x15
#define RX_PW_P5 0x16
#define FIFO_STATUS 0x17
sbit CE = P1^2;
sbit CSN = P3^5;
sbit MISO = P1^0;
sbit MOSI = P3^3;
sbit SCK = P1^1;
sbit KEY=P1^6;
sbit LED=P3^6;
sbit IRQ=P3^2;
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x40,0x42,0x10,0x10,0x01}; // 定义一个静态发送地址
uchar dar[4]={0x00,0x01,0x50,0x96};
void delay(uchar x) //延时ms
{
uchar i,j;
for(i=0;i<110;i++)
for(j=0;j<x;j++);
}
void delayus(uchar x) //延时us
{
for(;x>0;x--);
_nop_;
}
void write_spi(uchar dat) //写一个字节数据到nrf24l01
{
uchar i;
SCK=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
MOSI=CY;
SCK=1;
delay(10);
SCK=0;
}
}
uchar read_spi() //从nrf24l01读出一个字节数据
{
uchar i,dat;
SCK=0;
for(i=0;i<8;i++)
{
delay(10);
SCK=1;
dat=dat<<1;
dat|=MISO;
SCK=0;
}
return dat;
}
void write_reg(uchar reg,uchar value)//配置寄存器
{
CSN=0;
write_spi(reg+0x20);
delay(10);
write_spi(value);
CSN=1;
}
uchar read_reg(uchar reg) //读寄存器值
{
uchar value;
CSN=0;
write_spi(reg);
delay(10);
value=read_spi();
CSN=1;
return value;
}
void write_fifo(uchar reg,uchar *buf,uchar num) //写多个字节
{
uchar i;
CSN=0;
write_spi(reg);
delay(10);
for(i=0;i<num;i++)
{
write_spi(*(buf+i));
}
CSN=1;
}
void read_fifo(uchar reg,uchar *buf,uchar num) //读多个字节
{
uchar i;
CSN=0;
write_spi(reg);
delay(10);
for(i=0;i<num;i++)
{
*(buf+i)=read_spi();
delay(10);
}
CSN=1;
}
void TX_Mode() //发送
{
CE = 0;
write_fifo(RX_ADDR_P0+0x20, TX_ADDRESS, TX_ADR_WIDTH);
// write_fifo(WR_TX_PLOAD, buf, 4
);
write_reg(CONFIG, 0x0e);
CE=1;
delayus(10);
}
void RX_Mode() //接收
{
CE = 0;
write_reg(CONFIG, 0x0f);
CE = 1;
delayu
nrf24l01 2.4GHZ无线发射接收模块接收程序
s(130);
}
void init() //nrf24l01初始化以及单片机端口初始化
{
CE = 0;
CSN = 1;
SCK = 0;
LED = 1;
IRQ=1;
write_fifo(TX_ADDR+0x20, TX_ADDRESS, TX_ADR_WIDTH);
write_fifo(RX_ADDR_P0+0x20, TX_ADDRESS, TX_ADR_WIDTH);
write_reg(EN_AA, 0x01);
write_reg(EN_RXADDR, 0x01);
write_reg(RF_CH,40);
write_reg(RX_PW_P0,4);
write_reg(RF_SETUP, 0x07);
write_reg(CONFIG, 0x0e);
}
void main()
{
uchar status;
uchar dat[4]={0x01,0x02,0x03,0x04};
init();
status=read_reg(STATUS);
write_reg(STATUS,status) ; //清除状态寄存器
TX_Mode();//配置为发送模式
LED=0;
while(1)
{
if(KEY==0)
{
delay(10);
if(KEY==0) //按键扫描,释放后才开始发送数据
{
while(!KEY) ;
write_fifo(WR_TX_PLOAD, dat, 4);
while(IRQ); //等待中断
if(read_reg(STATUS)&0x20)//发送成功中断
{
LED=1;
}
status=read_reg(STATUS);
write_re
g(STATUS,status) ;//清除状态寄存器
IRQ=1;
write_spi(FLUSH_TX) ;
write_spi(FLUSH_RX) ; //清除缓存器
LED=0;
}
}
}
}
上一篇:勘察设计企业绩效考核与薪酬激励
下一篇:XX市自然灾害应急处置预案