二、软件部分
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码,否则显示乱码。
四、测试结果
****************************************************************************************************************
详情请咨询: http://shop108408772.taobao.com/
**************************************************************************************************************