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

📄 my_nrf905.c

📁 这是我自己写的nRF905射频IC收发于一起的程序。
💻 C
字号:
//此程序没有加接收反回指令
//
#include <reg52.h>
#include <intrins.h>
#include <my_nRF905.h>

/************timer0定时中断***********/
void timer0(void) interrupt 1 using 0
{	
	TH0=timer0h;
	TL0=timer0l;
	delay_flag = 1;
	TF0 = 0;
}

/********每单位时间延时50 us   *******/
void delay(unsigned  char n)
{
	while(n>0)
	{
		TR0=ON;					//启动T0定时
		ET0=1;
		TH0=timer0h;            //T0定时15MS
		TL0=timer0l;
		delay_flag=False;
		while(!delay_flag);
		TR0=OFF;					//启动T0定时
		ET0=0;
		n--;
	}
}				
/**********延时650子程序************/
void delay650(void)
{
	unsigned char delay_num;			//延时650us要运行的次数
	delay_num = 180;
	while(delay_num)
	{
		delay_num--;
		_nop_();
	}
}

/**********SPI发送一个字节*********/
void SpiWrite(unsigned char val)
{
	unsigned char i, j;
  for (i = 8; i > 0; i --)
  {
    j = val & 0x80;
    if(j == 0x80)
    {
    	MOSI = 1;
    }
	else
	{
		MOSI = 0;
	}
    SCK = ON;//上升沿打入数据
    val <<= 1;
    _nop_();
    SCK  = 0;//下降沿读入数据(首次为假动作)
    _nop_();
  }
}
/**********SPI读取一个字节*********/
unsigned char SpiRead(void)
{
	unsigned char i,val = 0;
	for (i = 8; i > 0; i--)
	{
		val <<= 1;
		if(MISO)
		{
			val |= 0x01;
		}
		
    SCK = 1;						//上升沿打入数据
    _nop_();
    SCK = 0;						//下降沿读入数据(首次为假动作)
    _nop_();
  }
  return val;
}

/****** Spi 写RF发送的数据*************/
void SpiWrite_some(unsigned char *m1,unsigned char m2)
{
	unsigned char b;
	SCK=0;
	CSN=0;
	SpiWrite(WTP);
	SpiWrite(m2);
	SpiWrite(0xFA);
	SpiWrite(0XAF);
	while(m2)
	{
		b=*m1;
		SpiWrite(b);
		m1++;
		m2--;
	}
	CSN=1;	
}

/*************配置nRF905函数 **********/
void Config905(void) using 0//配置nRF905
{
    CSN = OFF; 											 // Spi enable for write a spi command
    SpiWrite(WC);                							 // Write config command
    for(count_p=0;count_p<10;count_p++)
    {
  	    SpiWrite(configbuf[count_p]);
    }
    CSN = ON;                        							 // Disable Spi
}
/*****RF写发送地址**********/
void Spi_tx_addr(void)
{
	CSN=0;
	SpiWrite(WTA);
	SpiWrite(0x29);		//0x28
	SpiWrite(0x88);		//0x55
	SpiWrite(0x0c);		//0x5a
	SpiWrite(0x0c);		//0xa5
	CSN=1;
}

/************RF发送子程序*****************/
void RF_send (void)
{
	TX_EN	= ON;
	TRX_CE  = ON;
	delay650();
	delay650();
	delay650();
	delay650();
	delay650();
	while(!DR);
	TRX_CE  =0;
}
	
