/******************************************************************************************************
*【文件名称】 : main.c
*【文件描述】 : nRF24L01 2.4G无线通信模块接收端代码
*【文件功能】 : 51单片机 2.4G模块代码发射端功能
*【版权声明】 : 版权所有(C)李光辉。保留所有权利
Copyright (C) Kevin_Lee.All Rights Reserved
*【主控芯片】 : STC89C52
*【实验平台】 : 51单片机开发板
*【编写环境】 : Keil V3
*【编写时间】 : 2019-07-12
*【作 者】 : 李剀(KevinLee)
*【历史记录】 :
PS:该注释禁止删除
*******************************************************************************************************/
#include "reg52.h"
#include "string.h"
// 宏定义
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度
// LED灯及按键位定义
sbit LED = P1^0;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
sbit BEEP = P2^3;
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH];
uchar flag;
uchar DATA = 0x01;
uchar bdata sta;// 状态寄存器
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
// NRF24L01 模块引脚位定义
sbit CE = P1^2;
sbit CSN = P1^3;
sbit SCK = P1^7;
sbit MOSI = P1^5;
sbit MISO = P1^6;
sbit IRQ = P1^4;
/*
SPI(nRF24L01) 指令设置
指令格式
<命令字 : 由高位到低位(每字节)>
<数据字节: 低字节到高字节,每一字节高位在前>
*/
#define READ_REG 0x00 // Define read command to register
#define WRITE_REG 0x20 // Define write command to register
#define RD_RX_PLOAD 0x61 // Define RX payload register address
#define WR_TX_PLOAD 0xA0 // Define TX payload register address
#define FLUSH_TX 0xE1 // 清除 TX FIFO寄存器 应用于发射模式下
#define FLUSH_RX 0xE2 // 清除 RX FIFO寄存器 应用于接收模式下。
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据。 当CE=1,数据包被不断重新发射 发射过程中必须禁止数据包重利用功能
#define NOP 0xFF // 空操作。可以用来读状态寄存器
/*
SPI(nRF24L01) registers(addresses)
一下寄存器都是默认只使用 数据通道0 不开启其他通道
*/
#define CONFIG 0x00 // 'Config' register address
#define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address
#define EN_RXADDR 0x02 // 'Enabled RX addresses' register address
#define SETUP_AW 0x03 // 'Setup address width' register address
#define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address
#define RF_CH 0x05 // 'RF channel' register address
#define RF_SETUP 0x06 // 'RF setup' register address
#define STATUS 0x07 // 'Status' register address
#define OBSERVE_TX 0x08 // 'Observe TX' register address
#define CD 0x09 // 'Carrier Detect' register address
#define RX_ADDR_P0 0x0A // 'RX address pipe0' register address
#define RX_ADDR_P1 0x0B // 'RX address pipe1' register address
#define RX_ADDR_P2 0x0C // 'RX address pipe2' register address
#define RX_ADDR_P3 0x0D // 'RX address pipe3' register address
#define RX_ADDR_P4 0x0E // 'RX address pipe4' register address
#define RX_ADDR_P5 0x0F // 'RX address pipe5' register address
#define TX_ADDR 0x10 // 'TX address' register address
#define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address
#define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address
#define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address
#define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address
#define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address
#define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address
#define FIFO_STATUS 0x17 // 'FIFO Status Register' register address
// 毫秒级延时
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
// led闪烁
void blink(char i)
{
while(i--)
{
LED = 1;
delay_ms(500);
LED = 0;
delay_ms(500);
}
}
// 初始化IO
void init_io(void)
{
CE = 0; // 待机
CSN = 1; // SPI禁止
SCK = 0; // SPI时钟置低
IRQ = 1; // 中断复位
LED = 1; // 关闭指示灯
}
/*******************************************************************
@func : SPI_RW(uchar byte)
@brief : 写一个字节到24L01 同时读出一个字节
@pram : byte : 要写入24l01的字节
@retval : 返回读取的字节
@NOTE : 其他提示
*******************************************************************/
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
// output 8-bits
for (bit_ctr = 0; bit_ctr < 8; bit_ctr++)
{
MOSI = (byte & 0x80); // output ‘byte’ MSB to MOSI
byte = (byte << 1); // shift next bit into MSB..
SCK = 1; // Set SCK high.. 24L01 read 1-bit from MOSI and output 1-bit to MISO
byte |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return (byte); // return read byte
}
/*******************************************************************
@func : SPI_RW_Reg(BYTE reg, BYTE value)
@brief : 向寄存器reg写一个字节,同时返回状态字节
@pram : reg : 要写数据的寄存器地址
value: 要写入寄存器的数据
@retval : 返回状态寄存器
@NOTE : 其他提示
*******************************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0; // CSN low, init SPI transaction, start transmitting data
status = SPI_RW(reg); // select register and return status byte
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again, transmission end
return(status); // return nRF24L01 status byte
}
/*******************************************************************
@func : SPI_Read(uchar reg)
@brief : 从reg寄存器读一字节
@pram : reg : 要读取数据的寄存器地址
@retval : 返回寄存器数据
*******************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0; // CSN置低,开始传输数据
SPI_RW(reg); // 选择寄存器
reg_val = SPI_RW(0); // 然后从该寄存器读数据
CSN = 1; // CSN拉高,结束数据传输
return(reg_val); // 返回寄存器数据
}
/*******************************************************************
@func : SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
@brief : 从reg寄存器读 bytes 个字节 通常用来读取接收通道
@pram : reg : 要从中读取数据的寄存器
pBuf : 存储读取的数据
bytes: 读取的字节数
@retval : 返回状态寄存器
@NOTE : 其他提示
*******************************************************************/
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status, byte_ctr;
CSN = 0; // Set CSN low, init SPI tranaction
status = SPI_RW(reg); // Select register to read & return status byte
for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0); //逐个字节从nRF24L01读出
CSN = 1; // set CSN high, stop transaction
return(st

Kevin_8_Lee
- 粉丝: 480
最新资源
- 科技资源供给不足如何解决?如何借助AI+数智应用寻找高招?.docx
- 面对科技平台可持续性挑战,有哪些创新的AI+数智应用方案?.docx
- 面对科技平台诸多困境,怎样的AI+数智应用方案能破局?.docx
- 企业科技创新服务如何借助AI+数智应用破解资源匮乏与服务失效的难题?.docx
- 企业如何借助AI+数智应用快速提升资质荣誉并增强市场竞争力?.docx
- 企业数字化升级中,科技服务机构如何借助AI+数智应用让自身服务更具竞争力?.docx
- 企业数字化升级中,科技服务机构如何借助AI+数智应用助力?.docx
- 企业专利挖掘与培育中,如何利用AI+数智应用应对常见难点?.docx
- 企业智能化转型咨询如何借助AI+数智应用帮助科技服务机构实现业务升级?.docx
- 企业智能化转型咨询中,如何借助AI+数智应用助力科技服务机构提升产品差异化?.docx
- 如何借助AI+数智应用保障科技平台的可持续发展?.docx
- 如何借助AI+数智应用构建科技服务机构的体系性核心竞争力?.docx
- 如何借助AI+数智应用加速科技成果转化,提升服务差异化?.docx
- 如何借助AI+数智应用提升科技服务机构的产品差异化竞争力?.docx
- 如何借助AI+数智应用量化技术转移机构的服务价值,以增强竞争力?.docx
- 如何借助需求导向的AI+数智应用技转服务实现科技平台的可持续发展?.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


