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

📄 nrf905e.c

📁 这是一个基于PTR8000无线数据传输的C语言程序,是完整的源代码.
💻 C
字号:
/*******************************************************************************************
*nrf905_demo.c
*
*This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTYT; 
*********
*uart:9600BPS
*********
/******************************************************************************************/
#include<at89x51.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,
	0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58	
};
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;433MHZ;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 key,rsbrf,delayf,tf,temp;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit	flag	=DATA_BUF^7;
sbit	flag1	=DATA_BUF^0;
/*******************************************************************************************/
sbit	TX_EN	=P2^7;
sbit	TRX_CE	=P2^6;
sbit	PWR_UP	=P2^5;
sbit	MISO	=P2^4;
sbit	MOSI	=P2^3;
sbit	SCK	    =P2^2;
sbit	CSN	    =P2^1;
sbit	WXW     =P2^0;
		             
sbit	AM	=P3^2;
sbit	DR	=P3^3;
sbit	CD	=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 KeyScan(void);
//void Scankey(void);			// Scan key
void TxData (uchar x);			// Send key_value to CRT display
void comdebug(void);


/*******************************************************************************************/
void TxData (unsigned char x)
{
	SBUF=x;	
	while(TI==0);
		TI=0;
}
/*******************************************************************************************/
//function Delay100us();Delay 100us
/*******************************************************************************************/
void Delay(uchar n)
{
	uint i;
	while(n--)
	for(i=0;i<80;i++);	
}
/*******************************************************************************************/
void serial () interrupt 4
{  
    unsigned char temp;
     if(RI)
       { 
		    
		temp=SBUF;
        rsbrf=temp;
	    RI=0;
	}				
}
/********************************************************/
void KeyScan(void) //按键扫描子程序
{
 P1=0xff;
 temp = P1;
 temp&=0xf0;
 if(temp !=0xf0)
 {
  Delay(50);	
  temp=P1;
  temp&=0xf0;
  if(temp !=0xf0)
       { temp=P1;}
	   }
   }

