/****************************
张海波于2016年10月15日郑州航院
89c52单片机,11.0592MHz晶振
发射端实现18B20测温通过nRF24L0 1
无线模块将温度数据传到接收端
同时显示在1602屏幕上
****************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//*****************************NRF24L01的接收和发送地址***************************************//
#define TX_ADR_WIDTH 5 // 5个字节的TX地址长度
#define RX_ADR_WIDTH 5 // 5个字节的RX地址长度
#define TX_PLOAD_WIDTH 16 // 16个字节的TX数据长度
#define RX_PLOAD_WIDTH 16 // 16个字节的RX数据长度
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x87,0xfe,0x44,0x10,0x89}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x02}; //接收地址
//***************************************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 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栈入栈出状态寄存器设置
//nRF24L01引脚定义
sbit MOSI=P1^5;
sbit MISO=P1^6;
sbit CSN=P1^3;
sbit CE=P1^2;
sbit IRQ=P1^4;
sbit SCK=P1^7;
sbit IO_18B20 = P3^7; //DS18B20 通信引脚
uint numt=0;
uint num;
bit flag1s=1; //1s 定时标志
bit res;
int shi,ge,xiaoshu;
int temp;//读取到的当前温度值
int intT, decT; //温度值的整数和小数部分
uchar TxBuf[16]; //发送缓存
uchar bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/* 软件延时函数,延时时间(t*10)us */
void DelayX10us(unsigned char t)
{
do{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
while (--t);
}
/* 复位总线,获取存在脉冲,以启动一次读写操作 */
bit Get18B20Ack()
{
bit ack;
EA = 0; //禁止总中断
IO_18B20 = 0; //产生 500us 复位脉冲
DelayX10us(50);
IO_18B20 = 1;
DelayX10us(6); //延时 60us
ack = IO_18B20; //读取存在脉冲
while(!IO_18B20); //等待存在脉冲结束
EA = 1; //重新使能总中断
return ack;
}
/* 向 DS18B20 写入一个字节,dat-待写入字节 */
void Write18B20(unsigned char dat)
{
unsigned char mask;
EA = 0; //禁止总中断
for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 个 bit
{
IO_18B20 = 0; //产生 2us 低电平脉冲
_nop_();
_nop_();
if ((mask&dat) == 0) //输出该 bit 值
IO_18B20 = 0;
else
IO_18B20 = 1;
DelayX10us(6); //延时 60us
IO_18B20 = 1; //拉高通信引脚
}
EA = 1; //重新使能总中断
}
/* 从 DS18B20 读取一个字节,返回值-读到的字节 */
unsigned char Read18B20()
{
unsigned char dat;
unsigned char mask;
EA = 0; //禁止总中断
for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次采集 8 个 bit
{
IO_18B20 = 0; //产生 2us 低电平脉冲
_nop_();
_nop_();
IO_18B20 = 1; //结束低电平脉冲,等待 18B20 输出数据
_nop_(); //延时 2us
_nop_();
if (!IO_18B20) //读取通信引脚上的值
dat &=~mask;
else
dat |= mask;
DelayX10us(6); //再延时 60us
}
EA = 1; //重新使能总中断
return dat;
}
/* 启动一次 18B20 温度转换,返回值-表示是否启动成功 */
bit Start18B20()
{
bit ack;
ack = Get18B20Ack(); //执行总线复位,并获取 18B20 应答
if (ack == 0) //如 18B20 正确应答,则启动一次转换
{
Write18B20(0xCC); //跳过 ROM 操作
Write18B20(0x44); //启动一次温度转换
}
return~ack;//ack==0 表示操作成功,所以返回值对其取反
}
/* 读取 DS18B20 转换的温度值,返回值-表示是否读取成功 */
bit Get18B20Temp(int *temp)
{
bit ack;
unsigned char LSB, MSB; //16bit 温度值的低字节和高字节
ack = Get18B20Ack(); //执行总线复位,并获取 18B20 应答
if (ack == 0) //如 18B20 正确应答,则读取温度值
{
Write18B20(0xCC); //跳过 ROM 操作
Write18B20(0xBE); //发送读命令
LSB = Read18B20(); //读温度值的低字节
MSB = Read18B20(); //读温度值的高字节
*temp = ((int)MSB << 8) + LSB; //合成为 16bit 整型数
}
return ~ack; //ack==0 表示操作应答,所以返回值为其取反值
}
//*****************************************延时函数***************************************//
void delayus(uint us)
{
for(;us >0;us--)
{
_nop_();
}
}
void init_NRF24L01();
uchar SPI_RW(uchar num);
uchar SPI_Read(uchar reg);
void SetRX_Mode();
void SetTx_Mode();
uchar SPI_RW_Reg(uchar reg, uchar value);
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y,
unsigned char *str, unsigned char len);
//********************************NRF24L01初始化******************************************//
void init_NRF24L01()
{
delayus(100);
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_RW_Reg(WRITE_REG + EN_AA, 0x01); //通道0自动应答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //允许接收地址频道0
SPI_RW_Reg(WRITE_REG + RF_CH, 0x32); //设置信道工作频率,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为2MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x7c); //IRQ引脚不显示中断 掉电模式 1~16CRC校验
}
/****************************************************************************************************
/*函数:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI写时序
/****************************************************************************************************/
uchar SPI_RW(uchar num)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
{
MOSI = (num & 0x80); // output 'uchar', MSB to MOSI
num = (num << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high..
num |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(num); // return read uchar
}
/****************************************************************************************************
函数:uchar SPI_Read(uchar reg)
功能:NRF24L01的SPI时序
****************************************************************************************************/
uch
没有合适的资源?快使用搜索试试~ 我知道了~
nRF24l01相关代码
共97个文件
bak:16个
obj:12个
lst:12个
需积分: 10 16 下载量 130 浏览量
2017-11-29
10:20:47
上传
评论 2
收藏 231KB RAR 举报
温馨提示
资料中有3份代码,第一份、nRF24L01模块DS18B20温度数据多发一收,接收端1602显示,可按键随时设置上下限,超限后报警;第二份、用nRF24l01做的遥控下车,电机驱动用的是L298N芯片;第三份、最基础的nRF24l01一键控制接收端蜂鸣器响。
资源推荐
资源详情
资源评论
收起资源包目录
nRF24l01模块51单片机应用.rar (97个子文件)
nRF24l01应用
nRF24L01一键遥控接收端蜂鸣器响
接收
123.Uv2 2KB
Text1.c 10KB
123 13KB
123.Opt 1003B
123_Opt.Bak 1015B
123.M51 14KB
123_Uv2.Bak 0B
123.plg 180B
Text1.OBJ 15KB
123.hex 2KB
Text1.LST 17KB
发射
123.Uv2 2KB
Text1.c 10KB
123 14KB
123.Opt 1013B
123_Opt.Bak 1015B
123.M51 14KB
123_Uv2.Bak 0B
123.plg 349B
Text1.OBJ 15KB
123.hex 2KB
Text1.LST 17KB
nRF24L01遥控小车
遥控
main.OBJ 4KB
123.Uv2 2KB
main.c 2KB
nRF24L01.OBJ 13KB
main.LST 7KB
123 15KB
nRF24L01.LST 15KB
123.Opt 1KB
123_Opt.Bak 1KB
nRF24L01.c 9KB
123.M51 16KB
123_Uv2.Bak 3KB
123.plg 385B
123.hex 3KB
接收
main.OBJ 3KB
接收.hex 2KB
main.c 977B
接收.plg 362B
nRF24L01.OBJ 13KB
接收_Opt.Bak 1KB
main.LST 3KB
nRF24L01.LST 15KB
接收 14KB
nRF24L01.c 9KB
接收.M51 14KB
接收.Opt 1KB
接收.Uv2 2KB
接收_Uv2.Bak 0B
nRF24L01多发一收(可设温度上下限)
发射1
123.Uv2 2KB
Text1.c 14KB
1602.obj 4KB
123 19KB
123.Opt 1015B
123_Opt.Bak 1KB
1602.lst 4KB
123.M51 23KB
123_Uv2.Bak 2KB
123.plg 1KB
1602.c 2KB
Text1.OBJ 22KB
123.hex 4KB
Text1.LST 26KB
接收
1602.OBJ 4KB
123.lnp 53B
123.uvproj 14KB
123.Uv2.bak 2KB
Text1.c 13KB
123 25KB
123_Opt.Bak 1KB
123.build_log.htm 1005B
123.M51 27KB
123_Uv2.Bak 2KB
123.plg 175B
123.uvopt 6KB
1602.c 2KB
Text1.OBJ 25KB
123.opt.bak 1KB
123.hex 10KB
1602.LST 4KB
Text1.LST 27KB
123.uvgui.ZHB 70KB
发射2
123.Uv2 2KB
Text1.c 14KB
1602.obj 4KB
123 20KB
123.Opt 1015B
123_Opt.Bak 1015B
1602.lst 4KB
123.M51 23KB
123_Uv2.Bak 2KB
123.plg 351B
1602.c 2KB
Text1.OBJ 22KB
123.hex 4KB
Text1.LST 26KB
共 97 条
- 1
资源评论
z1512751703
- 粉丝: 23
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功