NRF2401无线模块的驱动程序源码,能够用于STC,51等单片机驱动,具有很高的学习参考利用价值。
1.nRF2401是3.3V供电的,电压过低或过高都会对通信造成影响,要么不能完全通信要么断断续续地通信,至于怎么稳压到3.3V,可以采用稳压二级管,可以使用LM317,这几种方法都试用过,都可行。
2.一般的微处理器的I/O口电压为5V,而2401的I/O口电压为3.3V,若直接相连,容易烧坏2401,可以采用串连2K电阻的方法,也可以使用3.3V和5V电平转换芯片如74LVX3245。
3.至于程序部分,一两句话也说不清楚,请仔细阅读nRF2401的使用说明书。下面公布一段2401程序仅供参考,此程序多次修改,久经考验,应该没有问题。
2401.h下面的代码
//说明:nRF2401 CE脚控制收发使能,CS控制片选,均为高电平有效
//===============引脚定义=======================
#define nRF2401_CE_PORT PORTD.1//
#define nRF2401_CE_DDR DDRD.1//
#define nRF2401_PWR_PORT PORTD.0//
#define nRF2401_PWR_DDR DDRD.0//
#define nRF2401_CS_PORT PORTD.3//
#define nRF2401_CS_DDR DDRD.3//
#define nRF2401_CLK1_PORT PORTD.5//
#define nRF2401_CLK1_DDR DDRD.5//
#define nRF2401_DATA1_PORT PORTD.4
#define nRF2401_DATA1_DDR DDRD.4
#define nRF2401_DATA1_PIN PIND.4
#define nRF2401_DR1_PORT PORTD.2//
#define nRF2401_DR1_DDR DDRD.2//
#define nRF2401_DR1_PIN PIND.2//
unsigned char Address[4]={0x00,0x00,0x00,0x99};
//===================配置字定义================================
unsigned char nRF2401_InitData[15]={ //设配置字 //test
8,8, //通道2与通道1数据宽度设置为8位
0,0,0,0,57, //通道2接收地址
0x00,0x00,0x00,0x00,0x99, //通道1接收地址
0x83, //通道1和通道2地址宽度为32位,开CRC,16位,CRC 校验
0x6F, //4F //双频道功能禁用,ShockBurst mode,传输速率1M,晶振频率16M
0x02 //Channel = 2400MHz + RF_CH * 1.0MHz ,发送模式
}; //0:Tx 1:Rx
//===========================================================
//===================发送单字节数据==============================
void nRF2401_SendByte(unsigned char Data)
{
unsigned char i;
nRF2401_DATA1_DDR = 1;
for(i=0;i<8;i++)
{
if((Data&0x80)!=0)
nRF2401_DATA1_PORT=1;
else nRF2401_DATA1_PORT=0;
delay_us(1); //最小500ns
nRF2401_CLK1_PORT=1;
delay_us(1);//最小500ns
Data<<=1;
nRF2401_CLK1_PORT=0;
delay_us(1);
}
}
//===========================================================
//==================从nRF2401A数据缓冲区读取数据==================
void nRF2401_GetData(unsigned char *DataBuffer)
{
unsigned char i=0,temp=0;
nRF2401_DATA1_DDR = 0;//数据输入
while(nRF2401_DR1_PIN)
{
for(i=0;i<8;i++)
{
temp<<=1;
nRF2401_CLK1_PORT=1;delay_us(1);
temp|=nRF2401_DATA1_PIN;
nRF2401_CLK1_PORT=0;delay_us(1);
}
}
*DataBuffer=temp;
}
//=====================nRF2401A发送/接收方式设置=================
//Mode=0:发送方式 Mode=1:接收方式
void nRF2401_SetMode(unsigned char Mode)
{
nRF2401_PWR_PORT=1;nRF2401_CE_PORT=0;nRF2401_CS_PORT=1;//设置模式
nRF2401_DATA1_DDR = 1;
delay_us(10); //最小5us进入配置模式
nRF2401_DATA1_PORT=Mode;
nRF2401_CLK1_PORT=1;delay_us(1);
nRF2401_CLK1_PORT=0;delay_us(1); //写入最低配置位
nRF2401_PWR_PORT=1;nRF2401_CS_PORT=0;nRF2401_CE_PORT=1; //进入收发模式、
delay_us(300);
}
//===========================================================
//====================数据发送=================================
void nRF2401_SendData(unsigned char *Address,unsigned char DataBuffer)
{
unsigned char i=4;
nRF2401_PWR_PORT=1;nRF2401_CS_PORT=0;nRF2401_CE_PORT=1; //进入收发模式
delay_us(10);
while(i--)nRF2401_SendByte(*Address++); //发送地址字节
nRF2401_SendByte(DataBuffer); //发送数据字节
nRF2401_CE_PORT=0; //发射数据
delay_us(300); //等待结束
}
//===========================================================
//======================初始化===============================
void nRF2401_Init()
{
unsigned char i;
nRF2401_CLK1_DDR=1;
nRF2401_DATA1_DDR=1;
nRF2401_CS_DDR = 1;
nRF2401_CE_DDR = 1;
nRF2401_PWR_DDR = 1;
nRF2401_DR1_DDR = 0;
nRF2401_DR1_PORT=0;
nRF2401_CLK1_PORT=0;
nRF2401_DATA1_PORT=0;
nRF2401_CE_PORT=0;
nRF2401_CS_PORT=0;//空闲模式,低功耗
nRF2401_PWR_PORT=1;//上电
delay_ms(5);//从上电到进入配置模式最大 3ms 的延时
nRF2401_CS_PORT=1;//进入配置模式
delay_us(10); //最小5us
for(i=0;i<15;i++)nRF2401_SendByte(nRF2401_InitData[i]);
delay_us(10);
nRF2401_CS_PORT=0; //低功耗模式
delay_ms(6);
}
//===========================================================
现将发送部分和接收部分的程序一并贴上
发送部分:
//=======单片机:ATmega16,编译器:CodeVision v1.24==========
#include<mega16.h>
#include<delay.h>
#include "2401.h"
unsigned char a=0;
main()
{
nRF2401_Init();
nRF2401_SetMode(0);//发送模式
while(1)
{
nRF2401_SendData(Address,a++);
delay_ms(100);
}
}
接收部分:
//=======单片机:ATmega16,编译器:CodeVision v1.24==========
//==== 采用的是中断接收方式=================================
//Writen by ChenZhou
#include<mega16.h>
#include<delay.h>
#include "2401.h"
unsigned char a=0;
main()
{
MCUCR=0X03;GICR=0X40;#asm("sei");//启用外部中断INT0,上升沿中断
nRF2401_Init();
nRF2401_SetMode(1);//接收模式
while(1)
{
//=========在这里显示变量a的数值即可,若为0到225则是正确的
delay_ms(10);
}
}
interrupt [2] void int0(void)
{
nRF2401_GetData(&a);
}
70KB / 03-27
系统其他
下载21.5M / 02-01
游戏补丁
下载231KB / 09-26
系统优化
下载140.5M / 09-05
76.4M / 03-25
55M / 06-05
237.9M / 04-13
900.9M / 03-02
96.2M / 07-06
311.2M / 07-06
335M / 07-06
200M / 07-06
413.8M / 07-06
484.7M / 09-27
165.4M / 09-05
353.9M / 06-05
131.8M / 04-13
195.6M / 03-03
45.6M / 09-08
665.2M / 07-06
2.84G / 07-06
93M / 07-06
338.3M / 07-06
1.38G / 07-26
488.3M / 07-16
109.8M / 06-03
142M / 01-08
1.2M / 11-23
548.8M / 04-13
1.6M / 04-13
1.48G / 03-18
646.6M / 03-03
133.7M / 03-03
110.5M / 09-05
33.4M / 09-05
325.8M / 08-12
60M / 04-29
254M / 04-25
659M / 04-23
1M / 12-26
253.4M / 12-08
253M / 12-08
1.19G / 11-16
369M / 09-22
181.5M / 09-22
201.2M / 09-05
488.3M / 07-16
248.9M / 12-08
248.9M / 12-08
100.6M / 03-06
148.9M / 03-06
1.12G / 07-06
1.25G / 07-06
1.76G / 09-22
1.92G / 04-17
116.2M / 04-10
201.5M / 04-13
7.31G / 07-01
94.3M / 07-06
2.48G / 07-06
7.63G / 07-06
1M / 07-06
778.1M / 07-06
561.8M / 07-11
72M / 07-06
548.7M / 07-06
1.00G / 07-06
9.13G / 07-06
126.2M / 07-06
72M / 07-06
105.1M / 07-06
132M / 07-06
132M / 07-06