/***********************************/
void main()
{
unsigned int cyc=0;
unsigned int distan=0;
	WXW=0;
   
    SCON=0x50;  //模式1
    TMOD=0x21;  //定时模式2
    IE=0x90;

    //=====9600=======设置串口通讯寄存器
    PCON=0x00;   //波特率9600BPS,晶振11.0592MHZ
    TH1=0xFD;  //
    TL1=0xFD;  //计数器初值
    //================NRF905初始化
	CSN=1;						// Spi 	disable						
	SCK=0;						// Spi clock line init high
	DR=1;						// Init DR for input
	AM=1;						// Init AM for input
	PWR_UP=1;					// nRF905 power on
	TRX_CE=0;					// Set nRF905 in standby mode
	TX_EN=0;					// set radio in Rx mode	

    TI = 0;//串行中断标志位清零
    TR1 = 1;//打开计数器1  
	//================
	Config905();				// Config nRF905 module
	SetTxMode();				// Set Tx Mode
	TxPacket();				// Transmit Tx buffer data
	P0=0xff;
	//WXW=0;                   //上电全亮一下;
	Delay(500);				// delay for led light	
	//P0=0x00;
	WXW=1;				// led close
	SetRxMode();				// Set nRF905 in Rx mode

while(1)
{
	KeyScan();
	 //=====================从键盘获得键值数据

	  switch(temp)
	    {
	      case 0x7e:P0=0x3f;TxBuf[0]=0x3f;tf=1;break;
	  	  case 0x7d:P0=0x06;TxBuf[0]=0x06;tf=1;break;
		  case 0x7b:P0=0x5b;TxBuf[0]=0x5b;tf=1;break;
		  case 0xbe:P0=0x4f;TxBuf[0]=0x4f;tf=1;break;
	  	  case 0xbd:P0=0x66;TxBuf[0]=0x66;tf=1;break;
		  case 0xbb:P0=0x6d;TxBuf[0]=0x6d;tf=1;break;
		  case 0xde:P0=0x7d;TxBuf[0]=0x7d;tf=1;break;
	  	  case 0xdd:P0=0x07;TxBuf[0]=0x07;tf=1;break;
		  case 0xdb:P0=0x7f;TxBuf[0]=0x7f;tf=1;break;
          case 0xee:P0=0x6f;TxBuf[0]=0x6f;tf=1;break;
	  	  case 0xed:P0=0x77;TxBuf[0]=0x77;tf=1;break;
		  case 0xeb:P0=0x7c;TxBuf[0]=0x7c;tf=1;break;
		  
	 	  //default:P0=0xff;TxBuf[0]=0xff; 
		 }


          WXW=0;
		  Delay(50);
 
	   if (tf==1)
	     {	
			//==============向串口发送相应的按键
			  switch(TxBuf[0])
			    {
			      case 0x3f:TxData('0');break;
			      case 0x06:TxData('1');break;
			      case 0x5b:TxData('2');break;
			      case 0x4f:TxData('3');break;
				  case 0x66:TxData('4');break;
			      case 0x6d:TxData('5');break;
			      case 0x7d:TxData('6');break;
			      case 0x07:TxData('7');break;
				  case 0x7f:TxData('8');break;
			      case 0x6f:TxData('9');break;
			      case 0x77:TxData('A');break;
			      case 0x7c:TxData('B');break;
			 	  //default:P0=0xff;TxBuf[0]=0xff; 
				 } 
		        //===============NRF905发送相应的按键	  
		    SetTxMode();				// Set Tx Mode
		    TxPacket();					// Transmit Tx buffer data
			TxBuf[0] = 0xff;
			SetRxMode();				// Set nRF905 in Rx mode
			tf=0;
			Delay(500);
			//P0=0xff;
			WXW=1;
		 }
	   
	 
 
         //=====================等待NRF905接收
	   if (DR)			// If recive data ready... 
	   RxPacket();			// ... recive data
	 //=====================从串口接收到数据
	 if (rsbrf!=0)
	  {
		 switch(rsbrf)
		   {
		     case '0':P0=0x3f;TxBuf[0]=0x3f;delayf=1;break;
			 case '1':P0=0x06;TxBuf[0]=0x06;delayf=1;break;
			 case '2':P0=0x5b;TxBuf[0]=0x5b;delayf=1;break;
			 case '3':P0=0x4f;TxBuf[0]=0x4f;delayf=1;break;
			 case '4':P0=0x66;TxBuf[0]=0x66;delayf=1;break;
			 case '5':P0=0x6d;TxBuf[0]=0x6d;delayf=1;break;
			 case '6':P0=0x7d;TxBuf[0]=0x7d;delayf=1;break;
			 case '7':P0=0x07;TxBuf[0]=0x07;delayf=1;break;
             case '8':P0=0x7f;TxBuf[0]=0x7f;delayf=1;break;
			 case '9':P0=0x6f;TxBuf[0]=0x6f;delayf=1;break;
			 case 'A':P0=0x77;TxBuf[0]=0x77;delayf=1;break;
			 case 'B':P0=0x7c;TxBuf[0]=0x7c;delayf=1;break;
		 	 //default:P0=0xff;TxBuf[0]=0xff; 
			}
	  //====================NRF905发送串口接收到的相应的字符 
	   if(TxBuf[0]!=0xff)
	     if(TxBuf[0]!=0x00)
		  {
		    SetTxMode();				// Set Tx Mode
		    TxPacket();					// Transmit Tx buffer data
			TxBuf[0] = 0xff;
			SetRxMode();				// Set nRF905 in Rx mode
		  }				            	
	 //=====================
		 if(delayf==1)
		   {
		     Delay(500);
			 delayf = 0;
			 P0 = 0x00;
		   }
	   }
	 //=====================
	 if(rsbrf!=0)
	   {
	     TxData(rsbrf);
		 rsbrf = 0 ;
	   }
	 //=====================
	}
}

