#include <reg52.H>
#include <intrins.h>
#include "NRF24L01.H"
uchar xdata RX_ADDRESS0[TX_ADR_WIDTH]={0x30,0xE6,0x45,0x82,0x7E}; //通道0地址
uchar xdata RX_ADDRESS1[TX_ADR_WIDTH]={0xC2,0x49,0x49,0x49,0x49}; //通道1地址
uchar xdata RX_ADDRESS2[TX_ADR_WIDTH]={0x94,0x49,0x49,0x49,0x49}; //通道2地址
uchar xdata RX_ADDRESS3[TX_ADR_WIDTH]={0x33,0x49,0x49,0x49,0x49}; //通道3地址
uchar xdata RX_ADDRESS4[TX_ADR_WIDTH]={0x00,0x49,0x49,0x49,0x49}; //通道4地址
uchar xdata RX_ADDRESS5[TX_ADR_WIDTH]={0x24,0x49,0x49,0x49,0x49}; //通道5地址
uchar xdata *pipe_add[6] = {RX_ADDRESS0,RX_ADDRESS1,RX_ADDRESS2,RX_ADDRESS3,RX_ADDRESS4,RX_ADDRESS5};//所有通道地址的集合
/**********************************RNF24L01状态标志位************************************************/
uchar bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void Delayms (uint a)
{
uint i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}
/*********************************************************************************************/
/***************************************************************************
函数名称:uchar SPI_RW(uchar dat)
函数功能:NRF24L01的SPI时序
函数备注:Writes one byte to nRF24L01, and return the byte read from nRF24L01 during write
***************************************************************************/
uchar SPI_RW(uchar dat)
{
uchar i;
for(i=8;i>0;i--)
{
dat <<= 1;
MOSI = CY;
SCK = 1;
dat |= MISO;
SCK = 0;
}
return(dat);
}
/***************************************************************************
函数名称:uchar SPI_Read(uchar cmd_reg)
函数功能:NRF24L01的SPI读时序
函数备注:
***************************************************************************/
uchar SPI_Read(uchar cmd_reg)
{
uchar value;
CSN = 0;
SPI_RW(cmd_reg);
value = SPI_RW(0);
CSN = 1;
return(value);
}
/***************************************************************************
函数名称:void SPI_Write_Reg(uchar cmd_reg, uchar value)
函数功能:写入NRF24L01寄寄存器
函数备注:
***************************************************************************/
void SPI_Write_Reg(uchar cmd_reg, uchar value)
{
CSN = 0;
SPI_RW(cmd_reg);
SPI_RW(value);
CSN = 1;
}
/***************************************************************************
函数名称:uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
函数功能:从NRF24L01寄存器中读出数据
函数备注:reg:为寄存器地址,pBuf:为待读出数据地址,uchar:读出数据的个数
***************************************************************************/
uchar SPI_Read_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
{
uchar status,i;
CSN = 0;
status = SPI_RW(cmd_reg);
for(i=0;i<num;i++)
pBuf[i] = SPI_RW(0);
CSN = 1;
return(status);
}
/***************************************************************************
函数名称:void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
函数功能:在NRF24L01寄存器中写入数据
函数备注:reg:为寄存器地址,pBuf:为待写入数据地址,uchar:写入数据的个数
***************************************************************************/
void SPI_Write_Buf(uchar cmd_reg, uchar *pBuf, uchar num)
{
uchar i;
CSN = 0; //SPI使能
SPI_RW(cmd_reg);
for(i=0; i<num; i++)
SPI_RW(*pBuf++);
CSN = 1; //关闭SPI
}
/***************************************************************************
函数名称:uchar nRF24L01_RxPacket(uchar* rx_buf)
函数功能:数据读取后放入rx_buf接收缓冲区中
函数备注:
***************************************************************************/
uchar nRF24L01_RxPacket(uchar* rx_buf)
{
uchar flag;
CE = 1; //很重要!启动接收!
Delayms(1);
sta=SPI_Read(READ_REG+STATUS); // 读取状态寄存其来判断数据接收状况 //寄存器前面要加是读还是写
if(RX_DR) // 判断是否接收到数据 如果置1则说明接到数据并且放置在接收缓存器
{
CE = 0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //这本来就是指令,不用加,意思说去缓存器里读
flag =1; //读取数据完成标志
}
SPI_Write_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清除中断标志
return flag;
}
/**************************************************
函数:Check_ACK(bit clear)
描述:检查接收设备有无接收到数据包,设定没有收到应答信
号是否重发
/**************************************************/
uchar Check_ACK(bit clear)
{
while(IRQ);
sta = SPI_RW(NOP); // 返回状态寄存器
if(MAX_RT)
if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
SPI_RW(FLUSH_TX); //清空寄存器,很重要!!!
SPI_Write_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志
IRQ = 1;
if(TX_DS)
return(0x01);
else
return(0x00);
}
/***************************************************************************
函数名称:void nRF24L01_TxPacket(unsigned char * tx_buf)
函数功能:发送 tx_buf中数据
函数备注:
***************************************************************************/
uchar nRF24L01_TxPacket(uchar * tx_buf)
{
uchar Return_Flag=0;
CE=0; //StandBy I模式
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据 WR_TX_PLOAD本来就是指令 不用加 将数据放入发送缓存器
CE=1; //置高CE,激发数据发送
Delayms(2);
Return_Flag = Check_ACK(1);
return Return_Flag;
}
/***************************************************************************
函数名称:void NRF24L01_Init_TX(uchar pipe)
函数功能:初始化NRF24L01
函数备注:在调用NRF24L01作为发射时,都要先调用该函数对NRF24L01进行初始化
***************************************************************************/
void NRF24L01_Init_TX(uchar pipe)//输入通道值
{
/*待机模式*/
CE=0;
CSN=1;
SCK=0;
/*装载数据*/
SPI_Write_Buf(WRITE_REG + TX_ADDR, pipe_add[pipe], TX_ADR_WIDTH);//写TX节点地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, pipe_add[pipe], RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK
/*配置寄存器*/
SPI_Write_Reg(WRITE_REG + EN_AA, 0x3F); //使能所有通道自动应答
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3F);//使能所有通道的接收地址(这两项定义的通道数不得小于当前使用的通道数,奇怪的NRF24L01+(O__O "…))
SPI_Write_Reg(WRITE_REG + RF_CH, 40);//设置RF通道为40 收发必须一致!
SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xFF);//自动重发 4000+86us 重发15次
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启 收发必须一致!
SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断
}
/***************************************************************************
函数名称:void NRF24L01_Init_RX(uchar pipe)
函数功能:初始化NRF24L01
函数备注:在调用NRF24L01作为接收时,都要先调用�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
实现功能:温度采用DS18B20,湿度采用DHT11,无线模块采用NRF24L01,显示部分用12864液晶串行显示,外部中断INT0按键与另外两个加减按键组合设置温度上限,超温蜂鸣器报警。设置上限时,首先按下KEYSET按键,12864显示温度上限:30,要调整温度报警值时先按着KEYSET按键不放,然后按加或减按键(需要按下一定时间才有反应,大概0.5S)即可实现调整温度报警值
资源推荐
资源详情
资源评论
收起资源包目录
基于51单片机+NRF24L01模块的无线温湿度监测系统设计资料(12864液晶串行显示)包含原理图PCB及源程序.rar (43个子文件)
无线温湿度监测_程序
main_test1.hex 10KB
BEEP.c 0B
main_test1.uvopt 62KB
Key.OBJ 3KB
Key.c 960B
12864.__i 51B
test1.LST 10KB
DS18B20.c 4KB
BEEP.H 98B
DELAY.C 329B
DS18B20.lst 7KB
main_test1.M51 42KB
12864.OBJ 6KB
Key.__i 49B
DHT11.LST 7KB
test1.OBJ 13KB
nRF24L01.OBJ 15KB
main_test1_uvproj.bak 14KB
DHT11.OBJ 6KB
12864.h 619B
12864.LST 3KB
nRF24L01.LST 14KB
test1.c 4KB
main_test1.plg 9KB
DELAY.lst 1KB
main_test1.uvproj 14KB
main_test1.lnp 138B
DS18B20.obj 8KB
nRF24L01.c 9KB
BEEP.OBJ 241B
Key.H 335B
Key.LST 3KB
DELAY.obj 1KB
DHT11.H 222B
DELAY.H 155B
main_test1 46KB
nRF24L01.H 3KB
DHT11.c 3KB
BEEP.LST 730B
DS18B20.H 607B
12864.c 1KB
main_test1_uvopt.bak 62KB
nRF24L01.__i 54B
共 43 条
- 1
木头1233
- 粉丝: 281
- 资源: 631
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- apache-maven-3.6.1-bin.zip
- c593f5fc-d4a7-4b43-8ab2-51afc90f3f62
- IIR滤波器参数计算函数
- WPF树菜单拖拽功能,下级目录拖到上级目录,上级目录拖到下级目录.zip
- CDH6.3.2版本hive2.1.1修复HIVE-14706后的jar包
- 鸿蒙项目实战-天气项目(当前城市天气、温度、湿度,24h天气,未来七天天气预报,生活指数,城市选择等)
- Linux环境下oracle数据库服务器配置中文最新版本
- Linux操作系统中Oracle11g数据库安装步骤详细图解中文最新版本
- SMA中心接触件插合力量(插入力及分离力)仿真
- 变色龙记事本,有NPP功能,JSONview功能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页