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

📄 set.h

📁 nRF905无线FSK芯片在51单片机上工作的代码
💻 H
字号:

#ifndef __SET_H__
#define __SET_H__
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

#define WC  0x00   // Write configuration register command		  ADDR_8255_control
#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

//////////////////////下面是t_mini.c里的copy过来的////////////////////////////////////////////////
#define V_TH0   0xee  /*   ~ 5ms ,  ! notice: crystal 11.0592MHz */
#define V_TL0   0x00

/* 数码管段驱动寄存器地址 */
#define ADDR_8SEG	XBYTE[0x2000]

/* 数码管位驱动和指示灯驱动寄存器地址 */
#define ADDR_SEL	XBYTE[0x4000]

#define PB8255 XBYTE[0xE001]			//B口地址

#define SB 16 //sent bytes	一个数据包里的payload字节数


//用于按键消抖
unsigned char p_counter=0;


/* 按键 */
sbit pKEY1=	P1^0;
sbit pKEY2=	P1^1;
sbit pKEY3=	P1^2;
sbit pKEY4=	P1^3;
/*******************************************************************************************/
typedef struct RFConfig
{
 uchar n;
 uchar buf[10];
}RFConfig;

code RFConfig RxTxConf =
{
 10,
 0x01,
 0x2c, 
 0x44, 
 0x10, 
 0x10, 
 0xcc, 0xcc, 0xcc,0xcc,    // 4 bytes address
 0x5c 
};
RFConfig temp={0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

/*******************************************************************************************/
uchar xdata TxBuf[32];
uchar xdata RxBuf[32];

/*******************************************************************************************/
//uchar key,rsbrf,delayf,tf;

//sbit retest=P2^0;
int trsec=0;
uchar jj=0;
uchar r_flag=1;// flag of receiving	指示芯片处于接受状态的flag
uchar retrieving_flag=0;  //高则指示单片机从芯片取数据的那段时间

int jsq=3;	  //计数器
uchar id=0;  //index

bit time_up=0;
bit ready2send=0;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
/*******************************************************************************************/
/****  receive_module nrf905 控制引脚  ****/
//#define COM8255 XBYTE[0xE003] 		 //命令口地址
/* 8255 reset */
sbit RST8255 = P1^4;
/* 输出缓存,8255端口B ,定义了一个可位寻址的变量 */
unsigned char bdata PB;
    sbit SCK    = PB^7;	
	sbit TX_EN  = PB^6;
    sbit TRX_CE = PB^5;
    sbit PWR_UP = PB^4;
    sbit MOSI   = PB^2;
    sbit CSN    = PB^0;


sbit AM =P3^2;
sbit DR =P3^3;
sbit MISO= P3^4;
sbit CD =P3^5;
/*******************************************************************************************/
//void InitIO(void);   // Initialize IO port
void InitWireless(void);   // 
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(int n);   // Delay 100us  
void Wireless_int0(void);
void Wireless_while(void);
//void TxData (uchar x);   // Send key_value to CRT display
void Key1(void);
void Key2(void);
void Key3(void);
void Key4(void);


//////////////////////////////////////////////////////

void InitWireless(void)
{
	// 8255初始化 
    RST8255=0;
	ADDR_8255_control=0x81;
    //================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 
 	PB8255=PB;
 //================
 Config905();    // Config nRF905 module

 
 SetRxMode();    // Set nRF905 in Rx mode

}


//////////////////////////////////////////////////////




/*******************************************************************************************/
//function Delay100us();Delay 100us
/*******************************************************************************************/
void Delay(int n)
{
 int i;

 for(i=0;i<n;i++) _nop_(); 
}
/*******************************************************************************************/


/*******************************************************************************************/
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; PB8255=PB; }
  else
   {MOSI=0; PB8255=PB; }
  Delay(10); 
  SCK=1;PB8255=PB;
 // Delay(1);
  Delay(10);
       // Set clock line high
 // Shift DATA_BUF
  DATA_BUF=DATA_BUF<<1; 
  SCK=0;   PB8255=PB;  // Set clock line low
 // Delay(10);
  
 // _nop_();_nop_();_nop_();_nop_(); Delay(10);
 } 
}
/*******************************************************************************************/
//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; PB8255=PB;    // Set clock line high
 //  _nop_();_nop_();_nop_();_nop_(); Delay(10);
  if (MISO)
   flag1=1;   // Read data
  else
   flag1=0;
       
  Delay(10);
  SCK=0; PB8255=PB;    // Set clock line low
  Delay(10);
 // _nop_();_nop_();_nop_();_nop_();  Delay(10);
 }
 return DATA_BUF;   // Return function parameter
}


/*******************************************************************************************/
void Config905(void)
{
 uchar i,flag=1;    
 CSN=0;  PB8255=PB;    // 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;  PB8255=PB;    // Disable Spi



 CSN=0;PB8255=PB;
	SpiWrite(RC);
  for (i=0;i<RxTxConf.n;i++) // Write configration words  写放配置字
 {
  temp.buf[i]=SpiRead();
 }
 CSN=1;	PB8255=PB;
 for(i=0;i<RxTxConf.n;i++)
 {
 	if ( temp.buf[i] == RxTxConf.buf[i]) flag++;
 }
 fir_dis=flag;
 if(flag!=11)
 Config905();
}

