⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf2401.c

📁 nrf2401的通讯设置程序
💻 C
字号:
/**********************************************************************************/
/**********************************************************************************/
// The nRF2401 2.4GHz Multi Channel Software
//
// This software and any related documentation is provided "as is" without any
// warranty of any kind, either express or implied, including, without
// limitation, the implied warranties or merchantability, fitness for a
// particular purpose, and noninfringment. The entire risk arising out of use
// of this software remains with you.
// write time is 2004.3.20====debug time is 2004.3.20--21
// copyright is shenzhen.xuntong Co.Ltd
// cpu= At89lv51,keilC51 compiler
/**********************************************************************************/
/**********************************************************************************/
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <intrins.h>
/**********************************************************************************/
#define uchar unsigned char 
#define uint  unsigned int

#define	Fclk	3686400
#define	BitRate	19200
#define	BRR		(Fclk/(16*Bitrate))-1

#define	timerdiv	1
#define	timerval	256-(Fclk/timerdiv)/100000			// timeout each 10us
/**********************************************************************************/
uchar 	InitData[15];
uchar 	TXData[14];
uchar 	RXData[10];

uchar 	Temp;
uchar 	BitCnt;	
uchar 	ByteCnt;
uchar 	Data1=	0xff;

bdata 	uchar 	tempi;
/**********************************************************************************/
sbit	CLK1 	=P2^0;
sbit	CS		=P2^2;
sbit	Data	=P2^3;
sbit	CE		=P2^4;
sbit	Clk2	=P2^5;
sbit	Dout2	=P2^6;

sbit	DR2		=P3^2;
sbit	DR1		=P3^3;
sbit	PWR_UP	=P3^5;

sbit	LED1	=P0^4;
sbit	LED2	=P0^5;
sbit	LED3	=P0^6;
sbit	LED4	=P0^7;

sbit 	bflag	=tempi^7;

/**********************************************************************************/
void 	init_io();
void 	nRF2401_ON();
void 	BuildInitWord();
void 	InitnRF2401();
void 	DoSPIClock();
void 	CE_High();
void 	RXEN_HIGH();
void 	TXEN_LOW();
void 	Delay10();
void 	delay100();
void 	BuildShockWord();
void 	ShockBurst();
void 	CheckButtons();
void 	ReceiveShock();

