NRF24L01一个月了,实在不知道怎么办了。电源保证3.3V。
代码如下实在不知道哪错了,求助求助。
发送:
#include <reg51.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//引脚定义
//====================================
sbit IRQ =P1^0;
sbit MISO =P1^1;
sbit MOSI =P1^2;
sbit SCK =P1^3;
sbit CE =P1^5;
sbit CSN =P1^4;
sbit LED=P1^6;
//============ 状态标志 =============
uint bdata sta; //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
//================== NRF24L01的接收和发送地址 ===================
#define TX_ADR_WIDTH 5 // 5个字节的TX地址长度
#define RX_ADR_WIDTH 5 // 5个字节的RX地址长度
#define TX_PLOAD_WIDTH 32 // ?个字节的TX数据长度
#define RX_PLOAD_WIDTH 32 // ?个字节的RX数据长度
//================== NRF24L01寄存器指令 =======================
#define READ_REG 0x00 // 读寄存器
#define WRITE_REG 0x20 // 写寄存器
#define RD_RX_PLOAD 0x61 // 读取接收数据
#define WR_TX_PLOAD 0xA0 // 写待发数据
#define FLUSH_TX 0xE1 // 冲洗发送 FIFO
#define FLUSH_RX 0xE2 // 冲洗接收 FIFO
#define REUSE_TX_PL 0xE3 // 定义重复装载数据
#define NOP 0xFF // 保留
//================== SPI(nRF24L01)寄存器地址 =====================
#define NRF_CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01 // 自动应答功能设置
#define EN_RXADDR 0x02 // 可用信道设置
#define SETUP_AW 0x03 // 收发地址宽度设置
#define SETUP_RETR 0x04 // 自动重发功能设置
#define RF_CH 0x05 // 工作频率设置
#define RF_SETUP 0x06 // 发射速率、功耗功能设置
#define STATUS 0x07 // 状态寄存器
#define OBSERVE_TX 0x08 // 发送监测功能
#define CD 0x09 // 地址检测
#define RX_ADDR_P0 0x0A // 频道0接收数据地址
#define RX_ADDR_P1 0x0B // 频道1接收数据地址
#define RX_ADDR_P2 0x0C // 频道2接收数据地址
#define RX_ADDR_P3 0x0D // 频道3接收数据地址
#define RX_ADDR_P4 0x0E // 频道4接收数据地址
#define RX_ADDR_P5 0x0F // 频道5接收数据地址
#define TX_ADDR 0x10 // 发送地址寄存器
#define RX_PW_P0 0x11 // 接收频道0接收数据长度
#define RX_PW_P1 0x12 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
//==============================
//收发缓存数组
//=====================
//函数声明
//=====================
/*
#define uchar unsigned char
#define uint unsigned int
*/
#endif
//===============
//延时函数
//===============
uchar idata nrf_sta;
uchar idata RxBuf[32] = "0"; //接收缓存 存入idata区
uchar idata TxBuf[32] = "0"; //发送缓存
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//===== 粗略的延时 =====
//================== NRF24L01初始化 ==================
//=============================================
//SPI读写函数,往MOSI引脚写入一个字节,同时从MISO引脚读取一个字节
//=============================================
void delay(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
uchar SPI_RW(uchar num)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI = (num & 0x80);
num = (num << 1);
SCK = 1;
num |= MISO;
SCK = 0;
}
return(num);
}
//=============================================
//SPI读寄存器函数。只有一个功能:读取reg的值并返回
//先写入寄存器地址,使SPI器件定位到该地址,
//下一次读取取出该寄存器的值,并返回该值。
//=============================================
uchar SPI_Read_Reg(uchar reg)
{
uchar reg_val;
CSN = 0;
SPI_RW(reg);
reg_val = SPI_RW(0);//此处的0没有什么意义,可以是1,2,3,……
CSN = 1;
return (reg_val);
}
//=============================================
//SPI写寄存器函数。主要功能:往reg中写入value
//附加功能:返回寄存器的状态字
//=============================================
uchar SPI_Write_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0;
status = SPI_RW(reg);
SPI_RW(value);
CSN = 1;
return(status);
}
//====================================
//将SPI设备缓冲区的数据读入单片机,并保存到数组中
//连续读取nBytes个字节
//====================================
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;
CSN = 0;
status = SPI_RW(reg);
for(i = 0;i < nBytes;i++)
pBuf[i] = SPI_RW(0);
CSN = 1;
return(status);
}
//====================================
//将单片机有nBytes个成员的数组写入SPI设备的reg寄存器
//====================================
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;
CSN = 0;
status = SPI_RW(reg);
for(i = 0; i < nBytes;i++)
SPI_RW(pBuf[i]);
CSN = 1;
return(status);
}
void init_NRF24L01(void)
{
delay(10);
CE = 0; // 片选使能
CSN = 1; // SPI使能
SCK = 0; // SPI时钟拉低
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); //写接收端地址
SPI_Write_Reg(WRITE_REG + EN_AA, 0x01); //通道0自动应答
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); //允许接收地址频道0
SPI_Write_Reg(WRITE_REG + RF_CH, 0x44); //设置信道工作频率,收发必须一致
SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7c); //IRQ引脚不显示中断 掉电模式 1~16CRC校验
}
//==================
//读取状态标志
//==================
void get_nrf_sta(void)
{
nrf_sta = SPI_Read_Reg(STATUS);
SPI_Write_Reg(WRITE_REG+STATUS,nrf_sta);
}
//==================
//设置为接收模式
//==================
void nrf_RxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_RX,0x00); //清除RX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7f);//IRQ引脚不显示中断 上电 接收模式 1~16CRC校验
CE = 1;
delay(10);
}
//==================
//把接收到的数据存入数组
//==================
void nrf_read(uchar *rx_buf)
{
if(RX_DR == 1) //收到数据
{
CE = 0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//读取数据 存入数组
SPI_Write_Reg(FLUSH_RX,0x00);//清除rx fifo寄存器
CE = 1;
delay(10);
}
}
//==================
//设置为发送模式
//==================
void nrf_TxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_TX,0x00); //清除TX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG,0x7e); //IRQ引脚不显示中断 上电 发射模式 1~16CRC校验
CE = 1;
delay(10);
}
//==================
//发送 不做任何判断只管发送
//==================
void nrf_trans(uchar *tx_buf)
{
CE = 0; //StandBy I模式
SPI_Write_Reg(WRITE_REG+STATUS,0xFF); //清除所有中断
SPI_Write_Reg(FLUSH_TX,0x00); //清除tx fifo寄存器 //===== 重要 =====
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // 装载数据
CE = 1; //置高CE激发数据发送
delay(10); //此延时必须有 因为从待机模式到收发模式需要时间,最大需要130us
}
//=========================
//将float数编码装载 保留4位小数
//占用5个字节 数据范围+- 65535.9999
//=========================
void nrf_load_float(uchar a,float num)
{
if(num > 0)
{
TxBuf[a] = '+';
TxBuf[a+1] = (uint)num/256;
TxBuf[a+2] = (uint)num%256;
TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else if(num < 0)
{
num = -num;
TxBuf[a] = '-';
TxBuf[a+1] = (uint)num/256;
TxBuf[a+2] = (uint)num%256;
TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else
{
TxBuf[a] = '0';
TxBuf[a+1] = 0;
TxBuf[a+2] = 0;
TxBuf[a+3] = 0;
TxBuf[a+4] = 0;
}
}
//=======================
//将接收到的float数组解码
//占用5个字节 数据范围+- 65535.9999
//=======================
float nrf_unload_float(uchar a)
{
float num;
if(RxBuf[a] == '+'){
num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
}
else if(RxBuf[a] == '-'){
num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
num = -num;
}
else if(RxBuf[a] == '0')
num = 0;
return (num);
}
//=======================
//将float数编码装载 保留2位小数
//占用3个字节 数据范围+- 255.99
//=======================
void nrf_load_sfloat(uchar a,float num)
{
if(num > 0){
TxBuf[a] = '+';
TxBuf[a+1] = (uchar)num; //转换成uchar类型,自动将保留低8位,去除高位。
TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else if(num < 0){
num = -num;
TxBuf[a] = '-';
TxBuf[a+1] = (uchar)num;
TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else{
TxBuf[a] = '0';
TxBuf[a+1] = 0;
TxBuf[a+2] = 0;
}
}
//=======================
//将float数解码 保留2位小数
//占用3个字节 数据范围+- 255.99
//======================
float nrf_unload_sfloat(uchar a) //a是数据包在数组内的起始位置
{
float num;
if(RxBuf[a] == '+'){
num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
}
else if(RxBuf[a] == '-'){
num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
num = -num;
}
else if(RxBuf[a] == '0')
num = 0;
return (num);
}
//======================
//主函数
//======================
void main(void)
{
uint while_times = 0;
init_NRF24L01();
LED=0;
delay(30);
while(1)
{
//===== 发送模式 =====
nrf_TxMod();
TxBuf[0] = 1; //把1存入TxBuf[0]中,然后发送出去;接收程序判断RxBuf[0]的值,等于1的话点亮LED //【注:RxBuf数组和TxBuf数组中的元素是对应的】
nrf_trans(TxBuf); //将待发送的数据写入NRF24L01
get_nrf_sta(); //获取状态标志
if(TX_DS == 1) //发送成功,跳出循环
{
TX_DS=0;
LED=1;
delay(30);
LED=0;
}
}
}
接收:
#include <reg51.h>
#include <intrins.h>
//=========================================================================
//========== NRF24L01 IO端口定义 ==========
//SPI相关引脚在SPI.H文件内定义
//====================================
typedef unsigned char uchar;
typedef unsigned int uint;
//引脚定义
//====================================
sbit IRQ =P1^0;
sbit MISO =P1^1;
sbit MOSI =P1^2;
sbit SCK =P1^3;
sbit CE =P1^5;
sbit CSN =P1^4;
sbit LED=P1^6;
//============ 状态标志 =============
uint bdata sta; //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
//================== NRF24L01的接收和发送地址 ===================
#define TX_ADR_WIDTH 5 // 5个字节的TX地址长度
#define RX_ADR_WIDTH 5 // 5个字节的RX地址长度
#define TX_PLOAD_WIDTH 32 // ?个字节的TX数据长度
#define RX_PLOAD_WIDTH 32 // ?个字节的RX数据长度
//================== NRF24L01寄存器指令 =======================
#define READ_REG 0x00 // 读寄存器
#define WRITE_REG 0x20 // 写寄存器
#define RD_RX_PLOAD 0x61 // 读取接收数据
#define WR_TX_PLOAD 0xA0 // 写待发数据
#define FLUSH_TX 0xE1 // 冲洗发送 FIFO
#define FLUSH_RX 0xE2 // 冲洗接收 FIFO
#define REUSE_TX_PL 0xE3 // 定义重复装载数据
#define NOP 0xFF // 保留
//================== SPI(nRF24L01)寄存器地址 =====================
#define NRF_CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01 // 自动应答功能设置
#define EN_RXADDR 0x02 // 可用信道设置
#define SETUP_AW 0x03 // 收发地址宽度设置
#define SETUP_RETR 0x04 // 自动重发功能设置
#define RF_CH 0x05 // 工作频率设置
#define RF_SETUP 0x06 // 发射速率、功耗功能设置
#define STATUS 0x07 // 状态寄存器
#define OBSERVE_TX 0x08 // 发送监测功能
#define CD 0x09 // 地址检测
#define RX_ADDR_P0 0x0A // 频道0接收数据地址
#define RX_ADDR_P1 0x0B // 频道1接收数据地址
#define RX_ADDR_P2 0x0C // 频道2接收数据地址
#define RX_ADDR_P3 0x0D // 频道3接收数据地址
#define RX_ADDR_P4 0x0E // 频道4接收数据地址
#define RX_ADDR_P5 0x0F // 频道5接收数据地址
#define TX_ADDR 0x10 // 发送地址寄存器
#define RX_PW_P0 0x11 // 接收频道0接收数据长度
#define RX_PW_P1 0x12 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
//==============================
//收发缓存数组
//=====================
//函数声明
//=====================
/*
#define uchar unsigned char
#define uint unsigned int
*/
#endif
//===============
//延时函数
//===============
uchar idata nrf_sta;
uchar idata RxBuf[32] = "0"; //接收缓存 存入idata区
uchar idata TxBuf[32] = "0"; //发送缓存
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//===== 粗略的延时 =====
//================== NRF24L01初始化 ==================
//=============================================
//SPI读写函数,往MOSI引脚写入一个字节,同时从MISO引脚读取一个字节
//=============================================
void delay(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
uchar SPI_RW(uchar num)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI = (num & 0x80);
num = (num << 1);
SCK = 1;
num |= MISO;
SCK = 0;
}
return(num);
}
//=============================================
//SPI读寄存器函数。只有一个功能:读取reg的值并返回
//先写入寄存器地址,使SPI器件定位到该地址,
//下一次读取取出该寄存器的值,并返回该值。
//=============================================
uchar SPI_Read_Reg(uchar reg)
{
uchar reg_val;
CSN = 0;
SPI_RW(reg);
reg_val = SPI_RW(0);//此处的0没有什么意义,可以是1,2,3,……
CSN = 1;
return (reg_val);
}
//=============================================
//SPI写寄存器函数。主要功能:往reg中写入value
//附加功能:返回寄存器的状态字
//=============================================
uchar SPI_Write_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0;
status = SPI_RW(reg);
SPI_RW(value);
CSN = 1;
return(status);
}
//====================================
//将SPI设备缓冲区的数据读入单片机,并保存到数组中
//连续读取nBytes个字节
//====================================
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;
CSN = 0;
status = SPI_RW(reg);
for(i = 0;i < nBytes;i++)
pBuf[i] = SPI_RW(0);
CSN = 1;
return(status);
}
//====================================
//将单片机有nBytes个成员的数组写入SPI设备的reg寄存器
//====================================
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar nBytes)
{
uchar status;
uchar i;
CSN = 0;
status = SPI_RW(reg);
for(i = 0; i < nBytes;i++)
SPI_RW(pBuf[i]);
CSN = 1;
return(status);
}
void init_NRF24L01(void)
{
delay(10);
CE = 0; // 片选使能
CSN = 1; // SPI使能
SCK = 0; // SPI时钟拉低
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //写发送地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); //写接收端地址
SPI_Write_Reg(WRITE_REG + EN_AA, 0x01); //通道0自动应答
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); //允许接收地址频道0
SPI_Write_Reg(WRITE_REG + RF_CH, 0x44); //设置信道工作频率,收发必须一致
SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7c); //IRQ引脚不显示中断 掉电模式 1~16CRC校验
}
//==================
//读取状态标志
//==================
void get_nrf_sta(void)
{
nrf_sta = SPI_Read_Reg(STATUS);
SPI_Write_Reg(WRITE_REG+STATUS,nrf_sta);
}
//==================
//设置为接收模式
//==================
void nrf_RxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_RX,0x00); //清除RX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG, 0x7f);//IRQ引脚不显示中断 上电 接收模式 1~16CRC校验
CE = 1;
delay(10);
}
//==================
//把接收到的数据存入数组
//==================
void nrf_read(uchar *rx_buf)
{
if(RX_DR == 1) //收到数据
{
CE = 0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//读取数据 存入数组
SPI_Write_Reg(FLUSH_RX,0x00);//清除rx fifo寄存器
CE = 1;
delay(10);
}
}
//==================
//设置为发送模式
//==================
void nrf_TxMod(void)
{
CE = 0;
SPI_Write_Reg(WRITE_REG+STATUS,0xff); //清除中断标志
SPI_Write_Reg(FLUSH_TX,0x00); //清除TX_FIFO寄存器
SPI_Write_Reg(WRITE_REG + NRF_CONFIG,0x7e); //IRQ引脚不显示中断 上电 发射模式 1~16CRC校验
CE = 1;
delay(10);
}
//==================
//发送 不做任何判断只管发送
//==================
void nrf_trans(uchar *tx_buf)
{
CE = 0; //StandBy I模式
SPI_Write_Reg(WRITE_REG+STATUS,0xFF); //清除所有中断
SPI_Write_Reg(FLUSH_TX,0x00); //清除tx fifo寄存器 //===== 重要 =====
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); // 装载数据
CE = 1; //置高CE激发数据发送
delay(10); //此延时必须有 因为从待机模式到收发模式需要时间,最大需要130us
}
//=========================
//将float数编码装载 保留4位小数
//占用5个字节 数据范围+- 65535.9999
//=========================
void nrf_load_float(uchar a,float num)
{
if(num > 0)
{
TxBuf[a] = '+';
TxBuf[a+1] = (uint)num/256;
TxBuf[a+2] = (uint)num%256;
TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else if(num < 0)
{
num = -num;
TxBuf[a] = '-';
TxBuf[a+1] = (uint)num/256;
TxBuf[a+2] = (uint)num%256;
TxBuf[a+3] = (uint)((num - (int)num)*10000)/256;
TxBuf[a+4] = (uint)((num - (int)num)*10000)%256;
}
else
{
TxBuf[a] = '0';
TxBuf[a+1] = 0;
TxBuf[a+2] = 0;
TxBuf[a+3] = 0;
TxBuf[a+4] = 0;
}
}
//=======================
//将接收到的float数组解码
//占用5个字节 数据范围+- 65535.9999
//=======================
float nrf_unload_float(uchar a)
{
float num;
if(RxBuf[a] == '+'){
num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
}
else if(RxBuf[a] == '-'){
num = RxBuf[a+1]*256 + RxBuf[a+2]+ (float)((int)RxBuf[a+3]*256 + RxBuf[a+4])/10000.0;
num = -num;
}
else if(RxBuf[a] == '0')
num = 0;
return (num);
}
//=======================
//将float数编码装载 保留2位小数
//占用3个字节 数据范围+- 255.99
//=======================
void nrf_load_sfloat(uchar a,float num)
{
if(num > 0){
TxBuf[a] = '+';
TxBuf[a+1] = (uchar)num; //转换成uchar类型,自动将保留低8位,去除高位。
TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else if(num < 0){
num = -num;
TxBuf[a] = '-';
TxBuf[a+1] = (uchar)num;
TxBuf[a+2] = (uint)((num - (int)num)*100);
}
else{
TxBuf[a] = '0';
TxBuf[a+1] = 0;
TxBuf[a+2] = 0;
}
}
//=======================
//将float数解码 保留2位小数
//占用3个字节 数据范围+- 255.99
//======================
float nrf_unload_sfloat(uchar a) //a是数据包在数组内的起始位置
{
float num;
if(RxBuf[a] == '+'){
num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
}
else if(RxBuf[a] == '-'){
num = RxBuf[a+1]+ (float)RxBuf[a+2]/100;
num = -num;
}
else if(RxBuf[a] == '0')
num = 0;
return (num);
}
//======================
//主函数
//======================
void main(void)
{
uint while_times = 0;
init_NRF24L01();
LED=0;
delay(30);
while(1)
{
nrf_RxMod();
get_nrf_sta(); //获取状态标志
if(RX_DR == 1) //接收成功
{
LED=1;
delay(30); //跳出循环
LED=0;
}
}
}
求助求助,QQ514509535
|