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
立即下載