• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

NRF905无线模块


一个作发射,一个作接收
程序如下:
发送部分:
//*************此程序为nRF905的发送程序***********
#include
#include
#define uchar unsigned char 
#define uint  unsigned int
//*******************定义命令字**********************
#define WC 0x00  // Write configuration register command
#define RC 0x10   // Read  configuration register command
#define WTP 0x20   // Write TX Payload  command
#define RTP 0x21  // Read  TX Payload  command
#define WTA 0x22  // Write TX Address  command
#define RTA 0x23
//*******************管脚配置*********
sbit   MOSI=P2^0;
sbit CSN=P2^3;
sbit SCK=P2^6;
sbit  MISO=P2^7;
sbit TRX_CE=P0^5;
sbit TXEN=P0^3;
sbit PWR=P0^2;
sbit DR=P0^0;
uchar Txbuf[4]={0xf9,0xa4,0xb0,0x99};
uchar Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};
//------------------------------------------------
void delay(uint x)
{
 uint i;
 for(i=0;i
 {
  _nop_();
 }
}

//------------------------------------------------
void Spiwrite(uchar dat)
{
 uchar i=8;
 while(i--)
 {
 delay(10);
 SCK=0;
 MOSI=(bit)(dat&0x80);
 dat<<=1;
 delay(10);
 SCK=1;
 delay(10);
 SCK=0;
 }
 SCK=0;
}
//------------------------------------------------
void Txpacket(void)
{
 TXEN=1;
 CSN=0;
 Spiwrite(0x22);
 Spiwrite(0xe7);
 Spiwrite(0xe7);
 Spiwrite(0xe7);
 Spiwrite(0xe7);
 CSN=1;
 _nop_();_nop_();
 CSN=0;
 Spiwrite(0x20);
 Spiwrite(Txbuf[0]);
 Spiwrite(Txbuf[1]);
 Spiwrite(Txbuf[2]);
 Spiwrite(Txbuf[3]);
 CSN=1;
 _nop_();_nop_();
 TRX_CE=1;
 delay(50);
// TRX_CE=0;
 while(!DR);
}
//--------------------------------------------------
void ini_system(void)
 uchar i;
 CSN=1;
 SCK=0;
 PWR=1;   //   PWR_UP  | TRX_CE |TXEN | M O D E
 TRX_CE=0;  // 1    |   0    |  0 | SPI Programming
 TXEN=0; 
 _nop_();
 CSN=0;
 Spiwrite(0x00);
 for(i=0;i<10;i++)
 {
 Spiwrite(Rfconfig[i]);
 }
 CSN=1;
}

//-------------------------------------------------
void setmode()
{
 
 PWR=1;  //   PWR_UP  TRX_CE   TXEN      MODE
 TRX_CE=1; //      1        1     1 SHOCKBURST TX
 TXEN=1;
 delay(1000); //time must be >=650us
}

//-----------------------------------------------------
void main()
{
 ini_system();
 while(1)
 {
 setmode();
 Txpacket();
 }
}
 
接收程序:
/*****接收时用数码管显示接收到的数据**********/
#include
#include
#define uchar unsigned char 
#define uint  unsigned int
#define led P0

#define WC 0x00   
#define RC 0x10    
#define WTP 0x20    
#define RTP 0x21   
#define WTA 0x22   
#define RTA 0x23   
#define RRP 0x24 
sbit TXEN=P3^5;
sbit TRX_CE=P3^4;
sbit PWR=P3^6;
sbit MISO=P3^0;
sbit MOSI=P1^2;
sbit SCK=P1^4;
sbit CSN=P1^3;
sbit DR=P1^1;
sbit CD=P1^0;

sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit led1=P2^3;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;

