nrf24l01 如何实现按多对一通信,与stc单片机接口是任意的吗?求高手解答

2024-11-21 01:44:07
推荐回答(2个)
回答1:

enum Baud_t
{
BAUD_9600 = 0x0c,
BAUD_19200 = 0x06,
BAUD_38400 = 0x03,
BAUD_57600 = 0x02,
BAUD_115200 = 0x01
};

enum Com_t
{
COM0 = 0xc0,
COM1 = 0xc1,
};

enum Mod_t
{
MOD0 = 0x00,
MOD1 = 0x01,
MOD2 = 0x02,
MOD3 = 0x03
};
enum Interrupt_Prio
{
Prio_0 = 0,
Prio_1 = 1,
Prio_2 = 2,
Prio_3 = 3
};

unsigned char SerialOpen (enum Mod_t Mod, enum Baud_t Baud, enum Interrupt_Prio Prio)
{
unsigned char result;
result = 0;
//设置串口工作模式和波特率
switch(Mod)
{
//8位同步移位模式,RXD:数据输入输出;TXD:同步移位时钟;低位在前
case(MOD0):
SM0 = 0;
SM1 = 0;
REN = 1;
// 波特率固定为Fosc/12
result = OK;
break;

//1起始位+8数据位(BT0-BT7)+1停止位
case(MOD1):
SM0 = 0;
SM1 = 1;
REN = 1; //允许串口0接收

AUXR |= 0x40; //T1*12 = 1,定时器1采用12倍频,工作在1T模式
TMOD = 0x21; //设置定时器1为8位自动重装计数器
if(Baud == BAUD_9600)
{
TH1 = 0xdc;
TL1 = 0xdc;
}
if(Baud == BAUD_19200)
{
TH1 = 0xee;
TL1 = 0xee;
}
if(Baud == BAUD_38400)
{
TH1 = 0xf7;
TL1 = 0xf7;
}
if(Baud == BAUD_57600)
{
TH1 = 0xfa;
TL1 = 0xfa;
}
if(Baud == BAUD_115200)
{
TH1 = 0xfd;
TL1 = 0xfd;
}
TR1 = 1; //开启定时器1
result = OK;
break;
//1位起始位+8位数据位+第九位编程位(SCON中的TB8/RB8)+1位停止位
case(MOD2):
SM0 = 1;
SM1 = 0;
REN = 1;
//当SMOD=0时,波特率 = 溢出率/64
//当SMOD=1时,波特率 = 溢出率/32
result = OK;
break;
//同模式2相同,区别在于波特率可以设置
case(MOD3):
SM0 = 0;
SM1 = 0;
REN = 1;

AUXR |= 0x40; //T1*12 = 1,定时器1采用12倍频,工作在1T模式
TMOD = 0x21; //设置定时器1为8位自动重装计数器
if(Baud == BAUD_9600)
{
TH1 = 0x00;
TL1 = 0xdc;
}
if(Baud == BAUD_19200)
{
TH1 = 0x00;
TL1 = 0xee;
}
if(Baud == BAUD_38400)
{
TH1 = 0x00;
TL1 = 0xf7;
}
if(Baud == BAUD_57600)
{
TH1 = 0x00;
TL1 = 0xfa;
}
if(Baud == BAUD_115200)
{
TH1 = 0x00;
TL1 = 0xfd;
}
TR1 = 1; //开启定时器1
result = OK;
break;

default:
result = ERR;
break;
}
//设置中断优先级
if(result == OK)
{
if(Prio == Prio_0)
{
// IP = ; //采用系统默认值
// IPH = ; //采用系统默认值
ES = 1; //开串口中断
EA = 1; //开总的中断控制位
}
if(Prio == Prio_1)
{
IP |= 0x10;
// IPH = ; //采用系统默认值
ES = 1;
EA = 1;
}
if(Prio == Prio_2)
{
// IP = ; //采用默认值
IPH |= 0x10;
ES = 1;
EA = 1;
}
if(Prio == Prio_3)
{
IP |= 0x10;
IPH |= 0x10;
ES = 1;
EA = 1;
}
}
return(result);
}

注意,以上是晶振为11.0592MHZ的参数配置。
你在下载程序的时候要注意:下载软件上要配置成外部晶振,且下一栏选择LOW
否则你的通信是不成功的

回答2:

nrf24l01 通过SPI与STC单片机 连接,可以用硬件SPI控制器也可以用IO口模拟SPI时序操作。
1侦听多发送模式,侦听端设置好通道,地址码,校验,速率等;发送端按照侦听端同样的参数设置即可;传输协议中应标识不同的发送端ID,以作区别。