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

📄 nrf905_send.c

📁 用单片机实现传感器网络的程序
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#include<stdlib.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有效数据命令


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

typedef unsigned long int u4;

/* rounds and subkeys */
typedef struct{
		 u4 *xk;
		 unsigned char nr;
	       }rc5;
#define ROTL32(x,c) (((x)<<(c))|((x)>>(32-c)));
/*Function prototypes */
//u4 ROTL32(u4,int);
void rc5_init(rc5 *,unsigned char);
void rc5_key(rc5 *,unsigned char *,unsigned char);
void rc5_encrypt(rc5 *,u4 *,unsigned char);
/*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;
	  TH1=0xFD;
	  TL1=0xFD;
	  TR1=1;
	 }
void SPI_SendByte(unsigned char dat)
     {
	  SPDAT=dat;
	  while(!(SPSTAT&0x80));
  //    temp=SPDAT;
	  SPSTAT=0xC0;
	 }

void NRF905_Init()
     {
	 unsigned char i;
      PWR_UP=1;
	   TX_EN=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_ReadConfig()
    {
     unsigned char i;
     unsigned char config_dat[10];
   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_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_LoadDat(unsigned char *dat)
     { 
	   unsigned char i;
	   PWR_UP=1;
	   TX_EN=1;
	   TRX_CE=0;
	   for(i=0;i<8;i++)
	  SPI_SendByte(dat[i]);    
	 }
void NRF905_SendDat()
     {
	  PWR_UP=1;
	  TX_EN=1;
	  TRX_CE=1;
	  while(DR==0);
	  TRX_CE=0;
	  TX_EN=0;
	 }


void rc5_init(rc5 *c,unsigned char rounds)
 {
  c->nr=rounds;
  init_mempool (c->xk, 0x0100);
  c->xk=(u4 *) malloc(4*(rounds*2+2));
 }
void rc5_key(rc5 *c,unsigned char *key,unsigned char keylen)
    {
     u4 *pk,A,B; /* padded key */
     unsigned char xk_len,pk_len,i,num_steps,rc;
     unsigned char *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=(unsigned char*)pk;
   for(i=0;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 rc5_encrypt(rc5 *c,u4 *dt,unsigned char blocks)
{
  u4 *d,*sk;
   unsigned char h,i,rc;
  d=dt;
  sk=(c->xk)+2;
  for(h=0;h<blocks;h++)
  {  d[0]+=c->xk[0];
     d[1]+=c->xk[1];
     for(i=0;i<c->nr*2;i+=2)
	{
	d[0]^=d[1];
	rc=d[1]&31;
	d[0]=ROTL32(d[0],rc);
	d[0]+=sk[i];
	d[1]^=d[0];
	rc=d[0]&31;
	d[1]=ROTL32(d[1],rc);
	d[1]+=sk[i+1];
	}
     d+=2;
  }
}
void main()
   {
   
     unsigned int  n;
     unsigned char m;
	 unsigned char dat[8]={0};
     unsigned char key[16] ="0nfjbopa2niuerjf";
     rc5 c;
	 unsigned char *pk;
	 u4 dt[2]={0x03040506,0x0708090A};
     for(n=50000;n>0;n--);
     LED_905_WORK=0;
	 UART_Init();
	 SPI_Init();
     NRF905_Init();
     NRF905_WritAdd();
      
	  rc5_init(&c,12); 
      rc5_key(&c,key,16);
      rc5_encrypt(&c,dt,1);
	  pk=(unsigned char*)dt;

	  while(1)
     {
 for(n=50000;n>0;n--);	  
   CSN=0;
       SPI_SendByte(0x20);	  
       NRF905_LoadDat(pk);
   CSN=1;
   	
   NRF905_SendDat();
  
    CSN=0;
	  SPI_SendByte(0x21);
	     
	  for(m=0;m<8;m++)
      {
	  SPI_SendByte(0x55);
      SBUF=SPDAT;
	 while(!TI);
	  TI=0;
	  }
    CSN=1;

 LED_905_WORK=!LED_905_WORK;
/*  temp_reg=NRF905_ReceiveDat();
    SBUF=temp_reg;
	while(!TI);
	TI=0;
*/
    for(n=50000;n>0;n--);

  }
  }

⌨️ 快捷键说明

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