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

📄 nrf905_receive.c

📁 用单片机实现传感器网络的程序
💻 C
字号:
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>

/*SPI特殊功能寄存器声明*/
sfr SPCTL=0x85;
sfr SPSTAT=0x84;
sfr SPDAT=0x86;

/*SPI通信数据线*/
sbit SPCLK=P1^7;
sbit MISO=P1^6;
sbit MOSI=P1^5;
sbit CSN=P1^4;

/*905控制引脚*/
sbit TRX_CE=P1^3;
sbit TX_EN=P1^2;
sbit PWR_UP=P1^1;
sbit DR=P1^0;

/*905命令名称*/
unsigned char W_CONFIG=0x00;         //写配置寄存器命令 
unsigned char R_CONFIG=0x10;         //读配置寄存器命令
unsigned char W_TX_PAYLOAD=0x20;     //写TX有效数据命令
unsigned char R_TX_PAYLOAD=0x21;     //读TX有效数据命令
unsigned char W_TX_ADDRESS=0x22;     //写TX地址命令
unsigned char R_TX_ADDDRESS=0x23;    //读TX地址命令
unsigned char R_RX_PAYLOAD=0x24;     //读RX有效数据命令

unsigned char temp;         //存放905收到的数据

sbit LED_905_WORK=P3^4;

/*905配置寄存器初始化*/
unsigned char NRF905_Config[10]=
                             {
							  0x7B, //配置905工作频率为434.7
							  0x0C, //输出功率配置为+10dbm
							  0x44, //发射和接受地址宽度均为4字节
							  0x08, //接收数据为5字节
							  0x01, //发射数据个数为1字节
							  0xE7, //接收地址
                              0xE7,
							  0xE7,
							  0xE8,
                              0xDB	//晶振频率为16MHZ,禁止外部时钟						  
							 };
/*接收方地址*/
unsigned char NRF905_SendAdd[4]={0xE7,0xE7,0xE7,0xE7};

/*SPI初始化*/
void SPI_Init()
     {
	  SPCTL=0xD0;                   //SSIG=1,SPEN=1,DORD=0,MSTR=1,CP0L=0,CPHA=0,SPR1=0,SPR0=0.
	  SPSTAT=0xC0;                  //SPIF=1(清零),WCOL=1(清零)
	 }            
void UART_Init()
     {
	  TMOD=0x20;
	  SCON=0x50;
      PCON=0x00;
	  TH1=0xFD;
	  TL1=0xFD;
	  TR1=1;
	 }
void SPI_SendByte(unsigned char dat)
     {
	  SPDAT=dat;
	  while(!(SPSTAT&0x80));
	  SPSTAT=0xC0;
	 }
void NRF905_Init()
     {
	  unsigned char i;
      PWR_UP=1;
	  TRX_CE=0;
	 CSN=0;
	  SPI_SendByte(W_CONFIG);
	  for(i=0;i<10;i++)
	     {
          SPI_SendByte(NRF905_Config[i]);		   
	 	 }
     CSN=1;
	 }

/*void NRF905_WritAdd()
    {
     unsigned char i;
      PWR_UP=1;
      TX_EN=1;
	  TRX_CE=0;
    CSN=0;
     SPI_SendByte(W_TX_ADDRESS);
     for(i=0;i<4;i++)
     {
      SPI_SendByte(NRF905_SendAdd[i]);
     }
    CSN=1;
    }*/

/*void NRF905_ReadConfig()
    {
     unsigned char i;
     unsigned char config_dat[10];
	  PWR_UP=1;
	  TRX_CE=0;
    CSN=0;
     SPI_SendByte(R_CONFIG);
     for(i=0;i<10;i++)
      {
       SPI_SendByte(0x55);
       config_dat[i]=SPDAT;
      }
    CSN=1;
    for(i=0;i<10;i++)
     {
      SBUF=config_dat[i];
      while(!TI);
      TI=0;
     }
    }
*/
/*void NRF905_LoadDat(unsigned char dat)
     {
	  PWR_UP=1;
      TX_EN=1;
	  TRX_CE=0;
	 CSN=0;
	  SPI_SendByte(W_TX_PAYLOAD);
	  SPI_SendByte(dat);
     CSN=1;
	 }*/

/*void NRF905_SendDat()
     {
	  PWR_UP=1;
	  TX_EN=1;
	  TRX_CE=1;
	  while(DR==0);
	  TRX_CE=0;
	  TX_EN=0;
	 }*/

void  NRF905_ReceiveDat()
    {
     unsigned int count;
	 unsigned char flag=1;
	 PWR_UP=1;
	 TX_EN=0;
	 TRX_CE=1;
	 do{
	   count++;
	   if(count>50000)
	    {
		 count=0;
		 flag=0;
		 break;
		}
	   }
	   while(DR==0);
	if(flag==1) 
	{
     TRX_CE=0;
	 TX_EN=0;
/*	CSN=0;
	 SPI_SendByte(R_RX_PAYLOAD);
	 SPI_SendByte(0xAA);
	 temp=SPDAT;
	CSN=1;
*/

	}
//	return(temp);
}

typedef unsigned long int u4;
typedef unsigned char u1;
#define ROTL32(x,c) (((x)<<(c))|((x)>>(32-c)));
#define ROTR32(x,c) (((x)>>(c))|((x)<<(32-c)));
/* rounds and subkeys */
typedef struct{
		u4 *xk;
		unsigned char nr;
	      } rc5;
void rc5_init(rc5 *,unsigned char);
void rc5_key(rc5 *,u1 *,unsigned char);
void rc5_decrypt(rc5 *,u4 *,unsigned char);
void rc5_init(rc5 *c,unsigned char rounds)
 {
  c->nr=rounds;
   init_mempool (c->xk, 0x1000);
   c->xk=(u4 *) malloc(4*(rounds*2+2));
 }
 void rc5_decrypt(rc5 *c, u4 *dt,unsigned char blocks)
{
 u4 *d,*sk;
unsigned char h1,rc;
int i;
  d=dt;
 sk=(c->xk)+2;
 for(h1=0;h1<blocks;h1++)
    {
     for(i=c->nr*2-2;i>=0;i-=2)
	{
	   d[1]-=sk[i+1];
	   rc=d[0]&31;
	   d[1]=ROTR32(d[1],rc);
	   d[1]^=d[0];

	   d[0]-=sk[i];
	   rc=d[1]&31;
	   d[0]=ROTR32(d[0],rc);
	   d[0]^=d[1];
	 }
	   d[0]-=c->xk[0];
	   d[1]-=c->xk[1];
     d+=2;
    }
}
void rc5_key(rc5 *c,u1 *key,unsigned char keylen)
    {
     u4 *pk,A,B; /* padded key */
     unsigned char xk_len,pk_len,i,num_steps,rc;
     u1 *cp;

     xk_len=c->nr*2+2;
     pk_len=keylen/4;
     if(keylen%4!=0)
     pk_len+=1;
     pk=(u4 *)malloc(pk_len*4);   
/* Initialize pk */
    for(i=0;i<pk_len;i++)
   pk[i]=0;
   cp=(u1 *)pk;
   for(i=1;i<keylen;i++)
   cp[i]=key[i];
/* Initialize xk */
   c->xk[0]=0xb7e15163;/* p32 */
   for(i=1;i<xk_len;i++)
   c->xk[i]=c->xk[i-1]+0x9e3779b9; /* Q32 */
 
  /* Expand key into xk. */
  if(pk_len>xk_len)
    num_steps=3*pk_len;
  else
    num_steps=3*xk_len;

  A=B=0;
  for(i=0;i<num_steps;i++)
  {
     A=c->xk[i%xk_len]=ROTL32(c->xk[i%xk_len]+A+B,3);
     rc=(A+B)&31;
     B=pk[i%pk_len]=ROTL32(pk[i%pk_len]+A+B,rc);
  }
  /* Clobber sensitive data */
  for(i=0;i<pk_len;i++)
  pk[i]=0;
  free(pk);
}
void main()
   {
  
	 unsigned int  n;
	 unsigned char m;
	 unsigned char temp_reg=0;
     rc5 c;
     u1 * dat;
	 u4 *pk;
     unsigned char key[16] ="0nfjbopa2niuerjf";
     unsigned char NRF905_Receive[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    for(n=50000;n>0;n--);
	 LED_905_WORK=0;
	 UART_Init();
	 SPI_Init();
     NRF905_Init();
    while(1)
 {
     NRF905_ReceiveDat();
    CSN=0;
	 SPI_SendByte(R_RX_PAYLOAD);
	 for(m=0;m<8;m++)
     { 
	  SPI_SendByte(0xAA);
	  NRF905_Receive[m]=SPDAT;

   
     }
    CSN=1;
     pk=(u4*)NRF905_Receive;
  
     rc5_init(&c,12);
     rc5_key(&c,key,16);
     rc5_decrypt(&c,pk,1);
    dat=(u1*)pk;


  /*for(m=0;m<8;m++)
	{  SBUF=NRF905_Receive[m];
	  while(!TI);
	   TI=0;
    }*/
  
      
	 LED_905_WORK=!LED_905_WORK;	
 	  for(m=0;m<8;m++)
     {  
      SBUF=dat[m];
	  while(!TI);
	   TI=0;
      }
/*	  if(NRF905_Receive[7]==0x08)
	   {
		NRF905_WritAdd();
		NRF905_LoadDat(0x5A);
        NRF905_SendDat();
	   }*/

   for(n=50000;n>0;n--);
 }
  } 

⌨️ 快捷键说明

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