/********mRF905的初始化***********/
void InitnRF905(void)
{
	CSN  	= ON;
	SCK  	= OFF;
	PWR_UP  = ON;
	TRX_CE  = OFF;
	TX_EN   = OFF;
	DR  	= OFF;
	AM  	= OFF;
	for(count_p=0;count_p<10;count_p++)
	{
	    configbuf[count_p]=config_tab[count_p];
	}
	configbuf[0]=FreqBill[frequency];
	if(frequency>=8)
	{
	    configbuf[1]++;
	}
}
/*****************/
void Sysinit(void)     
{	
	P1=0xff;
	P2=0xff;
	P3=0xff;

	IP=0x10;					//打开INT0及Serial优先级,INT0的优先级大于Serial的优先级。
	TMOD=0x21;            		//T0.T1工作于方式1 ,T1工作于方式2

	TH1=250;            		//T1波特率  9600--22M
	TL1=250;
	TR1=ON;						//启动T1定时
	PCON=0x00;					//波特率选择
	SCON=0x50;					//设置串口工作模式1,并打开允许接收.并收发中断,RI,TI = 0; 

	EA=1;						//打开总中断使能
	ES = 1; 					//关闭串口中断使能
	EX0=0;						//关闭INT0计数器的使能
	EX1=0;						//关闭INT1计数器的使能

	TI = 0;						//无发送中断标志
	RI = 0;						//无接收中断标志
	IT0=1;						//设置INT0的电平触发方式,负边沿触发
	IT1=0;						//设置INT0的电平触发方式,电平触发
}
/*********INT0中断子程序*************
  表示RF中的数据接收完毕***********/	
void intr0_int(void) interrupt 0 using 1
{	
		if(!write_flag)
		{
			write_flag=True;
			TRX_CE=OFF;
			TX_EN =OFF;

			delay650();

			if(!RFrec_flag)
			{
				CSN=0;
				SpiWrite(RRP);
				RFrec0_num = SpiRead();
				for(count_p=0;count_p<RFrec0_num + 2;count_p++)
				{
					rxpack0_buf[count_p]=SpiRead();
				}
				CSN=1;
				RFrec0_flag = 1;
			}
			else
			{
			   	CSN=0;
				SpiWrite(RRP);
				RFrec1_num = SpiRead();
				for(count_p=0;count_p<RFrec1_num + 2;count_p++)
				{
					rxpack1_buf[count_p]=SpiRead();
				}
				CSN=1;
				RFrec1_flag = 1;
			}
		}
}
/*********INT1中断子程序*************
    RF中的数据地址正确**********/
void intr1_int(void) interrupt 2 using 3
{		
		AMflag=False;
		if(!write_flag)
		{
			AMflag=True;
		}
}

/**********串口接收中断*************/
void serial_int() interrupt 4 using 3
{
	if(RI)
	{   
    	RI=0;
		rec_ok = 0;
		if(!rec_flag1)
		{
			recv0_data = SBUF;
			recv0_buf[recv0_num] = recv0_data;
			recv0_num++;
			recv0_flag = 1;
		}
		else
		{
			recv1_data = SBUF;
			recv1_buf[recv1_num] = recv1_data;
			recv1_num++;
			recv1_flag = 1;
		}
		rec_ok = 1;											   //表示串口现在接收完了。
	}
	_nop_();
}

/*************串口发送一个字节子程序******/
void SendByte(unsigned char x)
{
	SBUF=x;
	while(!TI);
	TI=0;
}
/***********RF接收状态**********/
void SetRxStatus(void)
{
			TRX_CE  =1;
			TX_EN   =0;
			delay650();
			delay650();

 			TR0=ON;					//启动T0定时
			ET0=1;
 			delay(50);
 			write_flag=False;
}

/*********RF发送打包子程序***********/
void TxPack(void)
{
	  	unsigned char *a1,*a2;
		unsigned char b1,b2;
		while(write_flag);
		RERFOK = 0;					//发送指示灯亮
		write_flag=1;
		TX_EN	= OFF;
		TRX_CE  = OFF;
		delay650();
		
		Spi_tx_addr();
		_nop_();

		if(recv0_flag)
		{
			_nop_();
		   	if(deal0_flag)
			{
				a1 = &recv0_buf[0];
				b1 = recv0_num;
				SpiWrite_some(a1, b1);
				_nop_();
				
				RF_send ();
				_nop_();
			}
		}
		if(recv1_flag)
		{
			_nop_();
			if(deal1_flag)
			{
			  	a2 = &recv1_buf[0];
				b2 = recv1_num;
				SpiWrite_some(a2, b2);
				_nop_();
			
				RF_send ();
				_nop_();
			}
		}
		RERFOK = 1;				   	//发送指示灯亮
		write_flag = 0;
}



/**************RF接收包**********/

