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

📄 main.c

📁 NRF9E5简易表演程序 用于无线收发数据。
💻 C
字号:
#include <reg9e5.h>


#define 	int8u 	unsigned char 
#define 	int16u	unsigned int 
#define 	INT8U 	unsigned char 
#define 	INT16U	unsigned int



#define WRC     0x00 //W_RF_CONFIG
#define RRC     0x10 //R_RF_CONFIG
#define WTP     0x20 //W_TX_PAYLOAD
#define RTP     0x21 //R_TX_PAYLOAD
#define WTA     0x22 //W_TX_ADDRESS
#define RTA     0x23 //R_TX_ADDRESS
#define RRP     0x24 //R_RX_PAYLOAD
#define RAD     0x40 //R_ADC_DATA 
#define WAC     0x44 //W_ADC_CONFIG
#define RAC     0x46 //R_ADC_CONFIG
#define WTU     0x50 //W_TEST_UNLOCK (use with data A5)
#define WTR     0x52 //W_TEST_REGISTER
#define RTR     0x53 //R_TEST_REGISTER
#define CC      0x80 //CHANNEL_CONFIG
#define SAV     0xC0 //START_ADC_CONV
#define HFREQ    1     // 0=433MHz, 1=868/915MHz    19/08/2004 set 915mhz
#define POWER    3     // 0=min power...3 = max power

#define TurnBY() 	TRX_CE = 0;TXEN = 0


sbit LEDG  =P0^6;
sbit LEDR  =P0^5;

	
int8u Nrf9e5Config[10] = {	
				0x28,			//频道设置
				
				0x0e,			//自动重发关,发送节电模式关,输出功率10dB,915MHZ
				
				0x44,			//收发地址都为4字节
				
				0x0a,			//接收数据长度,10字节
				
				0x0a,			//发送数据长度,10字节
				
				0xe7,
				0xe7,
				0xe7,
				0xe7,			//地址
							
				0xdf			//CRC开,16位校验,16M晶振,外部时钟使能500KHZ输出
				};


int8u Rxbuf[37];


int8u timer[2];
int8u T0LREL, T0HREL;



/*****************************************************************************************
//函数名:void delay(int16u s)
//输入:时间
//输出:无
//功能描述:普通廷时
/*****************************************************************************************/
void delay(int16u s)
{
	int16u i;
	for(i=0; i<s; i++);
	for(i=0; i<s; i++);
}

/*****************************************************************************************
//函数名:int8u SpiReadWrite(int8u b)
//输入:发送的数据
//输出:收到的数据
//功能描述:SPI发送接收一个字节
/*****************************************************************************************/
int8u SpiReadWrite(int8u b)
{
	EXIF &= ~0x20;                              // Clear SPI interrupt
	SPI_DATA = b;                               // Move byte to send to SPI data register
	while((EXIF & 0x20) == 0x00);                // Wait until SPI hs finished transmitting
	return SPI_DATA;
}



/*****************************************************************************************
//函数名:InitTimer(void)
//输入:无
//输出:无
//功能描述:定时器0初始化
/*****************************************************************************************/
void InitTimer(void)
{
	timer[0] = timer[1] = 0;

	TR0 = 0;
	TMOD &= ~0x03;
	TMOD |= 0x01;                               // mode 1
	CKCON |= 0x00;                              // T0M = 1 (/4 timer clock)

    	T0LREL = 0x60;                              // 1KHz tick...
    	T0HREL = 0xF0;                              // ... = 65536-16e6/(4*1e3) = F060h 
	TF0 = 0;                                    // Clear any pending Timer0 interrupts
	TR0 = 1;                                    // Start Timer0
	ET0 = 1;                                    // Enable Timer0 interrupt
}

	


/*****************************************************************************************
//函数名:ResetTimer(int8u n)
//输入:要复位的计时器
//输出:无
//功能描述:复位计时器
/*****************************************************************************************/
void ResetTimer(int8u n)
{
	ET0 = 0;                                    // Disable Timer0 interrupt
	timer[n & 0x01] = 0;                        // Clear timer[n]
	ET0 = 1;                                    // Enable Timer0 interrupt
}


