📄 nrf2401.c
字号:
/*******************************************
nRF2401发送程序
*******************************************/
#include <AT89X51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
#define nop5() _nop_(); _nop_(); _nop_(); _nop_(); _nop_() //延时5us
#define DATA P1_0
#define CLK P1_1
#define CS P1_2
#define CE P1_3
#define DIR P1_4 //控制74lvc4245数据流向 DIR=1:5V->3V
#define LED P1_5 //通讯
uchar Addr_r[4]={0x00,0x00,0x00,0x11}; // 地址寄存器
uchar AddrByte_cnt=4; // 地址Byte数
uchar code InitData[15]= // nRF2401 控制字 15 Byte
{ 0x00, // 通道二接收数据宽度(1Byte)(112->119) --不用
0x08, // 通道一接收数据宽度(1Byte)(104->111) --8位
0x00, // 通道二地址(A24) (5Byte) ( 64->103) --不用
0x00, // 通道二地址(A23)
0x00, // 通道二地址(A22)
0x00, // 通道二地址(A21)
0x00, // 通道二地址(A20)
0x00, // 通道一地址(A14) (5Byte) ( 24->63 ) --地址码:0x00 cccc cccc
0x00, // 通道一地址(A13)
0x00, // 通道一地址(A12)
0x00, // 通道一地址(A11)
0x00, // 通道一地址(A10)
0x83, // b7~b2:接收地址宽度,和发送端一致,不超过40bit ( 18->23 ) --地址码长度:32
// b1~b0:CRC模式选择(01-8bit;11-16bit;00/10-no) ( 16->17 ) --CRC使能,CRC16
0x4F, // b15:接收通道选择(0-通道1;1-通道1和2) ( 15 ) --单频道
// b14:收发模式(0-Direct模式,1-ShockBurst模式) ( 14 ) --突发模式
// b13:波特率选择(0-250Kbps;1-1Mbps) ( 13 ) --250Kbps
// b12~b10:晶振选择(000-4M;001-8M;010-12M;011-16M) ( 10->12 ) --16M
// b9~b8:发射功率(11-0db) ( 8 -> 9 ) --0db
0x04 // b7~b1:发射频率配置 ( 1 -> 7 ) --2402M
// b0:收发控制(0-发送;1-接收) ( 0 ) --发送状态
};
/*******************************************
函数声明
*******************************************/
void Delay_ms(uchar n);
void nRF2401_init(void);
void nRF2401_WriteByte(uchar b);
void nRF2401_SendByte(uchar d);
/************************************************************
延时子程序
*************************************************************/
void main(void)
{
uchar a[10]={1,12,23,34,45,56,67,78,89,90};
uchar m,n;
uint k;
LED=1;
DIR=1; //控制74lvc4245数据流向 DIR=1:5V->3V
nRF2401_init();
while(1)
for(m=0;m<10;m++)
{
LED=0;
nRF2401_SendByte(a[m]); //发送地址和数据
for(k=0;k<5000;k++);
for(k=0;k<5000;k++);
LED=1;
for(k=0;k<5000;k++);
for(k=0;k<5000;k++);
}
}
/************************************************************
延时子程序
*************************************************************/
void Delay_ms(uchar n)
{ uchar i;
while(n--)
for(i = 0; i<122; i++) //延时n ms
{ ; }
}
/************************************************************
语法格式: void nRF2401_init(void)
实现功能: 初始化nRF2401
参数: 无
返回值: 无
*************************************************************/
void nRF2401_init(void)
{
uchar i;
CLK=0; //时钟线初始化
CE=0;
CS=1; //置配置模式
nop5();
nop5(); //延时10us
for(i=0;i<15;i++)
nRF2401_WriteByte(InitData[i]);
nop5();
CS=0;
CE=1; //置发送模式
}
/************************************************************
语法格式: void nRF2401_WriteByte(unsigned int b)
实现功能: 向nRF2401A写入一个字节数据
参数: uchar b: 待写入数据
返回值: 无
*************************************************************/
void nRF2401_WriteByte(uchar b)
{
uchar i; // 发送数据为一个字节(8位)
for(i=0;i<8;i++)
{ if ((b<<i)&0x80) DATA = 1; //先发送高位
else DATA = 0;
nop; //延时1us
CLK=1; //上升沿有效
nop;
nop;
CLK=0;
nop;
}
}
/************************************************************
语法格式: void nRF2401_SendByte(uchar d)
实现功能: 将目标地址+字节数据写入nRF2401
参数: uchar d: 待发送字节数据
返回值: 无
*************************************************************/
void nRF2401_SendByte(uchar d)
{
uchar i;
CS=0;
CE=1;
nop5();
nop5();
for(i=0; i<AddrByte_cnt; i++) //AddrByte_cnt为主机地址字节数
nRF2401_WriteByte(Addr_r[i]); //主机地址
nRF2401_WriteByte(d); //d为待发数据
nop5();
CE=0; //CE置低,激活nRF2401发送数据d
Delay_ms(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -