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

📄 rx.c

📁 nfr2401的接收程序
💻 C
字号:
#include <reg52.h>
#include<intrins.h>
// 常量定义
#define uchar unsigned char 
#define uint  unsigned int
#define BYTE_BIT0	0x01
#define BYTE_BIT1	0x02
#define BYTE_BIT2	0x04
#define BYTE_BIT3	0x08
#define BYTE_BIT4	0x10
#define BYTE_BIT5	0x20
#define BYTE_BIT6	0x40
#define BYTE_BIT7	0x80
//---------------------------位变量定义----------------------------------------
bdata uchar DATA_BUF;    //用于ByteRead和ByteWrite 函数
#define DATA7   ((DATA_BUF&BYTE_BIT7)!=0)
#define DATA0	((DATA_BUF&BYTE_BIT0)!=0)
uchar RxBuf[28];
// ------------------------------<RF2401_Pins 对应引脚> -----------------------
sbit PWR_UP	= P1^0;
sbit CE		= P1^1;
//	sbit DR2	= P1^5;		//暂时没有用到
//	sbit CLK2	= P1^2;
//	sbit OUT2	= P1^6;
sbit CS		= P3^2;
sbit DR1	= P1^4;
sbit CLK1	= P1^3;
sbit DATA	= P1^7;
//-------------------------------------------------------------------------------
unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};  		//发送地址
//---------------------<nRF-Configuration-Register  配置信息 >------------------------------ 
//芯片测试用,无需修改 
#define TEST_2		0x8E            	//	MSB  	 D143-D136
#define TEST_1		0x08				//     		 D135~D128
#define TEST_0		0x1c				//    		 D127~D120
// 注意 DATAx_W+ADDRx_W+CRC  的值必须小于256!单个数据包的大小必须小于32字节(256位)
#define DATA2_W		0x10     			//未用到--0x10=2字节  //频道2发送/接受数据长度(单位:Bit)
#define DATA1_W		0xE0				//28字节 16 位   //频道1发送/接受数据长度(单位:Bit)
//频道2接收地址    <-频道2未使用
#define ADDR2_4		0x00
#define ADDR2_3		0x1c
#define ADDR2_2		0xcc
#define ADDR2_1		0xcc
#define ADDR2_0		0xcc
// 频道1接收地址   (当前模块地址)  <-只是用频道1
#define ADDR1_4		0x00
#define ADDR1_3		0xcc
#define	ADDR1_2		0xcc
#define	ADDR1_1		0xcc
#define	ADDR1_0		0xcc
//接收地址位置设置--CRC设置
#define	ADDR_W		0x10     	//0x10 =2字节   //发送/接收地址宽度(单位:Bit)
#define	CRC_L		0x1			//CRC模式   0:8位 1:16位
#define	CRC_EN		0x1			//CRC校验   0:禁止 1:启用
//频道设置--发送方式设置--速率设置--频率设置
#define	RX2_EN		0x0			//双频道功能 0:禁用 1:启用
#define CM			0x1			//0:Direct Mode  1: Shockburst Mode
#define RFDR_SB		0x1			//传输速率   0:250k   1: 1M (250k比1M传输距离远)
#define XO_F		0x3			//16M   D12 D11 D10  确定 5种频率
#define RF_PWR		0x3			//信号发射功率---0DB
//
#define RF_CH		0x2			//Channal 频率设置Channel=2400MHz+RF_CH*1.0MHz
#define RXEN		0x1			//0:TX   1:RX
//<将设置信息组合成每个字节的数据信息
#define	RFconfig_Bit0	TEST_2
#define	RFconfig_Bit1	TEST_1
#define	RFconfig_Bit2	TEST_0
#define	RFconfig_Bit3	DATA2_W
#define	RFconfig_Bit4	DATA1_W
#define	RFconfig_Bit5	ADDR2_4
#define	RFconfig_Bit6	ADDR2_3
#define	RFconfig_Bit7	ADDR2_2
#define	RFconfig_Bit8	ADDR2_1
#define	RFconfig_Bit9	ADDR2_0
#define	RFconfig_Bit10	ADDR1_4
#define	RFconfig_Bit11	ADDR1_3
#define	RFconfig_Bit12	ADDR1_2
#define	RFconfig_Bit13	ADDR1_1
#define	RFconfig_Bit14	ADDR1_0
#define	RFconfig_Bit15	(ADDR_W<<2|CRC_L<<1|CRC_EN)
#define	RFconfig_Bit16	(RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)
#define	RFconfig_Bit17	(RF_CH<<1|RXEN)
//通过宏定义将18字节的寄存器参数按照各个功能分解,参照DATASHHET
uchar code nRF2401_Conf[18]=
{ 
	RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,
	RFconfig_Bit3,
	RFconfig_Bit4,
	RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9,
	RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14,
	RFconfig_Bit15,
	RFconfig_Bit16,
	RFconfig_Bit17
};
//------------------------------------------函数申明------------------------------------------
void Delay_us(uchar n);
void DoClock();
void Delay_ms(uchar n);
unsigned char Spi_ByteRead(void);
void Spi_ByteWrite(unsigned char send);
void Config2401(void);
void SetTxMode(void);
void nRF2401_TxPacket(uchar TxBuf[]);
//--------------------------------11.0592M晶振  n=100 868us 左右-------------------------------
void Delay_us(uchar n)
{
	uint i;
	for(i=0;i<n;i++);
}
//------------------------------------------           -----------------------------------------
void Delay_ms(uchar n)
{ 
	unsigned int i,j,k;

	for(i=0;i<n;i++)
	{
		for(k=0;k<5;k++)
		{
			for(j=0;j<200;j++);	
		}
	}
}
//--------------------------SPI读------------------------------------------
unsigned char Spi_ByteRead(void)
{
	unsigned char i = 0;
	for (i=0; i<8; i++)
	{
		DATA_BUF = DATA_BUF << 1;
		CLK1 = 1;
		DATA = 1;	//设置为输入状态
		if (DATA)	//读取最高位,保存至最末尾,通过左移位完成整个字节
		{
			DATA_BUF |= BYTE_BIT0;
		}
		else
		{
			DATA_BUF &= ~BYTE_BIT0;
		}
		CLK1 = 0;
	 }
	 return DATA_BUF;
}
//----------------------------------SPI写-----------------------------------------
void Spi_ByteWrite(unsigned char send)
{
	unsigned char i;

	DATA_BUF = send;

	CLK1 = 0;

	for (i=0; i<8; i++)
	{
		
		if (DATA7)	//总是发送最高位
		{
			DATA = 1;
		}
		else
		{
			DATA = 0;
		}
		CLK1 = 1;
		DATA_BUF = DATA_BUF << 1;
		CLK1 = 0;
	}
}
//-----------------------------配置2401--------------------------------------------
void Config2401(void)
{
	uint i;
	uchar variable1;
	
	PWR_UP=1;    			//上电
	CE=0;	   			
	CS=1;				//使RF2401进入配置方式
	Delay_ms(3);		//从上电到进入配置模式需要3ms的延时(最少)
	for(i=0;i<18;i++)	//输入3个测试字节15个配置字节共 18Byte
	{
		variable1=nRF2401_Conf[i];
		Spi_ByteWrite(variable1);
	}
	CS=0;					//Disable CS   -----standby mode
	DATA=0;
	Delay_us(100);
}
/*
//--------------------------------设置为发送模式 ----------------------------
void SetTxMode(void)
{	
//-------------------------------设置为配置模式----------------------------------
	PWR_UP=1;			 	  //上电
	CE=0;			 
	CS=1;			 	 //进入配置模式
	Delay_us(100);
	DATA=0;				//配置寄存器0字节RXEN  设置为0: 发送模式
	CLK1=1;
	CLK1=0;
//----------------------------设置为  Activemodes(TX)------------------------------
	CS=0;
	CE=1;           	//set  standby mode
	Delay_us(100);
}
//--------------------------------nRF 数据发送函数--------------------------------
void nRF2401_TxPacket()
{
	int	i;
	uchar	variable2;
	CE=1;
	for(i=0;i<2;i++)	   //写入接受地址(按字节对齐)
	{
		variable2=TxAddress[i];
		Spi_ByteWrite(variable2);
	}
	for(i=0;i<(28);i++)		//写入接受地址(按字节对齐)
	{
		variable2=TxBuf[i];
		Spi_ByteWrite(variable2);
	}
	CE=0; 			//CE配置低使发送有效
	Delay_us(100);		//时钟信号高电平有效
}
*/
void SetRxMode(void)
{
	PWR_UP=1;			 	  //上电
	CE=0;			 
	CS=1;			 	 //进入配置模式
	Delay_us(100);
	DATA=1;				//配置寄存器0字节RXEN  设置为0: 发送模式
	CLK1=1;
	CLK1=0;
//----------------------------设置为  Activemodes(TX)------------------------------
	CS=0;
	CE=1;           	//set  standby mode
	Delay_us(100);
}
void nRF2401_RxPacket()
{
	int	i;
	DR1=1;
	if(DR1==1)
	{
	for(i=0;i<(28);i++)		//写入接受地址(按字节对齐)
	{
		RxBuf[i]=Spi_ByteRead();
	}
	}
	CE=0; 			//CE配置低使发送有效
	Delay_us(100);		//时钟信号高电平有效

}
//---------------------------串口初始化----------------------------------
void StartUART( void )
{  							//波特率4800
     SCON = 0x50;
     TMOD = 0x20;
     TH1 = 0xFA;
     TL1 = 0xFA;
     PCON = 0x00;
     TR1 = 1;
}
//--------------------------串口接收函数----------------------------------
void R_S_Byte(uchar R_Byte)
{	
	 SBUF = R_Byte;  
     while( TI == 0 );				//查询法
  	 TI = 0;
     
}
//------------------------------------主函数---------------------------------------
main()
{
	uchar i;
	Config2401();
	Delay_us(100);
	StartUART();
	while(1)
	{
	SetRxMode();
	nRF2401_RxPacket();
	for(i=0;i<28;i++)
	{
	R_S_Byte(	RxBuf[i]);
	}
	}
}

⌨️ 快捷键说明

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