/*******主程序*******/
void main(void)
{
	P1=0xff;
	P2=0xff;
	P3=0xff;
	Sysinit();										//系统初始化

	frequency=0;				  					//设置频点
	frequency=(P2^0x0f)&0x0f;

	delay(30);

	InitnRF905();

	DR=OFF;
	AM=OFF;

	delay(60);
	/*******全局变量标志位初值*********/

	deal0_flag = 0;						//处理串口数组0的标志位
	deal1_flag = 0;						//处理串口数组1的标志位
	rec_flag1 = 0;					//串口接收数组分类的标志位
	recv0_flag = 0;					//串口接收数组0是否有数据
	recv1_flag = 0;					//串口接收数组1是否有数据

	rec_ok = 0;		   				//串口单个字节接收是否完成的标志位
	RFrec_flag = 0;					//RF接收数组分类标志位
	RFrec0_flag = 0;				//RF接收数组0是否有数据的标志位
	RFrec1_flag = 0;			    //RF接收数组1是否有数据的标志位

	AMflag = 0;
	count_p = 0;
	count_r = 0;
	write_flag = 0;;				//是否正在读取的标志位
	delay_flag = 0;					//延时中断标志位

	recv0_num = 0;					 //串口接收数组0的字节个数
	recv1_num = 0;					 //串口接收数组1的字节个数

	RFrec0_num = 0;					 //RF接收数组0的字节个数
	RFrec1_num = 0;					 //RF接收数组1的字节个数

	PWR_UP=ON;						  //给nRF905上电,并设置
	TRX_CE=OFF;
	TX_EN=OFF;
	Config905();

	delay(60);
	IE0 = 0;
	EX0 = 1;

	delay650();
	SetRxStatus();

	while(1)
	{
		_nop_();
		/********检测串口接收数组0是否有数据发送**********/
		if (rec_ok)
		{
			_nop_();
			if (recv0_flag)
			{
				rec_flag1 = 1;
				deal0_flag = 1;
				rec_ok = 0;
				TxPack();
				_nop_();
				delay650();
				delay650();
//				TI = 0;
//     			for(count_r=0;count_r < recv0_num ;count_r++)
//		   		{
//		    		SendByte(recv0_buf[count_r]);
//				}
				recv0_num = 0;
				recv0_flag = 0;
				rec_flag1 = 0;
				deal0_flag =0;
			}
		}
		/**********下面是RF接收数据**********/
		if(RFrec0_flag)
		{							  
			
			RFrec_flag = 1;
			RFrec0_flag = 0;
				RERFOK = 0;
				delay650();
			if ((rxpack0_buf[0] == 0xFA) && (rxpack0_buf[1] == 0xAF))
			{
				TI = 0;
				for(count_r=2;count_r < RFrec0_num + 2 ;count_r++)
				{
   					SendByte(rxpack0_buf[count_r]);
				}
			}
			RFrec0_num = 0;
			RFrec_flag = 0;
			RERFOK = 1;
		}
		/**********检测接收状态************/
		delay650();
		SetRxStatus();
		delay650();
		/********检测串口接收数组1是否有数据发送**********/
		if (rec_ok)
		{
			_nop_();
			if (recv1_flag)
			{
				rec_ok = 0;
				deal1_flag = 1;
				TxPack();
				_nop_();
				delay650();
				delay650();
//				TI = 0;
//		   		for(count_r=0;count_r < recv1_num; count_r++)
//		   		{
//		    		SendByte(recv1_buf[count_r]);
//				}
				recv1_num = 0;
				recv1_flag = 0;
				deal1_flag = 0;
			}
		}
		/*********判断RF接收的数据是否正确***********/
		if(RFrec1_flag)
		{							  
			RERFOK = 0;
			RFrec1_flag = 0;
			if ((rxpack1_buf[0] == 0xFA) && (rxpack1_buf[1] == 0xAF))
			{
				TI = 0;
				for(count_r=2;count_r < RFrec1_num + 2;count_r++)
				{
   					SendByte(rxpack1_buf[count_r]);
				}
			}
			RFrec1_num = 0;
			RERFOK = 1;
		}
		 /************检测接收状态************/
		delay650();
		SetRxStatus();
		delay650();
	}
	_nop_();
}

⌨️ 快捷键说明

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