unsigned char Rxbuf[4]={0xf9};
unsigned char Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};
void delay(uint x)
{
 uint i;
 for(i=0;i
 {
  _nop_();
 }
}
void Spiwrite(uchar dat)
{
 uchar i=8;
 while(i--)
 {
 delay(10);
 SCK=0;
 MOSI=(bit)(dat&0x80);
 dat<<=1;
 delay(10);
 SCK=1;
 delay(10);
 SCK=0;
 }
 SCK=0;
}
unsigned char Spiread(void)
{
 uchar i=8;
 uchar ddat;
 while(i--)
 {
 ddat<<=1;
 SCK=0;
 _nop_();
 _nop_();
 ddat|=MISO;
 SCK=1;
 _nop_();_nop_();
 }
 SCK=0;
 return ddat;
}
void Rxpacket(void)
{
 unsigned char j=0; 
 TRX_CE=0;
 PWR=1;
 CSN=0;
 Spiwrite(RRP);
 for(j=0;j<4;j++)
 {
 Rxbuf[j]=Spiread();
 }
 CSN=1;
 
}
 
void ini_system(void)
 uchar i;
 CSN=1;
 SCK=0;
 PWR=1;   //   PWR_UP  | TRX_CE |TXEN | M O D E
 TRX_CE=0;  // 1    |   0    |  0 | SPI Programming
 TXEN=0; 
 _nop_();
 CSN=0;
 Spiwrite(WC);
 for(i=0;i<10;i++)
 {
 Spiwrite(Rfconfig[i]);
 }
  CSN=1;
}
void setmode()
{
 
 PWR=1;  //   PWR_UP  TRX_CE   TXEN      MODE
 TRX_CE=1; //      1        1     0 SHOCKBURST RX
 TXEN=0;
 delay(300); //time must be >=650us
}
void display()
{
 led1=0;
 led2=1;
 led3=1;
 led4=1;
 led=Rxbuf[0];
 delay(1);
 
 led1=1;
 led2=0;
 led3=1;
 led4=1;
 led=Rxbuf[1];
 delay(1);
 led1=1;
 led2=1;
 led3=0;
 led4=1;
 led=Rxbuf[2];
 delay(1);
 led1=1;
 led2=1;
 led3=1;
 led4=0;
 led=Rxbuf[3];
 delay(1);    
 
}
void main()
{
 ini_system(); 
 setmode();
 while(1)
 { 
  
  Rxpacket();
  while(!DR);
  display();
 }
 
}
 

