单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)续

时间:2021-11-06 19:47:08

二、软件部分
1>接收方程序:
主函数:
#include <reg52.h>
#include <stdio.h>
#include"NRF24L01.h"
#include <intrins.h>
void main()
{ unsigned char i=0;
unsigned char data_RX[32]={1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,
2,2,3,3,3,3,3,3,3,3,3,3,3,3};//接收到的32字节存放数组设置初值
SCON = 0x50;       //REN=1允许串行接受状态,串口工作模式1,8位收发,波特率可变       
TMOD|= 0x20;      //定时器工作方式2 ,自动重载初值                      
PCON&= 0x7f;      //波特率不加倍    
TH1 = 0xFA; //波特率等于4800、数据位8、停止位1。效验位无,晶振为11.0592MHZ
TL1 = 0xFA; 
TR1  = 1;        //开启定时器1                                                      
ES   = 1;        //开串口中断                  
EA   = 1;        // 开总中断           
NRF24L01_RX();//设置为接收模式
while(!((READ_BYTE(READ_REG+STATUS))&0x40));   //判断是否接收好32字节数据
READ_BYTES(RD_RX_PLOAD,data_RX,32);   //将32字节数据存放在数组中
CE=0;
CSN=1;
_nop_();
CSN=0;   
SPI_WRITE(FLUSH_RX);   //清空接收FIFO,否则接收数据不可预知
SCK=0;
CSN=1;
jieshouv=0;      //接收成功标志位
WRITE_BYTE(WRITE_REG+STATUS,0xFF);   //屏蔽中断位
for(i=0;i<32;i++)
{     if(data_RX[i]>=10)
  {SBUF=data_RX[i]/10+48;  //将十位转化为ASCII码发送
  while(!TI);
  TI=0;
  SBUF = data_RX[i]%10+48;       //将个位转化为ASCII码发送
       while(!TI); // 等特数据传送(TI发送中断标志)
  TI = 0;  // 清除数据传送标志
  }
  else
  {
  SBUF = data_RX[i]%10+48;       //将无符号数转为ASCII码发送
       while(!TI); // 等特数据传送(TI发送中断标志)
  TI = 0;  // 清除数据传送标志    
       }
}
while(1);
}   
****************************************************************************************************************
详情请咨询:                                                 http://shop108408772.taobao.com/
**************************************************************************************************************
子函数:
#include <reg52.h>
#include "NRF24L01.h"
#include <intrins.h>
unsigned char ADD_TX[]={0,1,2,3,4};  //通道地址
unsigned char data_TX[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
,18,19,20,21,22,23,24,25,26,27,28,29,30,31}; //发送方32字节数据
void SPI_WRITE(unsigned char canshu) //写入一个字节
{unsigned char i;
for(i=0;i<8;i++)
{SCK=0;
MOSI=(canshu&0x80)>>7; //先发高位
SCK=1;
canshu=canshu<<1;
}
}
unsigned char SPI_READ()   //读一个字节
{unsigned char canshu=0,i;
for(i=0;i<8;i++)
{canshu=canshu<<1; //先接收的为高位
SCK=0;
_nop_();
SCK=1;
canshu=canshu|MISO;
}
return canshu;
}
void WRITE_BYTE(unsigned char address,unsigned char value)//写入完整指令,单字节
{CSN=1;
_nop_();
CSN=0;
SPI_WRITE(address); //写入寄存器绝对地址
_nop_();
SPI_WRITE(value); //写入参数
SCK=0; //恢复初值
CSN=1; //恢复初值
}
unsigned char READ_BYTE(unsigned char address) //读入完整指令,单字节
{unsigned char canshu;
CSN=1;
_nop_();
CSN=0;
SPI_WRITE(address); //写入寄存器绝对地址
_nop_();
canshu=SPI_READ(); //读出数据
SCK=0;
CSN=1;
return canshu;
}
****************************************************************************************************************
详情请咨询:                                                 http://shop108408772.taobao.com/
**************************************************************************************************************
void WRITE_BYTES(unsigned char address,unsigned char *value,unsigned char width)//写入指定字节数据,多字节
{unsigned char i;
CSN=1;
_nop_();
CSN=0;
SPI_WRITE(address);  //写入寄存器绝对地址
_nop_();
for(i=0;i<width;i++)
{
SPI_WRITE(*value); //将数据依次写入
value=value+1;
}
SCK=0;
CSN=1;
}
void READ_BYTES(unsigned char address,unsigned char *value,unsigned char width)//读入指定字节数据,多字节
{unsigned char i;
CSN=1;
_nop_();
CSN=0;
SPI_WRITE(address);    //写入寄存器绝对地址
_nop_();
for(i=0;i<width;i++)
{
*value=SPI_READ();  //将数据依次读入
value=value+1;
}
SCK=0;
CSN=1;
}
/************************************************
void NRF24L01_TX()//NRF24L01设为发送模式
{   //默认NRF24L01为掉电模式
unsigned char i;
CE=0;     
WRITE_BYTE(WRITE_REG+SETUP_AW,0x03);//设置地址宽度为5字节
WRITE_BYTE(WRITE_REG+RX_PW_P0,0x20);//设置接收通道0数据宽度为32字节
WRITE_BYTES(WR_TX_PLOAD,data_TX,32);//写入发送数据
WRITE_BYTES(WRITE_REG+TX_ADDR,ADD_TX,5);//设置发送地址
WRITE_BYTES(WRITE_REG+RX_ADDR_P0,ADD_TX,5);//设置通道0地址
WRITE_BYTE(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
WRITE_BYTE(WRITE_REG+EN_AA,0x01);//使能通道0自动应答
WRITE_BYTE(WRITE_REG+SETUP_RETR,0x1a);// 自动重发次数10次
WRITE_BYTE(WRITE_REG+RF_CH,0x40);   //设置载波频率
WRITE_BYTE(WRITE_REG+RF_SETUP,0x0f); //射频参数,如 数据传输率,发射功率
WRITE_BYTE(WRITE_REG+CONFIG,0x0A);//设置发射,上电,CRC校验8位
CE=1;
for(i=0;i<10;i++);//延时30us
}
********************************************************/
void NRF24L01_RX()//NRF24L01设为接收模式
{unsigned char i;   //默认NRF24L01为掉电模式
CE=0;     
WRITE_BYTE(WRITE_REG+SETUP_AW,0x03);//设置地址宽度为5字节
WRITE_BYTE(WRITE_REG+RX_PW_P0,0x20);//设置接收通道0数据宽度为32字节


WRITE_BYTES(WRITE_REG+RX_ADDR_P0,ADD_TX,5);//设置通道0地址
WRITE_BYTE(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
WRITE_BYTE(WRITE_REG+EN_AA,0x01);//使能通道0自动应答
WRITE_BYTE(WRITE_REG+RF_CH,0x40);   //设置载波频率
WRITE_BYTE(WRITE_REG+RF_SETUP,0x0f); //射频参数,如 数据传输率,发射功率
WRITE_BYTE(WRITE_REG+CONFIG,0x0B);//设置 接收,上电,CRC校验8位
CE=1;
for(i=0;i<20;i++);//延时60us
}
****************************************************************************************************************
详情请咨询:                                                 http://shop108408772.taobao.com/
**************************************************************************************************************
1>发送方程序:
主程序:
//#include <reg52.h>
#include "stc12.h"
#include"NRF24L01.h"
#include <intrins.h>
void main()
{
CLK_DIV=0x03;
NRF24L01_TX(); //发送模式开启
while(!((READ_BYTE(READ_REG+STATUS))&0x30));//等待发送完成
CE=0;
CSN=1;
_nop_();
CSN=0;   
SPI_WRITE(FLUSH_RX);   //清空接收FIFO,否则数据不可预料
SCK=0;
CSN=1;
if((READ_BYTE(READ_REG+STATUS))&0x20)fasong=0;  // 发送成功标志位
WRITE_BYTE(WRITE_REG+STATUS,0xFF);                //屏蔽中断标志位
while(1);
}
子程序:
和接收子程序大部分一致,改动部分:
void NRF24L01_TX()//NRF24L01设为发送模式
{   //默认NRF24L01为掉电模式
unsigned char i;
CE=0;     
WRITE_BYTE(WRITE_REG+SETUP_AW,0x03);//设置地址宽度为5字节
WRITE_BYTE(WRITE_REG+RX_PW_P0,0x20);//设置接收通道0数据宽度为32字节
WRITE_BYTES(WR_TX_PLOAD,data_TX,32);//写入发送数据
WRITE_BYTES(WRITE_REG+TX_ADDR,ADD_TX,5);//设置发送地址
WRITE_BYTES(WRITE_REG+RX_ADDR_P0,ADD_TX,5);//设置通道0地址
WRITE_BYTE(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
WRITE_BYTE(WRITE_REG+EN_AA,0x01);//使能通道0自动应答
WRITE_BYTE(WRITE_REG+SETUP_RETR,0x1a);// 自动重发次数10次
WRITE_BYTE(WRITE_REG+RF_CH,0x40);   //设置载波频率
WRITE_BYTE(WRITE_REG+RF_SETUP,0x0f); //射频参数,如 数据传输率,发射功率
WRITE_BYTE(WRITE_REG+CONFIG,0x0A);//设置发射,上电,CRC校验8位
CE=1;
for(i=0;i<30;i++);//延时90us
}
将接收子程序中接收模式程序屏蔽即可。
三、测试中问题
1> main()程序是循环执行结构
2> 我所使用的串口调试助手接收的是ASCII码,否则显示乱码。

四、测试结果

单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)续

单片机基于2.4G无线收发模块NRF24L01的无线通信(基本测试通过)续

****************************************************************************************************************
详情请咨询:                                                 http://shop108408772.taobao.com/
**************************************************************************************************************