nrf2401无线发射程序

这是用nrf2401无线模块做的无线发射程序,可以无线发射100米左右,效果不过,我试过,

全国电子设计大赛我就用过这个东西,效果不错,现在给大家分享下吧!~网上很难找到的哦!~

#include
#include
#define uint unsigned int
#define uchar unsigned char
/*nRF2401配置命令字*/
//配置字一共是144位,16个字节,其中前三个字节为测试用,用户不必配置
//配置时,从最高位D143开始,在每次配置结束后,只有D15-D0最后2个字节的命令 可以被修改
//前16个字节的修改无效,如果需要对前16个字节进行修改,需要重新掉电然后上电才能重新进行初始化
//芯片测试用,无需修改
#define TEST_2 0x8E //MSB D143~D136
#define TEST_1 0x08 // D135~D128
#define TEST_0 0x1C // D127~D120
/* 注意: DATAx_W + ADDRx_W + CRC 的值必须小于256 ! 单个数据包的大小必须小于32字节(256位) */
#define DATA2_W 0x40 //64bits,8字节,通道2 接收数据有效长度(单位:Bit),用于接收,D119-D112
//在此通道2未使用
#define DATA1_W 0x10 //16bits,2字节,通道1 接收数据有效长度(单位:Bit), 用于接收,D111-D104

/* 注意:2401忽略ADDRx中超过ADDR_W设定宽度的那些位,同时可以设置为0 */
//通道2 接收地址,共40位<- 通道2未启用
#define ADDR2_4 0xaa //D103-D64
#define ADDR2_3 0xbb
#define ADDR2_2 0xcc
#define ADDR2_1 0xdd
#define ADDR2_0 0xee

//通道1 接收地址,共40位 (当前模块地址) <- 只使用到频道1
#define ADDR1_4 0xaa //D63-D24
#define ADDR1_3 0xbb
#define ADDR1_2 0xcc
#define ADDR1_1 0xdd
#define ADDR1_0 0xee

#define ADDR_W 0x28 //8bits,1字节 //发送/接收地址有效长度(单位:Bit),D23-D18
#define CRC_L 0x1 //CRC模式选择 0:8位 1:16位 D17
#define CRC_EN 0x1 //CRC校验使能 0:禁用 1:启用 D16
#define RX2_EN 0x0 //接收通道选择 0:仅通道1接收数据 1:通道1和通道2都可以接收 D15
#define CM 0x1 //收发模式选择 0:Direct模式 1:ShockBurst模式 D14
#define RFDR_SB 0x1 //通信波特率选择 0:250kbps 1:1Mbps (250kbps比1Mbps传输距离更远) D13
//前者通信的误码率较低,如果速度无要求通常选择250kbps,1Mbps的速率需要16M的晶振。
#define XO_F 0x3 //晶振选择(000-4M;001-8M;010-12M;011-16M) D12-D10
#define RF_PWR 0x3 //信号发射功率选择(00:-20dBm;01:-10dBm;10:-5dBm;11:0dBm) D9-D8
#define RF_CH 0x32 //RF收发频率设置,注意2401的数据发送端在8引脚,同时8引脚也是通道一的接收端,D7-D1
//发送频率=(2400+RF_CH)MHz,范围:2400MHz-2527MHz
//通道一接收频率=(2400+RF_CH)MHz,范围:2400MHz-2524MHz PIN#8
//通道二接收频率=(2400+RF_CH+8)MHz,范围:2408MHz-2524MHz PIN#4
//通信时,只有发射端和接收端

的频率一致时,发射端的信号才可能被接收
//这里为2450MHz 0x32是16进制,转化为10进制为50
#define RXEN 0x0 //芯片收发切换 0:发送状态 1:接收状态 D0

