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

📄 nrf905.c

📁 基于8051单片机的nrf905发送/接收c程序
💻 C
字号:
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
#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
////////////SPI指令
#define WC   0x00
#define RC   0x10
#define WTP   0x20
#define RTP   0x21
#define WTA   0x22
#define RTA   0x23
#define RRP   0x24
uchar bdata DATA_BUF;//数据缓冲
#define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
#define TxRxBuf_Len 4
uchar TxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32};
uchar TxRxBuffer[TxRxBuf_Len];
//配置口定义//
sbit TXEN=P2^0;//'1'TX模式,'0'RX模式
sbit TRX_CE=P3^2;
sbit PWR=P2^1;//芯片上电
sbit MISO=P2^6;
sbit MOSI=P2^5;
sbit SCK=P2^7;
sbit CSN=P2^3;
/////////////////////////////////////////////////////
sbit AM=P2^4;
sbit DR=P3^3;
sbit CD=P2^2;
///////////////////////////////////////////////////////

/*sbit KEY0=P3^6;
sbit KEY1=P3^7;
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~~9段码
sbit led1=P2^1;
sbit led0=P2^0;
sbit led2=P2^2;
sbit led3=P2^3;*/

//RF寄存器配置//
uchar idata RFConf[11]=
{
	0x00,                             //配置命令//
	0x9F,                             //CH_NO,配置频段在902.8MHZ
	0x0F,                             //输出功率为10db,不重发,节电为正常模式
	0x44,                             //地址宽度设置,为4字节
	0x20,0x20,                        //接收发送有效数据长度为32字节
	0xCC,0xCC,0xCC,0xCC,              //接收地址
	0x58                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
uchar code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
///////////延时/////////////////
static void Delay(uchar n)
{
	uint i;
	while(n--)
	for(i=0;i<80;i++);
}

///////////////
uchar SpiRead(void)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{
	   DATA_BUF=DATA_BUF<<1;
	   SCK=1;
	   if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
	   {
	    DATA_BUF|=BYTE_BIT0;
	   }
	   else
	   {
	    DATA_BUF&=~BYTE_BIT0;
	   }
	   SCK=0;
	}
	return DATA_BUF;
}

void SpiWrite(unsigned char send)
{
	unsigned char i;
	DATA_BUF=send;
	for (i=0;i<8;i++)
	{
	   if (DATA7) //总是发送最高位
	   {
		  MOSI=1;
	   }
	   else
	   {
		  MOSI=0;
	   }
	   SCK=1;
	   DATA_BUF=DATA_BUF<<1;
	   SCK=0;
	}
}
////////////////初始化nRF905///////////////////
void nRF905Init(void)
{
	CSN=1;       // Spi disable
	SCK=0;       // Spi clock line init low
	DR=0;       // Init DR for input
	AM=0;       // Init AM for input
	CD=0;       // Init CD for input
	PWR=1;      // nRF905 power on
	TRX_CE=0;      // Set nRF905 in standby mode
	TXEN=0;      // set radio in Rx mode
}
////////初始化寄存器
void Config905(void)
{
	uchar i;
	CSN=0;       // Spi enable for write a spi command
	SpiWrite(WC);     // Write config command写放配置命令
	for (i=0;i<11;i++) // Write configration words 写放配置字
	{
	    SpiWrite(RFConf[i]);
	}
	CSN=1;      // Disable Spi
}

/////////////
void SetTxMode(void)
{
	TRX_CE=1;
	TXEN=1;
	Delay(1);       // delay for mode change(>=650us)
}

void SetRxMode(void)
{
	TRX_CE=1;
	TXEN=0;
	Delay(1);       // delay for mode change(>=650us)
}
////////////////////////////////////////////////////
void TxPacket(void) //发送数据
{
	uchar i;

	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(TxAddress[i]);
	}
	CSN=1;       // Spi disable
	Delay(1);     
	
	CSN=0;
	SpiWrite(WTP);     // Write payload command
	for (i=0;i<4;i++)
	{
	   SpiWrite(TxRxBuf[i]);   // Write 32 bytes Tx data
	}    // Spi enable for write a spi command
	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
}
////////////////////////////////////////////////////
void RxPacket(void)        //接收数据
{
	uchar i;
    Delay(1);
    TRX_CE=0;      // Set nRF905 in standby mode
	Delay(100);
	CSN=0;       // Spi enable for write a spi command
	Delay(1);
	SpiWrite(RRP);
	// Delay(10000);
	   // Delay(10000);    // Read payload command
	for (i = 0 ;i < 4 ;i++)
	{      // Delay(10000);
	          //   Delay(10000);
	          //   Delay(10000);
	         //    Delay(10000); 
	   TxRxBuffer[i]=SpiRead();   // Read data and save to buffer
	           // Delay(10000);
	            //    Delay(10000);
	            //    Delay(10000);         
	}
	CSN=1;
    Delay(10);
	
	TRX_CE=1;       
}
/////////////////////////////////////////////////////////

uchar CheckCD(void) //Pin->检查是否已存在 同频率载波
{
	if (CD==1)
	{
	   return 1;
	}
	else
	{
	   return 0;
	}
}

uchar CheckDR(void)   //检查是否有新数据传入 Data Ready
{
	if (DR==1&&TRX_CE==1 && TXEN==0)
	{
	       // Delay(50) ;
	   return 1;
	}
	else
	{
	   return 0;
	}
}
//////////////////////////////////////////////////////////
void TX(void)
{
	 SetRxMode();
	 while(CheckCD()==1);//载波征听防碰撞
     TxPacket();// Send data by nRF905
   	 SetTxMode();// Set nRF905 in Tx mode
	 
      //CheckCD(); // 返回CD的当前电平
	
	// SetRF_PA_PWR(unsigned char i); //设置发射功率
}

void RX(void)
{
     SetRxMode();    // Set nRF905 in Rx mode
    //Delay(10000);
     while (CheckDR()==0);
         //Delay(10000);
      Delay(10);
      RxPacket();
         //Delay(10000);    // Recive data by nRF905
      Delay(10);
}

/*
/////////////串口初始化
void Inituart(void)
{
	TMOD = 0x20;     //timer1 working mode 1
	TL1 = 0xfd;      //f7=9600 for 16mhz Fosc,and ...
	TH1 = 0xfd;      //...fd=19200 for 11.0592mhz Fosc
	SCON = 0xd8;     //uart mode 3,ren==1
	PCON = 0x80;     //smod=1
	TR1 = 1;      //start timer1
}
void R_S_Byte(uchar R_Byte)
{ 
	SBUF = R_Byte; 
    while( TI == 0 );    //查询法
	TI = 0;
}
void time0sym()
{
  
   TH0=0xE2 ;     //重载计数初始值
   TL0=0x00 ;
   TR0=1;
   ET0=1;
   EA=1;
   TF0=0 ;          //清中断
}
void time0_int() interrupt 1
{

	if(TF0==1)        //10ms中断
	{
	   TF0=0 ;        //清中断 
	   TH0=0xE2 ;     //重载计数初始值
	   TL0=0x00 ;
	   count=count+1 ;
	   if(count==100)        //1s
	   { 
	      count=0;           //每1秒清count ,重新开始等待1秒    
	   }
	}
}
*/

void main(void)
{
     //uchar i;
	 //Inituart();
     nRF905Init();
     Config905();
     while(1)
     {  
		      
	       TX();// Send data by nRF905
		    // Delay(250);
		   RX();
		
     }
}

⌨️ 快捷键说明

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