‘(2)
#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
//配置口定义//
sbit TXEN = P1^7;
sbit TRX_CE = P1^6;
sbit PWR = P1^5;
//SPI口定义//
sbit MISO = P1^2;
sbit MOSI = P1^3;
sbit SCK = P1^1;
sbit CSN = P1^0;
sbit P2_0 = P2^0;
//状态输出口//
sbit DR = P1^4;
sbit LCD = P3^2;
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
0x00, //配置命令//
0x6C, //CH_NO,配置频段在433.2MHZ
0x0E, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x03,0x03, //接收发送有效数据长度为3字节
0xE7,0xE7,0xE7,0xE7, //接收地址
0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振//UP_CLK输出1MHZ频率
};
uchar TxRxBuffer[5];
bit lcdbit;
///////////延时/////////////////
void Delay(uint x)
{
uint i;
for(i=0;i
_nop_();
}
}
////////////用SPI口写数据至NRF905内//////////
void SpiWrite(unsigned char b)
{
unsigned char i=8;
while (i--)
{
Delay(10);
SCK=0;
MOSI=(bit)(b&0x80);
b<<=1 ;
Delay(10);
SCK=1;
Delay(10);
SCK=0;
}
SCK=0;
}
///////////////from 905 read data////////////////
unsigned char SpiRead(void)
{
register unsigned char i=8;
unsigned char ddata=0;
while (i--)
{
ddata<<=1 ;
SCK=0;
_nop_();_nop_();
ddata|=MISO;
SCK=1 ;
_nop_();_nop_();
}
SCK=0;
return ddata;
}
///////////////接收数据包/////////////////
void RxPacket(void)
{
uchar i;
i=0;
while(DR)
{
TxRxBuffer[i] = SpiRead();
i++;
}
}
/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(void)
{
TXEN=1;
CSN=0;
SpiWrite(0x22); //写发送地址,后面跟4字节地址//
SpiWrite(0xE7);
SpiWrite(0xE7);
SpiWrite(0xE7);
SpiWrite(0xE7);
CSN=1;
_nop_();_nop_();
CSN=0;
SpiWrite(0x20); //写发送数据命令,后面跟三字节数据//
SpiWrite(0x01);
SpiWrite(0x02);
SpiWrite(0x03);
CSN=1;
_nop_();_nop_();
TRX_CE=1; //使能发射模式//
Delay(50); //等带发送完成//
TRX_CE=0;
while(!DR);
}
////////////////等待接收数据包///////////////////
uchar temp;
void Wait_Rec_Packet(void)
{ PWR=1;
TXEN=0;
TRX_CE=1;
while(1)
{
if(DR) //数据接收成功
{
TRX_CE=0; //如果数据准备好,则进入待机模式,以便SPI口操作
CSN=0;
SpiWrite(0x24); //读nRF905所接受到的数据
RxPacket(); //保存数据
CSN=1;
temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
if(temp==0x06)
{
lcdbit=!lcdbit; //lcdbit=0
LCD=lcdbit; //如果接收的数据正确
}
break;
}
}
}
////////////初始化配置寄存器////////////////
void Ini_System(void)
{
uchar i;
LCD=0;
Delay(10000);
LCD=1;
lcdbit=1;
CSN=1;
SCK=0;
PWR=1; //进入掉电模式
TRX_CE=0;
TXEN=0;
_nop_();
CSN=0; //进入SIP模式
for(i=0;i<11;i++)
{
SpiWrite(RFConf[i]); //设置配置寄存器
}
CSN=1; //关闭SPI,进入接收状态
PWR=1;
TRX_CE=1;
TXEN=0;
Delay(1000);
}
void main(void)
{
uchar i;
Ini_System(); //设置配置,并进入接收模式 (收)
// PWR=0; //进入掉电模式
while(1)
{
Wait_Rec_Packet(); //等待接收完成,保存完接收数据(保存数据+地址)
for(i=0;i<2;i++)
Delay(65530);
TxPacket(); //发送数据
}
}
nrf905收发程序
单片机 2009-10-28 20:06:26 阅读370 评论3字号:大中小
在这里把以前写的程序粘贴上来
电路就不贴了,因为当时拿到的是现成板
也没电路图,当时所花的时候也较多才写出程序,主要是因为当时引脚没注意电压
只是单纯地用示波器来测那几个引脚波形
结果是相当的悲剧!!
当时用的时两个nrf905,一个作发射,一个作接收
程序如下:
发送部分:
//*************此程序为nRF905的发送程序***********
#include
#include
#define uchar unsigned char 
#define uint  unsigned int
//*******************定义命令字**********************
#define WC 0x00  // Write configuration register command
#define RC 0x10   // Read  configuration register command
#define WTP 0x20   // Write TX Payload  command
#define RTP 0x21  // Read  TX Payload  command
#define WTA 0x22  // Write TX Address  command
#define RTA 0x23
//*******************管脚配置*********
sbit   MOSI=P2^0;
sbit CSN=P2^3;
sbit SCK=P2^6;
sbit  MISO=P2^7;
sbit TRX_CE=P0^5;
sbit TXEN=P0^3;
sbit PWR=P0^2;
sbit DR=P0^0;
uchar Txbuf[4]={0xf9,0xa4,0xb0,0x99};
uchar Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};
//------------------------------------------------
void delay(uint x)
{
 uint i;
 for(i=0;i
 {
  _nop_();
 }
}

//------------------------------------------------
void Spiwrite(uchar dat)
{
 uchar i=8;
 while(i--)
 {
 delay(10);
 SCK=0;
 MOSI=(bit)(dat&0x80);
 dat<<=1;
 delay(10);
 SCK=1;
 delay(10);
 SCK=0;
 }
 SCK=0;
}
//------------------------------------------------
void Txpacket(void)
{
 TXEN=1;
 CSN=0;
 Spiwrite(0x22);
 Spiwrite(0xe7);
 Spiwrite(0xe7);
 Spiwrite(0xe7);
 Spiwrite(0xe7);
 CSN=1;
 _nop_();_nop_();
 CSN=0;
 Spiwrite(0x20);
 Spiwrite(Txbuf[0]);
 Spiwrite(Txbuf[1]);
 Spiwrite(Txbuf[2]);
 Spiwrite(Txbuf[3]);
 CSN=1;
 _nop_();_nop_();
 TRX_CE=1;
 delay(50);
// TRX_CE=0;
 while(!DR);
}
//--------------------------------------------------
void ini_system(void)
 uchar i;
 CSN=1;
 SCK=0;
 PWR=1;   //   PWR_UP  | TRX_CE |TXEN | M O D E
 TRX_CE=0;  // 1    |   0    |  0 | SPI Programming
 TXEN=0; 
 _nop_();
 CSN=0;
 Spiwrite(0x00);
 for(i=0;i<10;i++)
 {
 Spiwrite(Rfconfig[i]);
 }
 CSN=1;
}

//-------------------------------------------------
void setmode()
{
 
 PWR=1;  //   PWR_UP  TRX_CE   TXEN      MODE
 TRX_CE=1; //      1        1     1 SHOCKBURST TX
 TXEN=1;
 delay(1000); //time must be >=650us
}

//-----------------------------------------------------
void main()
{
 ini_system();
 while(1)
 {
 setmode();
 Txpacket();
 }
}
 
接收程序:
/*****接收时用数码管显示接收到的数据**********/
#include
#include
#define uchar unsigned char 
#define uint  unsigned int
#define led P0

#define WC 0x00   
#define RC 0x10    
#define WTP 0x20    
#define RTP 0x21   
#define WTA 0x22   
#define RTA 0x23   
#define RRP 0x24 
sbit TXEN=P3^5;
sbit TRX_CE=P3^4;
sbit PWR=P3^6;
sbit MISO=P3^0;
sbit MOSI=P1^2;
sbit SCK=P1^4;
sbit CSN=P1^3;
sbit DR=P1^1;
sbit CD=P1^0;

sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit led1=P2^3;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;

unsigned char Rxbuf[4]={0xf9};
unsigned char Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};
void delay(uint x)
{
 uint i;
 for(i=0;i
 {
  _nop_();
 }
}
void Spiwrite(uchar dat)
{
 uchar i=8;
 while(i--)
 {
 delay(10);
 SCK=0;
 MOSI=(bit)(dat&0x80);
 dat<<=1;
 delay(10);
 SCK=1;
 delay(10);
 SCK=0;
 }
 SCK=0;
}
unsigned char Spiread(void)
{
 uchar i=8;
 uchar ddat;
 while(i--)
 {
 ddat<<=1;
 SCK=0;
 _nop_();
 _nop_();
 ddat|=MISO;
 SCK=1;
 _nop_();_nop_();
 }
 SCK=0;
 return ddat;
}
void Rxpacket(void)
{
 unsigned char j=0; 
 TRX_CE=0;
 PWR=1;
 CSN=0;
 Spiwrite(RRP);
 for(j=0;j<4;j++)
 {
 Rxbuf[j]=Spiread();
 }
 CSN=1;
 
}
 
void ini_system(void)
 uchar i;
 CSN=1;
 SCK=0;
 PWR=1;   //   PWR_UP  | TRX_CE |TXEN | M O D E
 TRX_CE=0;  // 1    |   0    |  0 | SPI Programming
 TXEN=0; 
 _nop_();
 CSN=0;
 Spiwrite(WC);
 for(i=0;i<10;i++)
 {
 Spiwrite(Rfconfig[i]);
 }
  CSN=1;
}
void setmode()
{
 
 PWR=1;  //   PWR_UP  TRX_CE   TXEN      MODE
 TRX_CE=1; //      1        1     0 SHOCKBURST RX
 TXEN=0;
 delay(300); //time must be >=650us
}
void display()
{
 led1=0;
 led2=1;
 led3=1;
 led4=1;
 led=Rxbuf[0];
 delay(1);
 
 led1=1;
 led2=0;
 led3=1;
 led4=1;
 led=Rxbuf[1];
 delay(1);
 led1=1;
 led2=1;
 led3=0;
 led4=1;
 led=Rxbuf[2];
 delay(1);
 led1=1;
 led2=1;
 led3=1;
 led4=0;
 led=Rxbuf[3];
 delay(1);    
 
}
void main()
{
 ini_system(); 
 setmode();
 while(1)
 { 
  
  Rxpacket();
  while(!DR);
  display();
 }
 
}
 