/*配置字节定义,供18个字节,不要修改!*/
#define Byte0 TEST_2
#define Byte1 TEST_1
#define Byte2 TEST_0
#define Byte3 DATA2_W
#define Byte4 DATA1_W
#define Byte5 ADDR2_4
#define Byte6 ADDR2_3
#define Byte7 ADDR2_2
#define Byte8 ADDR2_1
#define Byte9 ADDR2_0
#define Byte10 ADDR1_4
#define Byte11 ADDR1_3
#define Byte12 ADDR1_2
#define Byte13 ADDR1_1
#define Byte14 ADDR1_0
#define Byte15 (ADDR_W<<2 | CRC_L<<1 | CRC_EN)
#define Byte16 (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR)
#define Byte17 (RF_CH<<1 | RXEN)

uchar code config[18]={
Byte0,Byte1,Byte2,Byte3,Byte4,Byte5,Byte6,Byte7,Byte8,Byte9,
Byte10,Byte11,Byte12,Byte13,Byte14,Byte15,Byte16,Byte17
};/*配置命令数组定义*/
unsigned char address[5] = {0xaa,0xbb,0xcc,0xdd,0xee}; // 接收端地址:aa bb cc dd ee,实际中根据ADDR_W,设定此数组
/*************************************************************************/


/**************************************************************************/
sbit CE=P1^7;
sbit PWR_UP=P1^6;
sbit CLK2=P1^5; //Not use
sbit DR2=P1^4; //Not use
sbit CS=P1^3;
sbit DOUT2=P1^2; //Not use
sbit DR1=P3^4;
sbit CLK1=P1^1;
sbit DATA=P1^0;
sbit TxLED=P2^1;
sbit RxLED=P2^2;
sbit dq = P3^5;//单总线接口
void long_delay(void);
void short_delay(void);
uchar send_data[DATA1_W/8];//此处DARA1_W=0X10,即16
/****************************************************************************/
void delay_ms(uint delay_counter)
{
uint i;
while(delay_counter--)
{
i=81;
while(i--);
}
}
delay15us(unsigned char n)
{ _nop_();
for(;n>1;n--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
}
/**************************************************************************/

/*********************************************************************************/
void write_spi_1_byte(uchar temp)
{
uchar i,j,m;
j=0x80;
for(m=0;m<8;m++)
{
i=j&temp;//取高位
if(i!=0)//如果高位不为0,即写入的为1
DATA=1;
else
DATA=0;
CLK1=1;
temp<<=1;
CLK1=0;//在CLK的上升沿写入
}//此处用这个程序也可以
}

void nrf2401_write_cmd()
{
uchar i;
PWR_UP=1;//PWR_UP=1:上电
delay_ms(5); //delay 5ms
CE=0; //CE=0:2401使能
CS=1; //CS=1:2401片选
i=1; //delay 10us
while(i--);

for(i=0;i<18;i++) //写入配置命令数组所指定的控制字
write_spi_1_byte(config[i]);

CS=0;
DATA=0;
CE=1;

}
void nrf2401_init(void)
{
PWR_UP=0; // 初始化IO端口
CE=0;
CS=0;
CLK1=0;
DATA=0;
nrf2

401_write_cmd(); // 向nRF2401A写命令字
delay_ms(2);

}

void nrf2401_sendbyte(unsigned char *address,unsigned char *out_data)
{//先发送地址,然后发送数据
unsigned char i;
PWR_UP=1; //PWR_UP=1:上电
delay_ms(5); //delay 5ms for 2401 enable(Min 4ms)
CE=1; //CE=1:使能
i=1; //Delay 10us
while(i--);
for(i=0; iwrite_spi_1_byte(address[i]); //发送接收端相应通道的地址
for(i=0;iwrite_spi_1_byte(out_data[i]); //朔⑼接收端相应通道的接收数据
//长度必须和接收端接收数据的有效长度一致。
//以上共8个字节数据发送,必须与接收端的DATA1_W/8一致!

CE=0; //for next package
i=50; //delay about 300us
while(i--);
PWR_UP=0; //掉电
}
/***************************************************************************************/
void sending_data()
{
EA=0;
TxLED=0;
nrf2401_sendbyte(address,send_data);
TxLED=1;
EA=1;
}
/****************************************************************/
void main()
{

nrf2401_init();
while(1)
{

send_data[0]=0x09;
send_data[1]=0x05;
sending_data();
}






}


相关文档
最新文档