/*****************************************MAIN  START ******************************/
void main(void)
{	
	init_io();
	nRF2401_ON();
	BuildInitWord();
	InitnRF2401();
	CE_High();
	RXEN_HIGH();
    delay100();				//delay for LED light	
    P0=0xff;				//close all LED 
    TXEN_LOW();				// set TX mode
	BuildShockWord();  
	ShockBurst();		
	Delay10();				// delay for mode change
	RXEN_HIGH();	                         
	while(1)
		{
			CheckButtons(); //check if the button is pressed
			DR1=1;
			if(DR1==1)		// Check if DR1 is high (any received from nRF2401)	
				ReceiveShock();			
		}					
		
}
/*************************************Rmain      END *******************************/
/*************************************init_io   START ******************************/
void init_io()
{
	P0=0Xff;
	P1=0xff;
	P2=0x00;
	P3=0xff;
	P0=0x0f;
}
/*************************************init_io    END *******************************/
/*************************************BuildSPIWord START****************************/
void BuildInitWord()
{
	InitData[0]=0x50;		//RX receiver 2, Datalength 80bit(10 byte)
	InitData[1]=0x50;		//RX receiver 1, Datalength 80bit(10 byte)
	InitData[2]=0x00;
	InitData[3]=0xcc;
	InitData[4]=0xcc;
	InitData[5]=0xcc;
	InitData[6]=0xcc;
	InitData[7]=0x00;
	InitData[8]=0xcc; 		//RX receiver 1 address   High byte
	InitData[9]=0xcc;		//RX receiver 1 address   High byte
	InitData[10]=0xcc;		//RX receiver 1 address   Low byte
	InitData[11]=0xcc;		//RX receiver 1 address   Low byte
	//InitData[12]=0x82;	//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC disable(Bit0) for ES chip
	InitData[12]=0x83;		//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip	
	InitData[13]=0x4f;		//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	//InitData[13]=0x6f;	//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 1M, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	InitData[14]=0x05;		//Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}
/*************************************BuildSPIWord END******************************/
/*************************************InitnRF2401 START******************************/		
void InitnRF2401()
{
	CE=0;						//Disable CE
	CS=1;						//Enable CS--confige mode
	for (ByteCnt=0;ByteCnt<15;ByteCnt++)
		{
		tempi=InitData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
			{
				if (bflag==1)	//Check if first bit is HIGH
					Data=1;		//Set Data high
				else
					Data=0;		//Set Data low
				tempi=tempi<<1;	//Left Shift to get next bit
				DoSPIClock();	//Call "DoClock" to generate a clock pulse
			}
		}
	CS=0;						//Disable CS--standby mode	
	Data=0;						//Set Data low
}
/*************************************InitnRF2401 END *******************************/
/*************************************DoSPIClock START******************************/
void DoSPIClock()
{
	CLK1=1;
	_nop_();
	_nop_();
	CLK1=0;
}	

/*************************************DoSPIClock END *******************************/
/*************************************CE_High   START ******************************/
void CE_High()
{
	CE=1;
}
/*************************************CE_High    END *******************************/
/*************************************TXEN_LOW  START ******************************
void CE_Low()
{
	CE=0;
}
*************************************CE_Low     END ********************************/
/*************************************nRF2401_ON START******************************/
void nRF2401_ON()
{
	PWR_UP=1;
}
/*************************************nRF2401_ON END *******************************/
/*************************************nRF2401_OFF START*****************************/
//void nRF2401_OFF()
//{
//	PWR_UP=0;			// Set Power_Up low	
//}
/*************************************nRF2401_OFF END ******************************/
/*************************************RXEN_HIGH START ******************************/
void RXEN_HIGH()
{
	CE=0;				//Set CE LOW		
	CS=1;				//Set CS HIGH--confige mode
	Data=1;				//Set Data HIGH
	DoSPIClock(); 		//Make one SPIClock cycle
	CS=0;				//Set CS LOW		
	CE=1;				//Set CE HIGH--active mode
}
/*************************************RXEN_HIGH  END *******************************/
/*************************************TXEN_LOW  START ******************************/		
void TXEN_LOW()
{
	CE=0;				//Set CE LOW			
	CS=1;				//Set CS HIGH--confige mode
	Data=0;				//Set Data LOW
	DoSPIClock();		//Make one SPIClock cycle
	CS=0;				//Set CS LOW		
	CE=1;				//Set CE HIGH--active mode
}

/*************************************TXEN_LOW   END *******************************/
/*************************************delay10   START ******************************/
void Delay10()
{
	uchar  x;
	uchar  y;
	for(x=0;x<10;x++)
		{
		for(y=0;y<100;y++)
		_nop_();
		}
}
/*************************************delay10    END *******************************/
/*************************************delay100   START *****************************/	
void delay100()
{
	uchar  x;
	uchar  y;
	for(x=0;x<100;x++)
		{
		for(y=0;y<100;y++)
		_nop_();
		}
}
/*************************************delay100   END *******************************/
/*************************************ShockBurst START *****************************/
void BuildShockWord()
{
	TXData[0]=0xcc;		//MSB    ;RX receiver 1 address   High byte
	TXData[1]=0xcc;		//MSB-1  ;RX receiver 1 address   High byte
	TXData[2]=0xcc;		//MSB-2  ;RX receiver 1 address   Low byte
	TXData[3]=0xcc;		//MSB-3  ;RX receiver 1 address   Low  byte
	TXData[4]=Data1;	//MSB-4  ;Data byte 9
	TXData[5]=0x02;		//MSB-5  ;Data byte 8
	TXData[6]=0x03;		//MSB-6  ;Data byte 7
	TXData[7]=0x04;		//MSB-7  ;Data byte 6
	TXData[8]=0x05;		//MSB-8  ;Data byte 5
	TXData[9]=0x06;		//MSB-9  ;Data byte 4
	TXData[10]=0x07;	//MSB-10 ;Data byte 3
	TXData[11]=0x08;	//MSB-11 ;Data byte 2
	TXData[12]=0x09;	//MSB-12 ;Data byte 1
	TXData[13]=0x10;	//MSB-13 ;Data byte 0   
}
/************************************* BuildShockWord END *******************************/
/************************************* ShockBurst   START *******************************/
void ShockBurst()
{
	CS=0;					//Pull CS low
	CE=1;					//Enable CE	active mode
	for (ByteCnt=0;ByteCnt<14;ByteCnt++)
	{
		tempi=TXData[ByteCnt];
		for (BitCnt=0;BitCnt<8;BitCnt++)
		{
			if (bflag==1)	//Check if first bit is HIGH
				Data=1;		//Set Data high
			else
				Data=0;		//Set Data low
			tempi=tempi<<1;	//Left Shift to get next bit
			DoSPIClock();
			//SendData();	//Call SendData
		}
	}
	CE=0;					//Disable CE (TX Starts!)--standby mode
	Data=0;					//Set Data low
}
/************************************* ShockBurst END ***********************************/
/************************************* SendData     START *******************************
		
void SendData()
{
	for (BitCnt=0;BitCnt<8;BitCnt++)
		{
		if (bflag==1)		//Check if first bit is HIGH
			Data=1;			//Set Data high
		else
			Data=0;			//Set Data low
		tempi=tempi<<1;		//Left Shift to get next bit
		DoSPIClock();		//Call "DoClock" to generate a clock pulse
		}
}

************************************** SendData END *************************************/
/************************************* CheckButtons START *******************************/	
void CheckButtons()
{
	P0=0xff;
	Temp=P0&0x0f;			//read key value from port P0
	if (Temp!=0x0f)
		{
			Temp=Temp<<4;
			Data1=Temp;		//put the button Data in dada package
			P0=Data1;		//Turn On the LED
			TXEN_LOW();		//set TX mode
			BuildShockWord();
			ShockBurst();
			delay100();		//delay for LED light
			RXEN_HIGH();
			P0=0xff;		//close LED display
			
		 }
}
/************************************* CheckButtons END *********************************/
/************************************* ReceiveShock START *******************************/
void ReceiveShock()
{
	Data=1;					//Set Data tri state
	Temp=0;
	for (ByteCnt=0;ByteCnt<10;ByteCnt++)
	{
		for(BitCnt=0;BitCnt<8;BitCnt++)
		{
			Temp=Temp<<1;	//shift left to receive next bit
			CLK1=1;			//set clock high
			_nop_();	
			_nop_();		//wait one clk cycle
			Data=1;
			if(Data==1)		//check if Data=high		
				Temp|=0x01;	//yes - set bit high
			CLK1=0;			//set clock low
			_nop_();		//wait one clk cycle
		}
		_nop_();
		RXData[ByteCnt]=Temp;
		DR1=1;
		if(DR1!=1)			//check if DR1 is not still high
		{		
			_nop_();
			P0=RXData[0];	//Turn On the LED
			delay100();
  	    	P0=0xff;
		}
	 }
}

/************************************* ReceiveShock END *********************************/	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -