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

📄 nrf9e5发送主程序.txt

📁 本程序对目前应用较火的905有很大的帮助对单片机开发同僚有用
💻 TXT
字号:
#include <reg9e5.h>
#include "ISD51.h"

#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
///////////////////////////////////////////////////////////////////////////////

//*****************************************************************************
//I/O口定义
//*****************************************************************************
sbit LEDG  =P0^6;
sbit LEDR  =P0^5;
sbit KEY1  =P0^3; 
sbit KEY2  =P0^4;
///////////////////////////////////////////////////////////////////////////////

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



//*****************************************************************************
//全局变量?//*****************************************************************************
INT16U TimerCount[2] = {0x00, 0x00};	//超时计数器
INT8U T0_L;			//定时器0初值低字节。
INT8U T0_H;			//定时器0初值低字节。
///////////////////////////////////////////////////////////////////////////////

//*****************************************************************************
//函数名:void Delay100us(INT8U n)
//输入:时间
//输出:无
//功能描述:廷时100us
//*****************************************************************************
void Delay100us(INT8U n)
{
	INT8U i;
	while(n--)
	for(i=0;i<35;i++);
}


//*****************************************************************************
//函数名: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;			// 清除SPI中断标致位
	SPI_DATA = b;                             
	while((EXIF & 0x20) == 0x00);	//等待发送接收完成
	return SPI_DATA;
}

//*****************************************************************************
//函数名:void InitTimer(void)
//输入:无
//输出:无
//功能描述:定时器0初始化
//*****************************************************************************
void InitTimer(void)
{
	TR0 = 0;
	TMOD &= ~0x03;
	TMOD |= 0x01; 		//16位定时
	CKCON |= 0x00;
   
	T0_H = 0xFA;
	T0_L = 0xCA; 		//1MS
	TF0 = 0; 
	TR0 = 1;
	ET0 = 1;
}
	

//*****************************************************************************
//函数名:ResetTimer(INT8U n)
//输入:要复位的计时器
//输出:无
//功能描述:复位计时器
//*****************************************************************************
void ResetTimer(INT8U n)
{
	ET0 = 0;                                   
	TimerCount[n & 0x01] = 0;	//清零超时计数器                       
	ET0 = 1;                                   
}


//*****************************************************************************
//函数名:INT16U ReadTimer(INT8U n)
//输入:要读的计时器
//输出:读出值
//功能描述:读计时器
//*****************************************************************************
INT16U ReadTimer(INT8U n)
{
	INT16U tmp;
	ET0 = 0;                                   
	tmp = TimerCount[n];		//读出超时计数器值    
	ET0 = 1;                                
	return tmp;
}

//*****************************************************************************
//函数名:InitUart(void)
//输入:无
//输出:无
//功能描述:串口初始化
//*****************************************************************************
void InitUart(void)
{
	TH1 = 243;                      // 19200                             
	CKCON |= 0x10;
	PCON = 0x80;                    // SMOD=1 
	SCON = 0x52;                    // 模式1,使能接收
	TMOD &= ~0x30;
	TMOD |= 0x20;                   
	TR1 = 1;                        // timer1开启
	P0_ALT |= 0x06;                 // 串口端口使能
	P0_DIR |= 0x02;                 // P0.1 输入
	P0_DIR &= 0xfb;
	ES = 0;
	ISDwait();
}



//*****************************************************************************
//函数名:void SendCh(INT8U c)
//输入:发送的数据
//输出:无
//功能描述:发送一个字节
//*****************************************************************************
void SendCh(INT8U c)
{
	EA = 0;
	TI = 0;
   	
	SBUF = c;
	while(!TI);//等待发送完成
	TI = 0;
	EA = 1;
}


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

	SPICLK = 0;                         	// Max SPI clock
	SPI_CTRL = 0x02;                    	// SPI接到RF端
	
	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;        		//P0.6,P0.5,P0.7 输出  
	LEDR=0;
	LEDG=0;
	P0_DIR |= 0x18;             		// P0.3,P0.4 输入   
	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;
}

//*****************************************************************************
//函数名:TransmitPacket(INT8U *pBuf)
//输入:发送的数据
//输出:无
//功能描述:发送发送缓冲区的数据
//*****************************************************************************
void TransmitPacket(INT8U *pBuf)
{
	INT8U i;			
	    	
	RACSN = 0;
	SpiReadWrite(WTP);
	for(i=0; i<Nrf9e5Config[4]; i++)
	{
		SpiReadWrite(pBuf[i]);//写入发送数据缓冲区
	}
	RACSN = 1;
    	
	TXEN = 1;
	TRX_CE = 1;				//使能发送
	Delay100us(1);
	TRX_CE = 0;
}

//*****************************************************************************
//函数名:INT8U Recepacket(INT8U *pBuf)
//输入:接收数据缓冲区
//输出:成功返回1,否则返回0
//功能描述:接收数据存在缓冲区内
//*****************************************************************************
INT8U Recepacket(INT8U *pBuf)
{
	INT8U i;
	TXEN = 0;
	TRX_CE = 1;
	ResetTimer(1);//复位超时计数器。
	while(DR == 0)//有收到切换到空闲状态时退出接收状态。
	{
		if(ReadTimer(1) > 300)//300MS超时退出。
		{
			TRX_CE = 0;				
			return 0;
		}
		
	}
	TRX_CE = 0;
        
	RACSN = 0;
	SpiReadWrite(RRP);
	for(i=0; i<Nrf9e5Config[4]; i++)//读出数据。
	{
		pBuf[i] = SpiReadWrite(0);
	}
	while(DR)//直到DR为高。
	{
		SpiReadWrite(0);
	}
	RACSN = 1;
	return 1; 
}

/******************************************************************************
*******************************************************************************
**********************************中断服务程序*********************************
*******************************************************************************
******************************************************************************/
void Timer0ISR (void) interrupt 1			//定时器0中断
{
	EA = 0;
	TF0 = 0;
	TH0 = T0_H;                             
	TL0 = T0_L;                            
	TimerCount[0]++;                 
	TimerCount[1]++; 
	EA =1;
}


/******************************************************************************
*******************************************************************************
***********************************主程序**************************************
*******************************************************************************
******************************************************************************/
main()
{
	INT8U RxBuf[4];		//接收数据缓冲区
	InitCpu();		//初始化CPU
	InitTimer();
	InitUart();		//初始化串口。
	delay(5000);
	Init9E5();		//初始化NRF9E5
	
	LEDR = 1;
	LEDG = 1;		//两个LED灭。
	SendCh('a');
		
	while(1)
	{
		if(Recepacket(RxBuf))		//接收到数据。
		{
			if(RxBuf[2] == 0x0F)
			{
				LEDG = 0;
				delay(40000);
				LEDG = 1;
			}
			else if(RxBuf[2] == 0xF0)
			{
				LEDR = 0;
				delay(40000);
				LEDR = 1;
			}
			SendCh(RxBuf[0]);
			SendCh(RxBuf[1]);
			SendCh(RxBuf[2]);
			SendCh(RxBuf[3]);
		}
	}
}

//end

⌨️ 快捷键说明

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