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

📄 nrf905.c

📁 RF905 200米无线数据收发模块C语言程序
💻 C
字号:
#include <at89x52.h>
#include <intrins.h>

#define uchar unsigned char 
#define uint  unsigned int

#define WC		0x00			// Write configuration register command
#define RC		0x10 			// Read  configuration register command
#define WTP		0x20 			// Write TX Payload  command
#define RTP		0x21			// Read  TX Payload  command
#define WTA		0x22			// Write TX Address  command
#define RTA		0x23			// Read  TX Address  command
#define RRP		0x24			// Read  RX Payload  command
/*******************************************************************************************/
typedef struct RFConfig
{
	uchar n;
	uchar buf[10];
}RFConfig;

code RFConfig RxTxConf =
{
	10,
	0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc,0xcc, 0xcc, 0x58	
};// │    │    │    │    │    │    │    │    │    │
  //字节0 字节1	字节2 字节3	字节4 字节5	字节6 字节7	字节8 字节9
  // │    │    │    │    │    │    │    │    │    │
  // │    │    │    │    │    │    │    │    │    8位CRC校验位,CRC允许校验,外接16MHz晶体振荡器,没有外部时钟输出
  // │    │    │    │    │    │    │    │    └ RX地址3字节为0xcc
  // │    │    │    │    │    │    │    └ RX地址2字节为0xcc
  // │    │    │    │    │    │    └ RX地址1字节为0xcc
  // │    │    │    │    │	   └ RX地址0字节为0xcc
  // │    │    │    │	 └	32字节的TX有效数据宽度
  // │    │    │	   └ 32字节的RX有效数据宽度
  // │    │	 └	4字节的TX地址宽度,4字节的RX地址有效宽度
  // │	   └ 不重发数据包,正常接收模式,输出功率为+10dBm,期间工作在433MHz频段,CH_NO[8]为0
  // └	430.0MHz
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;430MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar data TxBuf[32];
uchar data RxBuf[32];
uchar tf;
/*******************************************************************************************/
uchar   bdata   DATA_BUF;
sbit	flag	=DATA_BUF^7;
sbit	flag1	=DATA_BUF^0;
/*******************************************************************************************/
sbit	SCK 	=P1^7;
sbit	MISO	=P1^6;
sbit	MOSI	=P1^5;
sbit	CSN 	=P1^4;
sbit	TX_EN	=P1^3;
sbit	TRX_CE  =P1^2;
sbit	PWR_UP  =P1^1;
sbit	CD	    =P1^0;
sbit	DR	    =P3^3;
sbit	AM	    =P3^4;

sbit    LED1    =P3^0;
sbit    LED2    =P3^1;
sbit    KEY2    =P3^7;
sbit    KEY1    =P3^5;

/*******************************************************************************************/
//void InitIO(void);		    	// Initialize IO port
//void Inituart(void);			    // initialize 232 uart
void Config905(void);			// Config nRF905 module配置NRF905模式
void SetTxMode(void);			// Set nRF905 in Tx mode
void SetRxMode(void);			// Set nRF905 in Rx mode
void TxPacket(void);			// Send data by nRF905
void RxPacket(void);			// Recive data by nRF905
void SpiWrite(uchar);			// Write data to nRF905
uchar SpiRead(void);			// Read data to nRF905
void Delay(uchar n);			// Delay 100us
void UART_init();               //串口初始化函数
void COM_send(void);            //串口发送函数
///////////////////////////////////////////
uchar  code password[]={"Eiman"};
/*******************************************************************************************/
void Delay(uchar n)	           //大约延时1ms
{
	uint i;
	while(n--)
	for(i=0;i<340;i++);	
}