/*******************************************************************************************/
/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
	uchar i;					
	CSN=0;						// Spi enable for write a spi command
	SpiWrite(WC);				// Write config command写放配置命令
	for (i=0;i<RxTxConf.n;i++)	// Write configration words  写放配置字
	{
		SpiWrite(RxTxConf.buf[i]);
	}
	CSN=1;						// Disable Spi
}
/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
void SpiWrite(uchar  byte)
{
	uchar i;	
	DATA_BUF=byte;				// Put function's parameter into a bdata variable		
	for (i=0;i<8;i++)			// Setup byte circulation bits
	{	
		
		if (flag)				// Put DATA_BUF.7 on data line
			MOSI=1;
		else
			MOSI=0;
		SCK=1;					// Set clock line high
		DATA_BUF=DATA_BUF<<1;	// Shift DATA_BUF
		SCK=0;					// Set clock line low 
	}	
}
/*******************************************************************************************/
//function SpiRead();
/*******************************************************************************************/
uchar SpiRead(void)
{
	uchar i;	
	for (i=0;i<8;i++)			// Setup byte circulation bits
	{	
		DATA_BUF=DATA_BUF<<1;	// Right shift DATA_BUF
		SCK=1;					// Set clock line high
		if (MISO)
			flag1=1;			// Read data
		else
			flag1=0;
							
		
		SCK=0;					// Set clock line low
	}
	return DATA_BUF;			// Return function parameter
}
/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
	uchar i;
	//Config905();				
	CSN=0;						// Spi enable for write a spi command	
	SpiWrite(WTP);				// Write payload command
	for (i=0;i<32;i++)
	{
		SpiWrite(TxBuf[i]);		// Write 32 bytes Tx data
	}
	CSN=1;						// Spi disable						
	Delay(1);
	CSN=0;						// Spi enable for write a spi command	
	SpiWrite(WTA);				// Write address command
	for (i=0;i<4;i++)			// Write 4 bytes address
	{
		SpiWrite(RxTxConf.buf[i+5]);
	}	
	CSN=1;						// Spi disable
	TRX_CE=1;					// Set TRX_CE high,start Tx data transmission
	Delay(1);					// while (DR!=1);
	TRX_CE=0;					// Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
void RxPacket(void)
{
	uchar i;	
	TRX_CE=0;					// Set nRF905 in standby mode	
	CSN=0;						// Spi enable for write a spi command
	SpiWrite(RRP);				// Read payload command	
	for (i=0;i<32;i++)
	{
		RxBuf[i]=SpiRead();		// Read data and save to buffer		
	}
	CSN=1;						// Disable spi
	while(DR||AM);	
	P0=	RxBuf[0];				// Buffer[0] output from P0 port...
	TRX_CE=1;
	//xx=(RxBuf[0]>>4)&0x0f;
	//TxData(xx);
	 //=====================
	   	  switch(P0)
	    {
	              case 0x3f:TxData('0');;break;
			      case 0x06:TxData('1');;break;
			      case 0x5b:TxData('2');;break;
			      case 0x4f:TxData('3');;break;
				  case 0x66:TxData('4');;break;
			      case 0x6d:TxData('5');;break;
			      case 0x7d:TxData('6');;break;
			      case 0x07:TxData('7');;break;
				  case 0x7f:TxData('8');;break;
			      case 0x6f:TxData('9');;break;
			      case 0x77:TxData('A');;break;
			      case 0x7c:TxData('B');;break;
	 	  //default:P0=0xff;TxBuf[0]=0xff; 
		 } 
	 //=====================
	  
	Delay(500);					// ...light led
	P0=0xff;					// Close led								
}
/*******************************************************************************************/
//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)				
}

⌨️ 快捷键说明

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