×
单片机 > 单片机程序设计 > 详情

2.4G无线发射模块nRF2402应用

发布时间:2020-06-08 发布时间:
|
花了我一个下午的时间,终于调试好了nRF2402无线发射模块,有一点值得注意的,nRF2402是单独发射模块,单通道的,具体应用和nRF2401差不多,就是值得注意的是配置控制字(Configuration Word)不一样。

 

nRF2402模块引脚图如下:

值得注意到是nRF2402配置控制字和nRF2401不一样,具体看datasheet,我摘录了一部分如下

有4个字节的控制字,其中D0-D19是需要配置的,D31-D20空,可以配置为0.

 

源程序:

/***********************************************************/
/*nRF2402学习板V1.0             */
/*创建人  :郑 文(ClimberWin)           日期:2010-02-20   */
/*功能描述:nRF2402无线数据传输                 */
/*芯片    :STC89C51RC  晶振 11.0592M       */
/*版本    :V1.0             */
/***********************************************************/
//测试OK,功能描述:
//8个LED接在P0口,低电平有效
//按键1是LED加 按键2LED减  按键3 LED全亮 按键4 LED全灭
//串口输出数据
//添加串口发送数据给单片机再无线发送
#include
#include
#include
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

//端口定义
///////LED定义//////////
sbit LED1  = P0^0;
sbit LED2  = P0^1;
sbit LED3  = P0^2;
sbit LED4  = P0^3;
sbit LED5  = P0^4;
sbit LED6  = P0^5;
sbit LED7  = P0^6;
sbit LED8  = P0^7;
///////按键定义////////////
sbit K1  = P3^3;
sbit K2  = P3^4;
sbit K3  = P3^5;
sbit K4  = P3^6;

sbit speaker=P3^7;//蜂鸣器输出引脚


/*****************************************/
void speakertest(void);   //蜂鸣器程序
void init_rs232(void);           //串口初始化
void keytest(void);  //按键测试程序
/*****************************************/

/* 串口通信初始化设置 */
void init_rs232(void)
 {
 SCON=0x50;
 PCON=0x00;
 TH1=0xFD;    //波特率 9600  11.0592MHZ 时候
 TL1=0XFD;
 TMOD=0X20;
 TR1=1;    
 }
void speakertest(void)//蜂鸣器程序
{
 unsigned char i;
  for(i=0;i<100;i++)
 {
  speaker=0;
  delayms(1);
  speaker=1;
  delayms(1);
  }
}
/*****************************************/
void keytest(void)  //按键测试程序
{
////////按键K1判断程序////////
  while(K1==0) 
  {
  delayms(100);//按键去抖
   if(K1==1) 
   {
   nRF2402_flag|=0x02; //按键标志位nRF2402_flag_bit1=1
   speakertest();
   nRF2402_Data[0]++;
   }
   else
   {;}
  }
/////////////////////////////
////////按键K2判断程序////////
  while(K2==0) 
  {
   delayms(100);//按键去抖
   if(K2==1) 
   {
   nRF2402_flag|=0x02; //按键标志位nRF2402_flag_bit1=1
   speakertest();
   nRF2402_Data[0]--;
   }
   else
   {nRF2402_flag&=0xfd; } //清除按键标志位nRF2402_flag_bit1=0
  }
/////////////////////////////
////////按键K3判断程序////////
  while(K3==0) 
  {
  delayms(100);//按键去抖
   if(K3==1) 
   {
   nRF2402_flag|=0x02; //按键标志位nRF2402_flag_bit1=1
   speakertest();
   nRF2402_Data[0]=0x00;
   }
   else
    {nRF2402_flag&=0xfd; } //清除按键标志位nRF2402_flag_bit1=0
  }
/////////////////////////////
////////按键K4判断程序////////
  while(K4==0) 
  {
  delayms(100);//按键去抖
   if(K4==1) 
   {
   nRF2402_flag|=0x02; //按键标志位nRF2402_flag_bit1=1
   speakertest();
   nRF2402_Data[0]=0xff;  
   }
   else
   {nRF2402_flag&=0xfd; } //清除按键标志位nRF2402_flag_bit1=0
  }

  if((nRF2402_flag&0x02)==0x02)//判断是否有按键按下
   {
   P0=~nRF2402_Data[0];
   nRF2402_Transmit_Mode();        //设置为发送模式
   nRF2402_Transmit_Data(nRF2402_Data); //发送数据
   nRF2402_flag&=0xfd; //清除按键标志位nRF2402_flag_bit1=0  
  }
  else
  {;}
   
}

 

void main(void)
{
    delayms(1000);//开机延时
 nRF2402_Data[0] = 0x55;
    init_rs232();  //串口初始化
    TI=1;          //串口发射有效
 nRF2402_config(); //nRF2402初始化配置
    delayms(100);
 speakertest();  //蜂鸣器叫一声

    nRF2402_Transmit_Mode();            //设置为发送模式
 nRF2402_Transmit_Data(nRF2402_Data);//发送测试数据
 SBUF=0x55; //串口输出0x55 测试是否有正确的串口数据
 delayms(100);
 while (1)
 { 
     keytest();  //调用按键子程序,无线发送数据
 }
}

///////////////////////////////////////////////////////////////////////////////////////////////

头文件:nRF2402.h

/*************************************************************/
/**********************中文版本*******************************/
/*****功能描述 :  nRF2402无线收发模块应用头文件          *****/
/*****调试平台 :  51单片机  11.0592M晶振                 *****/
/*****作  者   :  郑文(ClimberWin)                       *****/
/*****编写日期 :  2010年02月20日                          *****/
/*****版本信息 :  V1.0                                   *****/
/*****修改日期 :                                         *****/
/*************************************************************/
#ifndef __nRF2402_H__
#define __nRF2402_H__

