永发信息网

求 一份nrf24L01 无线收发 与stc89C51单片机实行的无线收发程序 一端控制 一端显示

答案:4  悬赏:10  手机版
解决时间 2021-02-27 11:05
有的请发 我邮箱 365726134@qq.com 求 ........
最佳答案
#include <reg52.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned char uint;
/
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
SPI_RW_Reg(FLUSH_TX,0x00);
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
// SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03); //收发地址宽度 0000 0011_5字节
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //自动重发延时500+86us,重发次数10
SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
CE=1;
Delay(100);
}

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 MOSI
uchar = (uchar << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
uchar |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(uchar); // return read uchar
}

uchar SPI_Read(uchar reg)
{
uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication...
SPI_RW(reg); // Select register to read from..
reg_val = SPI_RW(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication

return(reg_val); // return register value
}


uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;

CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again

return(status); // return nRF24L01 status uchar
}


uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to write to and read status uchar
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); //
CSN = 1;
return(status); // return nRF24L01 status uchar
}

uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; //SPI使能
status = SPI_RW(reg);
Delay(10);
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++);
CSN = 1; //关闭SPI
return(status); //
}


void SetTX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC ,主发送
CE = 1;
inerDelay_us(300);
}


unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主接收
CE=1;
inerDelay_us(300);//406us
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return revale;
}

void nRF24L01_TxPacket(unsigned char *tx_buf)
{
CE=0; //StandBy I模式
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,激发数据发送
inerDelay_us(50);
CE=0;
}
///按键检测发送
void anjian(void)
{
if(KEY1==0)
{
inerDelay_us(50);
led0=~led0;
if(KEY1==0)
{
nRF24L01_TxPacket(TxBuf);
Delay(20000);
SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
KEY1=1;
}
}
}
//************************************主函数************************************************************
void main(void)
{
uchar i=0;
uchar TxBuf[32];
led0=0;
led1=0;
led2=0;
//nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
Delay(6000);

while(1)
{
//SPI_RW();
init_NRF24L01();
SetTX_Mode();
anjian();
nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data

if(TX_DS)
{
led1=~led1; //8位LED显示当前STATUS状态 发送中断应使bit5 = 1 灯灭
Delay(100);
SPI_RW_Reg(WRITE_REG + STATUS,sta);
}
if(MAX_RT) //如果是发送超时
{
led2=~led2; //发送超时时 8位LED灯 bit4 = 1 灯灭
Delay(150);
SPI_RW_Reg(WRITE_REG + STATUS,sta);
}
}
//nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
}
全部回答
额~~我发给你吧~~我刚测试通过了~~!! 另外,站长团上有产品团购,便宜有保证
额~~我发给你吧~~我刚测试通过了~~!! 另外,站长团上有产品团购,便宜有保证
io可以直接连接,但是nrf的电源不能超过3.6v nrf24l01的使用 发射数据 1)首先将nrf24l01配置为发射模式 2)接着把接收节点地址tx_addr和有效数据tx_pld按照时序由spi口写入nrf24l01缓存区,tx_pld必须在csn为低时连续写入,而tx_addr在发射时写入一次即可,然后ce置为高电平并保持至少10μs,延迟130μs后发射数据; 3)若自动应答开启,那么nrf24l01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接收节点地址tx_addr一致)。如果收到应答,则认为此次通信成功,tx_ds置高,同时tx_pld从tx fifo中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(arc)达到上限,max_rt置高,tx fifo中数据保留以便再次重发;max_rt或tx_ds置高时,使irq变低,产生中断,通知mcu。 4)最后发射成功时,若ce为低则nrf24l01进入空闲模式1; 若发送堆栈中有数据且ce为高,则进入下一次发射;若发送堆栈中无数据且ce为高,则进入空闲模式 接收数据 1)首先将nrf24l01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。 2)当接收方检测到有效的地址和crc时,就将数据包存储在rx fifo中,同时中断标志位rx_dr置高,irq变低,产生中断,通知mcu去取数据。 3)若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若ce变低,则nrf24l01进入空闲模式1
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
眼睛后面会堆积脏东西么?
江苏阳云丰服装有限公司怎么去啊,有知道地址
城市猎人韩剧在哪能看
同学给我发私包是有另一层意思么
木瓜奇迹骑士怎么加点?高手进
希望幼儿园(永吉县万昌农机管理站北)怎么去啊
我的假期我做主的读后感
雅居木门在哪里啊,我有事要去这个地方
当显微镜的目镜为10×,物镜为10×时,视野范
正方形体积怎么求
锰矿山地址在哪,我要去那里办事
赤峰去北京驾车去 什么时间进北京街里最好
金萍果地址在什么地方,想过去办事
2012款宝骏630手动需要更换齿轮油吗?
最快多长时间学好电焊
推荐资讯
如图,平行四边形ABCD的对角线AC与BD相交于点O
螺杆式空压机会不会喘振
穿透性最好的歌是什么歌?晚上睡觉时总是有人
求幼儿园开园三周年庆典活动小朋友主持词。
科哥商店这个地址在什么地方,我要处理点事
个人社保缴费每月840元,咋交那么多钱?
PRD20KA/3P+N是多少级防雷
华明商用厨具大卖场这个地址在什么地方,我要
老人要去世了,吃雪糕更容易走的快吗?
asp中如何进行“文本”的对比及判断
动物界中种类最多,数量最大,的动物群是( 
小句内衣批发地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?