/*****************************************************************************************
//函数名:int16u GetTimer(int8u n)
//输入:要读的计时器
//输出:读出值
//功能描述:读计时器
/*****************************************************************************************/
int16u GetTimer(int8u n)
{
	int16u tmp;
	ET0 = 0;                                    // Disable Timer0 interrupt
	tmp = timer[n];                             // Clear timer[n]
	ET0 = 1;                                    // Enable Timer0 interrupt
	return tmp;
}
	


/*****************************************************************************************
//函数名:void InitCpu(void)
//输入:无
//输出:无
//功能描述:Cpu初始化
/*****************************************************************************************/		
void InitCpu(void)
{
	int8u cklf;

	SPICLK = 0;                         // Max SPI clock
	SPI_CTRL = 0x02;                    // Connect internal SPI controller to Radio

	// Switch to 16MHz clock:
	RACSN = 0;
	SpiReadWrite(RRC | 0x09);
	cklf = SpiReadWrite(0) | 0x04;
	RACSN = 1;
	RACSN = 0;
	SpiReadWrite(WRC | 0x09);
	SpiReadWrite(cklf); 
	RACSN = 1;
  
	P0_DIR=P0_DIR&0x1F;        //led p0.6  p0.5 P0.7 output  
	LEDR=0;
	LEDG=0;
	P0_DIR |= 0x18;             // P0.4 /3 is input
	P0_DIR &= 0xf6;			
   
	InitTimer();
	EA = 1;
}

/*****************************************************************************************
//函数名:void Init9E5(void)
//输入:无
//输出:无
//功能描述:Nrf9e5初始化,这里我们配置成32位地址。
/*****************************************************************************************/
void Init9E5(void)
{	
	int8u i;
	
	TRX_CE=0;
	TXEN=0;				//配置模式
	
	RACSN = 0;
	SpiReadWrite(WRC);
	for(i=0; i<10; i++)
	{
		SpiReadWrite(Nrf9e5Config[i]); 
	}

	RACSN = 1;
}


/*****************************************************************************************
//函数名:int8u Recepacket(void)
//输入:接收数据缓冲区
//输出:成功返回1,否则返回0
//功能描述:接收数据存在缓冲区内
/*****************************************************************************************/
int8u Recepacket(void)
{
	int8u i;
	TXEN = 0;
	TRX_CE = 1;
	ResetTimer(1);
	while(DR == 0)
	{
		if(GetTimer(1) > 300)
		{
			TRX_CE = 0;
			return 0;
		}
		
	}
	TRX_CE = 0;
        
	RACSN = 0;
	SpiReadWrite(RRP);
	i = 0;

	for(i=0; i<4; i++)
	{
		Rxbuf[i] = SpiReadWrite(0);
	}
	while(DR)
	{
		SpiReadWrite(0);
	}
	RACSN = 1;
	return 1;
        
}




/******************************************************************************************
*******************************************************************************************
************************************中断服务程序*********************************************
*******************************************************************************************
******************************************************************************************/
void Timer0ISR (void) interrupt 1
{
	EA = 0;
	TH0 = T0HREL;                               // Reload Timer0 high byte
	TL0 = T0LREL;                               // Reload Timer0 low byte
	timer[0]++;                                 // Increment timer[0]
	timer[1]++; 
    	EA =1;
}




/******************************************************************************************
*******************************************************************************************
******************************************主程序********************************************
*******************************************************************************************
******************************************************************************************/
main()
{

	int8u temp;
	InitCpu();
	delay(5000);
	
	Init9E5();
	
	LEDR = 1;
	LEDG = 1;
	

	while(1)
	{
		temp = Recepacket();
		if(temp == 1)
		{
			LEDR = 0;
			LEDG = 0;
			delay(20000);
			LEDR = 1;
			LEDG = 1;
		}
	}

}

⌨️ 快捷键说明

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