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

📄 rev.c

📁 2401 接受程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
#include "lcd1602.h"

//for nRF2401
// new PCB

#define nRF2401_DataLength_TX (24+4)   //发送数据的长度
#define nRF2401_DataLength_RX (24)   //接收数据的长度


sbit	Data	=P2^7;
sbit	CLK1 	=P2^6;
sbit	DR1		=P2^5;
sbit	CS		=P2^1;
sbit	CE		=P2^0;

//for nRF2401
uchar    xdata InitData[15];
uchar 	 xdata TXData[nRF2401_DataLength_TX];
uchar 	 xdata RXData[nRF2401_DataLength_RX];
uchar 	 Temp;
uchar    BitCnt;	
uchar    ByteCnt;
bdata    uchar 	tempi;
sbit     bflag	=tempi^7;

//nRF2401
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();
void       nRF2401SendData();

/*Build mode,write build words*/
void BuildInitWord()
{
	InitData[0]=nRF2401_DataLength_RX<<3;//InitData[0]=0x50;		//RX receiver 2, Datalength 80bit(10 byte)
	InitData[1]=InitData[0];//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)
    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
}
/*************************************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 *******************************/



/*************************************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]=0;	    //MSB-4  ;Data byte 9
	TXData[5]=0;		//MSB-5  ;Data byte 8
	TXData[6]=0;		//MSB-6  ;Data byte 7
	TXData[7]=0;		//MSB-7  ;Data byte 6
	TXData[8]=0;		//MSB-8  ;Data byte 5
	TXData[9]=0;		//MSB-9  ;Data byte 4
	TXData[10]=0;	    //MSB-10 ;Data byte 3
	TXData[11]=0;	    //MSB-11 ;Data byte 2
	TXData[12]=0;	    //MSB-12 ;Data byte 1
	TXData[13]=0;	    //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<nRF2401_DataLength_TX;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 *************************************/




/************************************* ReceiveShock START *******************************/
void ReceiveShock()
{
	Data=1;					//Set Data tri state
	Temp=0;
	for (ByteCnt=0;ByteCnt<nRF2401_DataLength_RX;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;
	 }
}
void nRF2401SendData()
{

	 
	  BuildInitWord();
	  InitnRF2401();
	  CE_High();
      RXEN_HIGH();
      delay100();					
      TXEN_LOW();				// set TX mode
	  BuildShockWord();  
      ShockBurst();		
	  delay100();				// delay for mode change
	  RXEN_HIGH();
    
}

main()
{    
	 uchar code str[]="nRf2401";
	 uchar code str1[]="----OK!";
	 uchar i;
	 nRF2401SendData();
	 lcd_ini();
	 lcd_wrcmd(0x80);			   	
	 for(i=0;i<strlen(str);i++)lcd_wrdata(str[i]);
	 DR1=1;
	 while(DR1!=1);
	 for(i=0;i<strlen(str1);i++)lcd_wrdata(str1[i]);
	 ReceiveShock();
	 lcd_wrcmd(0xc0);
	 for(i=0;i<10;i++)lcd_wrdata(RXData[i]);
	 while(1);
}

⌨️ 快捷键说明

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