#include
#include
#define uchar unsigned char
#define uint  unsigned int

sbit nRF2402_PWR_UP = P1^4;
sbit nRF2402_CE     = P1^5;
sbit nRF2402_CS     = P1^3;
//////////////////////
sbit nRF2402_CLK   = P1^6;
sbit nRF2402_DIN   = P1^2; 
//////////////////////
//Configuration Word       datasheet(page17 of 37)
//Reserved for testing
#define ADDR_W       2*8    //发送/接收地址宽度(单位:Bit) 
#define DATA1_W        28*8      //通道1 payload数据长度设置(bit)

                           //D31 MSB
#define PLL          0x00  // D19
#define UNUSED_bit18 0x01   //未定义 必须置1
#define PREAMBLE_bit17 0x01 //Logic 0: No generation of Preamble |Logic 1: Preamble generation enabled (default) 
#define UNUSED_bit16 0x01   //未定义 必须置1
#define CRC_L        0x01    //CRC 模式  0:8 位  1:16 位 
#define CRC_EN       0x01    //CRC 校验  0:禁用  1:启用

#define CM           0x01    //0:Direct mode   1:ShockBurst mode 
#define RFDR_SB      0x00    //传输速率0:250kbps 1:1Mbps(requires 16MHZ crystal)
#define XO_F         0x03    //晶振频率 D11-D9(000:4MHZ  001:8MHZ  010:12MHZ  011:16MHZ  100:20MHZ) 
#define RF_PWR       0x03    //发射模式的输出功率D8-D7(00:-20dBm  01:-10dBm  10:-5dBm  11:0dBm)

#define RF_CH        0x02    //Channel 发射频率设置Channel=2400MHz+RF_CH * 1.0MHz  datasheet(page22 of 37) 

uchar code nRF2402_Config_Word[4] =
{
0x00,0x07,0xe7,0x82
};

uchar code Channel_Addr[]={0x34,0x12,0x00,0x00,0x00};//设置通道1地址,发射和接收必须匹配
uchar nRF2402_Data[32]; //定义nRF2402数据发送接收临时存储地址
uchar nRF2402_flag;//定义标志位,bit7-bit2 暂时保留 | bit0:是否有接收数据标志位 1:有 0:无
                                                  //| bit1:是否有按键数据标志位 1:有 0:无
void delayms(uint count); //延时程序
uchar nRF2402_Read_Byte(void); //读字节
void nRF2402_Write_Byte(uchar Send_Byte);//写字节
void nRF2402_config(void);   //参数配置
void nRF2402_Transmit_Mode(void); //设置为发射模式
void nRF2402_Transmit_Data(uchar TxBuf[]);  //nRF2402发送数据子程序


/*************延时子程序start*****************/
void delayms(unsigned int count)
{
 unsigned int i,j;
 for(i=0;i  for(j=0;j<120;j++);
}
/**************延时子程序end****************/
/************读数据子程序***********/
uchar nRF2402_Read_Byte(void)
{
  uchar i,j,temp;
  temp=0x00;
  for (i=0;i<8;i++)
   {
      nRF2402_CLK=1;
      _nop_();
      if (nRF2402_DIN==1) j=1;
      else j=0;
      temp=(temp<<1)|j;
      nRF2402_CLK=0;
   }
  return temp;
}
/************写数据子程序***********/
void nRF2402_Write_Byte(uchar Send_Byte)
{
 uchar i;
 for (i=0;i<8;i++)
   {
      Send_Byte=Send_Byte<<1;
   nRF2402_DIN=CY; //读进位数据
      nRF2402_CLK=1;
      _nop_();   
      nRF2402_CLK=0;
   }
}


/*********配置参数子程序***********/
void nRF2402_config(void)
{
 uchar i; 
//////stand by///////////// 
 nRF2402_PWR_UP=1;
    nRF2402_CE=0;
    nRF2402_CS=0;
/////////////////////////////      datasheet(page24 of 37)
 delayms(3);// PWR_DWN -> ST_BY_mode | MAX 3ms | name: Tpd2sby | 
 nRF2402_CS=1;     //进入配置模式Configuration
////4个字节的配置字////////////// datasheet(page17 of 37)
 for (i=0;i<4;i++)
 {
     nRF2402_Write_Byte(nRF2402_Config_Word[i]);
 }
 delayms(1);
 nRF2402_CS=0;    //nRF2402_CS 置低使配置有效  datasheet(page26 of 37);
}

/*********设置发射模式子程序*********/
void nRF2402_Transmit_Mode(void)
{
 //设置为Active(Tx)模式 
 nRF2402_PWR_UP=1;
 nRF2402_CE=1;
 nRF2402_CS=0;
    delayms(1); 
}

/********发送数据子程序*********/
void nRF2402_Transmit_Data(uchar temp[]) //datasheet(page22 of 37);
{
 uchar i;
 nRF2402_CE=1;
 delayms(1);
 for (i=0;i  {
  nRF2402_Write_Byte(Channel_Addr[i]);
 }
 for (i=0;iTA1_W/8);i++)//写入需要发送的数据
 {
  nRF2402_Write_Byte(temp[i]);
 }
 nRF2402_CE=0; //nRF2402_CE 置低使发送有效
 delayms(1);
}


#endif

关键字:2.4G  无线发射模块  nRF2402 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计