‘(2)
#include
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
//配置口定义//
sbit TXEN = P1^7;
sbit TRX_CE = P1^6;
sbit PWR = P1^5;
//SPI口定义//
sbit MISO = P1^2;
sbit MOSI = P1^3;
sbit SCK = P1^1;
sbit CSN = P1^0;
sbit P2_0 = P2^0;
//状态输出口//
sbit DR = P1^4;
sbit LCD = P3^2;
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
0x00, //配置命令//
0x6C, //CH_NO,配置频段在433.2MHZ
0x0E, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x03,0x03, //接收发送有效数据长度为3字节
0xE7,0xE7,0xE7,0xE7, //接收地址
0xDE, //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振//UP_CLK输出1MHZ频率
};
uchar TxRxBuffer[5];
bit lcdbit;
///////////延时/////////////////
void Delay(uint x)
{
uint i;
for(i=0;i
_nop_();
}
}
////////////用SPI口写数据至NRF905内//////////
void SpiWrite(unsigned char b)
{
unsigned char i=8;
while (i--)
{
Delay(10);
SCK=0;
MOSI=(bit)(b&0x80);
b<<=1 ;
Delay(10);
SCK=1;
Delay(10);
SCK=0;
}
SCK=0;
}
///////////////from 905 read data////////////////
unsigned char SpiRead(void)
{
register unsigned char i=8;
unsigned char ddata=0;
while (i--)
{
ddata<<=1 ;
SCK=0;
_nop_();_nop_();
ddata|=MISO;
SCK=1 ;
_nop_();_nop_();
}
SCK=0;
return ddata;
}
///////////////接收数据包/////////////////
void RxPacket(void)
{
uchar i;
i=0;
while(DR)
{
TxRxBuffer[i] = SpiRead();
i++;
}
}
/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(void)
{
TXEN=1;
CSN=0;
SpiWrite(0x22); //写发送地址,后面跟4字节地址//
SpiWrite(0xE7);
SpiWrite(0xE7);
SpiWrite(0xE7);
SpiWrite(0xE7);
CSN=1;
_nop_();_nop_();
CSN=0;
SpiWrite(0x20); //写发送数据命令,后面跟三字节数据//
SpiWrite(0x01);
SpiWrite(0x02);
SpiWrite(0x03);
CSN=1;
_nop_();_nop_();
TRX_CE=1; //使能发射模式//
Delay(50); //等带发送完成//
TRX_CE=0;
while(!DR);
}
////////////////等待接收数据包///////////////////
uchar temp;
void Wait_Rec_Packet(void)
{ PWR=1;
TXEN=0;
TRX_CE=1;
while(1)
{
if(DR) //数据接收成功
{
TRX_CE=0; //如果数据准备好,则进入待机模式,以便SPI口操作
CSN=0;
SpiWrite(0x24); //读nRF905所接受到的数据
RxPacket(); //保存数据
CSN=1;
temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
if(temp==0x06)
{
lcdbit=!lcdbit; //lcdbit=0
LCD=lcdbit; //如果接收的数据正确
}
break;
}
}
}
////////////初始化配置寄存器////////////////
void Ini_System(void)
{
uchar i;
LCD=0;
Delay(10000);
LCD=1;
lcdbit=1;
CSN=1;
SCK=0;
PWR=1; //进入掉电模式
TRX_CE=0;
TXEN=0;
_nop_();
CSN=0; //进入SIP模式
for(i=0;i<11;i++)
{
SpiWrite(RFConf[i]); //设置配置寄存器
}
CSN=1; //关闭SPI,进入接收状态
PWR=1;
TRX_CE=1;
TXEN=0;
Delay(1000);
}
void main(void)
{
uchar i;
Ini_System(); //设置配置,并进入接收模式 (收)
// PWR=0; //进入掉电模式
while(1)
{
Wait_Rec_Packet(); //等待接收完成,保存完接收数据(保存数据+地址)
for(i=0;i<2;i++)
Delay(65530);
TxPacket(); //发送数据
}
}

全部回复(1)
正序查看
倒序查看
2013-09-25 13:49
这是干嘛啊。比长么
0
回复