/******************************************************************************************************
*【文件名称】 : 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
2.4G无线通信模块(接收端代码+发射端代码).zip
需积分: 50 44 浏览量
2019-07-12
22:45:06
上传
评论 24
收藏 68KB ZIP 举报
Kevin_8_Lee
- 粉丝: 430
- 资源: 6
最新资源
- 基于Matlab人脸肤色定理的教师人数统计+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab霍夫曼变换的表盘读数识别+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab火灾烟雾检测源码带GUI界面+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab的恶劣天气交通标志识别系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB的霍夫曼变换的表盘示数识别+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab的车道线识别系统 +源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB的教室人数统计系统带Gui界面+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB的教室人数统计系统带Gui界面+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于MATLAB 的霍夫曼变换答题卡识别源码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab+bp神经网络的神经网络汉字识别系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