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
系统优化
下载76.4M / 03-25
立即下载55M / 06-05
立即下载237.9M / 04-13
立即下载140.5M / 03-06
立即下载900.9M / 03-02
立即下载96.2M / 07-06
立即下载311.2M / 07-06
立即下载335M / 07-06
立即下载200M / 07-06
立即下载413.8M / 07-06
立即下载353.9M / 06-05
立即下载131.8M / 04-13
立即下载230.8M / 03-03
立即下载195.6M / 03-03
立即下载165.4M / 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
立即下载325.8M / 06-07
立即下载60M / 04-29
立即下载254M / 04-25
立即下载659M / 04-23
立即下载1M / 12-26
立即下载253.4M / 12-08
立即下载253M / 12-08
立即下载1.19G / 11-16
立即下载110.5M / 04-23
立即下载26.7M / 03-16
立即下载488.3M / 07-16
立即下载248.9M / 12-08
立即下载248.9M / 12-08
立即下载201.2M / 04-13
立即下载100.6M / 03-06
立即下载148.9M / 03-06
立即下载1.12G / 07-06
立即下载1.25G / 07-06
立即下载9.48G / 07-06
立即下载50KB / 07-06
立即下载116.2M / 04-10
立即下载1.92G / 04-17
立即下载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
立即下载509.7M / 07-06
立即下载561.8M / 07-11
立即下载1.32G / 01-19
立即下载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
立即下载