void main()
{
    
    //================NRF905初始化
	CSN=1;						// 禁用SPI					
	SCK=0;						// SCK置低,准备发送数据的下一位
	DR=1;						// 设置为输入端
	AM=1;						// 设置为输入端
	PWR_UP=1;					// nRF905 上电
	TRX_CE=0;					// 设置 nRF905 为 standby 模式
	TX_EN=0;					// 设置射频为 Rx接收模式	
	//================
	Config905();				//向905配置寄存器写入信息
	TxBuf[0] = 1;
	TxBuf[1] = 1;
	SetTxMode();				//设置发送模式
	TxPacket();				    //发送数据包
	LED1 = 1;
	LED2 = 1;
	Delay(500);				    // delay for led light	
	LED1 = 0;
	LED2 = 0;
	TxBuf[0] = 0xff;
	TxBuf[1] = 0xff;		    // led close
	SetRxMode();				//设置接收模式
	UART_init();
while(1)
{
     uchar i,j;
	 //=====================从键盘获得数据
           if(KEY1 ==0 ) {	LED1 = 1; TxBuf[0] = 1 ;tf = 1 ; }
		   if(KEY2 ==0 ) {	LED2 = 1; TxBuf[1] = 1 ;tf = 1 ; }

	   if (tf==1)
	     {	
		    for(i=0;i<5;i++)
			{ 
			  TxBuf[i+2] = password[i];
		   	 }
		  //===============NRF905发送相应的按键	  
		    SetTxMode();				// Set Tx Mode
		    TxPacket();			     	// Transmit Tx buffer data
			TxBuf[0] = 0xff;
			TxBuf[1] = 0xff;
			SetRxMode();				// Set nRF905 in Rx mode
			tf=0;
			Delay(500);
			LED1 = 0;
			LED2 = 0;
		  }

         //=====================等待NRF905接收
	   if (DR)			// If recive data ready... 
	     {
	      RxPacket();			// ... recive data
		    //COM_send();
		  for(j=0;j<5;j++)
		  {
		   if( RxBuf[j+2] != password[j])
		   { RxBuf[0] = 0;RxBuf[1] = 0;break;}
		   }

	      if(RxBuf[0] == 1)
		  { LED1 = 1 ;
		    TxBuf[1] = 1 ;
			tf = 1 ;
		   }
	      if(RxBuf[1] == 1) 
		  { LED2 = 1 ;
		    TxBuf[0] = 1 ;
			tf = 1 ;
		  }
	      Delay(500);					// ...light led
          LED1 = 0 ;
	      LED2 = 0 ;
		 }	
}

}
/*******************************************************************************************/
/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
	uchar i;					
	CSN=0;						// CSN片选信号,SPI使能
	SpiWrite(WC);				//向905芯片写配置命令
	for (i=0;i<RxTxConf.n;i++)	//写入配置字信息
	{
		SpiWrite(RxTxConf.buf[i]);
	}
	CSN=1;						//结束SPI数据传输
}
/*******************************************************************************************/
//function SpiWrite();		   //单字节发送
/*******************************************************************************************/
void SpiWrite(uchar  byte)
{
	uchar i;	
	DATA_BUF=byte;				//将需要发送的数据写入缓存		
	for (i=0;i<8;i++)			//循环8次发送一个字节的数据
	{	
		
		if (flag)				//flag=DATA_BUF^7 
			MOSI=1;
		else
			MOSI=0;
		SCK=1;					//SCK高电平,总线上的数据将读入
		DATA_BUF=DATA_BUF<<1;	//左移一位,为下一位的发送准备
		SCK=0;					//SCK低电平,为下次时钟跳变做准备
	}	
}
/*******************************************************************************************/
//function SpiRead();			//单字节接收
/*******************************************************************************************/
uchar SpiRead(void)
{
	uchar i;	
	for (i=0;i<8;i++)			//循环8次发送一个字节的数据
	{	
		DATA_BUF=DATA_BUF<<1;	//左移一位,准备接收下一位数据
		SCK=1;					//SCK高电平
		if (MISO)
			flag1=1;			//flag1=DATA_BUF^0
		else
			flag1=0;									
		SCK=0;					//SCK低电平
	}
	return DATA_BUF;			//DATA_BUF为接收到的完整数据
}
/*******************************************************************************************/
//function TxPacket();			//发送数据包
/*******************************************************************************************/
void TxPacket(void)				//发送数据包
{
	uchar i;
	//Config905();				
	CSN=0;						// 使能SPI	
	SpiWrite(WTP);				// Write payload command
	for (i=0;i<32;i++)
	{
		SpiWrite(TxBuf[i]);		// 写入 32 字节的直接发送数据
	}
	CSN=1;						// 关闭SPI,保存写入的数据						
	Delay(1);
	CSN=0;						// SPI使能,准备写入地址信息	
	SpiWrite(WTA);				// 写数据至地址寄存器
	for (i=0;i<4;i++)			// 写入 4 字节地址
	{
		SpiWrite(RxTxConf.buf[i+5]);
	}	
	CSN=1;						// 关闭SPI
	TRX_CE=1;					// 进入发送模式,启动射频发送
	Delay(1);					// while (DR!=1);
	TRX_CE=0;					// Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket();			//接收数据包
/*******************************************************************************************/
void RxPacket(void)				//接收数据包
{
	uchar i;	
	TRX_CE=0;					//设置nRF905进入待机模式	
	CSN=0;						//使能SPI
	SpiWrite(RRP);				//准备读取接收到的数据
	for (i=0;i<32;i++)
	{
		RxBuf[i]=SpiRead();		//通过SPI接口从905芯片读取数据	
	}
	CSN=1;						//禁用SPI
	while(DR||AM);	
	TRX_CE=1;							
}
/*******************************************************************************************/
//function SetTxMode();			//设置发送模式
/*******************************************************************************************/
void SetTxMode(void)				
{	
	TX_EN=1;				    //设置发送模式
	TRX_CE=0;					//暂不启动射频发送
	Delay(1); 					// delay for mode change(>=650us)	
}
/*******************************************************************************************/
//function SetRxMode();			//设置接收模式
/*******************************************************************************************/
void SetRxMode(void)
{
	TX_EN=0;					//设置接收模式
	TRX_CE=1;				    //启动射频接收
	Delay(1); 					// delay for mode change(>=650us)				
}

// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//            串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
                     //初始化串行口和波特率发生器 
SCON =0x58;          //选择串口工作方式,打开接收允许
TMOD =0x20;          //定时器1工作在方式2,
TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
TL1 =0xfd;
TR1 =1;              //启动定时器T1
ET1 =0; 
ES=1;                //允许串行口中断
PS=1;                //设计串行口中断优先级
EA =1;               //单片机中断允许
}

// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
  uchar point;
  for(point=0;point<5,TI=1;point++)	     //连续发送5位数据      
                                        //把缓存区的数据都发送到串口
  { 
   SBUF=RxBuf[point+2];
   while(TI==0);
   TI=0;
   //Delay(500) ;
   }
}

⌨️ 快捷键说明

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