/*******************************************************************************************/
void FixConfig(void)	//fix the configuration command if it goes wrong
{
 uchar i,flag=1;
 TRX_CE=0;PB8255=PB;Delay(100);
 CSN=0;	PB8255=PB;
SpiWrite(RC);
  for (i=0;i<RxTxConf.n;i++) // Write configration words  写放配置字
 {
  temp.buf[i]=SpiRead();
 }
 CSN=1;	PB8255=PB;
 for(i=0;i<RxTxConf.n;i++)
 {
 	if ( temp.buf[i] == RxTxConf.buf[i]) flag++;
 }
 if (flag!=(RxTxConf.n+1))
 {
 for_dis=10;

 	TRX_CE=0;PB8255=PB;Delay(100);

	Config905();


 }
}
/*******************************************************************************************/

//function SpiWrite();

/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
 uchar i;
 TRX_CE=0;
 //Config905();    
 CSN=0;    PB8255=PB;  // Spi enable for write a spi command 
 SpiWrite(WTP);    // Write payload command
 for (i=0;i<SB;i++)
 {
  SpiWrite(TxBuf[i]);  // Write 32 bytes Tx data
 }
 CSN=1;    PB8255=PB;  // Spi disable      
 Delay(1);
 CSN=0;   PB8255=PB;   // Spi enable for write a spi command 
 SpiWrite(WTA);    // Write address command
 for (i=0;i<(RxTxConf.n-6);i++)   // Write 4 bytes address
 {
  SpiWrite(RxTxConf.buf[i+5]);
 } 
 CSN=1;      // Spi disable
 TRX_CE=1;  PB8255=PB;   // Set TRX_CE high,start Tx data transmission
 Delay(1000);     // while (DR!=1);
 TRX_CE=0;  PB8255=PB;   // Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
void RxPacket(void)
{
 uchar i; 
 TRX_CE=0;  PB8255=PB;    // Set nRF905 in standby mode 
 Delay(100);
 CSN=0;   PB8255=PB;   // Spi enable for write a spi command
 SpiWrite(RRP);    // Read payload command 
 for (i=0;i<SB;i++)
 {
  RxBuf[i]=SpiRead();  // Read data and save to buffer  
 }
 CSN=1;   PB8255=PB;   // Disable spi
 while(DR||AM) _nop_(); 
 //P0= RxBuf[0];    // Buffer[0] output from P0 port...
 TRX_CE=1;	 PB8255=PB;
/* if (!(RxBuf[0]==0&&RxBuf[1]==0)  )
  for (i=0;i<SB;i++)
 {
  TmpBuf[i]=RxBuf[i];  // Read data and save to buffer  
 }	 */
 //xx=(RxBuf[0]>>4)&0x0f;
// for (i=0;i<SB;i++) TxData(RxBuf[i]);
   
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)    
{ 
 TX_EN=1;
 TRX_CE=0; PB8255=PB;
 Delay(100);      // delay for mode change(>=650us)
 r_flag=0;
}    
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{

TRX_CE=0;  PB8255=PB;
Delay(100);
Config905();
//FixConfig();
Delay(100);
 TX_EN=0;
 TRX_CE=1;	PB8255=PB;
 Delay(100);      // delay for mode change(>=650us)  
  r_flag=1;  
 
}

void Wireless_int0(void)
{
	int i;
	 if(p_counter<30) p_counter++;

	/* 检测到按键被按下(0)时,相应的指示灯亮(0) */
	if (pKEY1==0)
	{if (p_counter==30)  {p_counter=0;Key1();} }
	if (pKEY2==0) 
	{if (p_counter==30)  {p_counter=0;Key2();} }
	if (pKEY3==0) 
    {if (p_counter==30)  {p_counter=0;Key3();} }
	if (pKEY4==0) 
	{if (p_counter==30)  {p_counter=0;Key4();} }
				


	if(trsec>0 && (!retrieving_flag))
	{
		if (trsec%180==0)
		{ 
			SetTxMode();
			for(i=0;i<SB;i++)
			TxBuf[i]=jj;
			jj++;
			if(jj>15) jj=0;
			TxPacket();
			SetRxMode();
		}
		trsec--;
		if (trsec==0) trsec=200;
	}
}
void Wireless_while(void)
{
  if (r_flag && DR)   // Ifr recive data ready...
   {
  
   r_flag=0;
   retrieving_flag=1;
   RxPacket();   // ... recive data
	fir_dis = RxBuf[1]; //jsq++;	 
	sec_dis = RxBuf[2];
	thi_dis = RxBuf[3];
	for_dis	= jsq;if (jsq<15)jsq++; else jsq=0;
	

	SetRxMode();
//	Delay(1000);
	retrieving_flag=0;
	 r_flag=1;
	
	} 
}


#endif

⌨️ 快捷键说明

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