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

📄 nrf905_receive.lst

📁 用单片机实现传感器网络的程序
💻 LST
字号:
C51 COMPILER V7.08   NRF905_RECEIVE                                                        07/04/2007 07:33:34 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE NRF905_RECEIVE
OBJECT MODULE PLACED IN NRF905_RECEIVE.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE NRF905_RECEIVE.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include <stdio.h>
   3          #include <stdlib.h>
   4          #include <intrins.h>
   5          
   6          /*SPI特殊功能寄存器声明*/
   7          sfr SPCTL=0x85;
   8          sfr SPSTAT=0x84;
   9          sfr SPDAT=0x86;
  10          
  11          /*SPI通信数据线*/
  12          sbit SPCLK=P1^7;
  13          sbit MISO=P1^6;
  14          sbit MOSI=P1^5;
  15          sbit CSN=P1^4;
  16          
  17          /*905控制引脚*/
  18          sbit TRX_CE=P1^3;
  19          sbit TX_EN=P1^2;
  20          sbit PWR_UP=P1^1;
  21          sbit DR=P1^0;
  22          
  23          /*905命令名称*/
  24          unsigned char W_CONFIG=0x00;         //写配置寄存器命令 
  25          unsigned char R_CONFIG=0x10;         //读配置寄存器命令
  26          unsigned char W_TX_PAYLOAD=0x20;     //写TX有效数据命令
  27          unsigned char R_TX_PAYLOAD=0x21;     //读TX有效数据命令
  28          unsigned char W_TX_ADDRESS=0x22;     //写TX地址命令
  29          unsigned char R_TX_ADDDRESS=0x23;    //读TX地址命令
  30          unsigned char R_RX_PAYLOAD=0x24;     //读RX有效数据命令
  31          
  32          unsigned char temp;         //存放905收到的数据
  33          
  34          sbit LED_905_WORK=P3^4;
  35          
  36          /*905配置寄存器初始化*/
  37          unsigned char NRF905_Config[10]=
  38                                       {
  39                                                                    0x7B, //配置905工作频率为434.7
  40                                                                    0x0C, //输出功率配置为+10dbm
  41                                                                    0x44, //发射和接受地址宽度均为4字节
  42                                                                    0x08, //接收数据为5字节
  43                                                                    0x01, //发射数据个数为1字节
  44                                                                    0xE7, //接收地址
  45                                        0xE7,
  46                                                                    0xE7,
  47                                                                    0xE8,
  48                                        0xDB      //晶振频率为16MHZ,禁止外部时钟                                           
  49                                                                   };
  50          /*接收方地址*/
  51          unsigned char NRF905_SendAdd[4]={0xE7,0xE7,0xE7,0xE7};
  52          
  53          /*SPI初始化*/
  54          void SPI_Init()
  55               {
C51 COMPILER V7.08   NRF905_RECEIVE                                                        07/04/2007 07:33:34 PAGE 2   

  56   1                SPCTL=0xD0;                   //SSIG=1,SPEN=1,DORD=0,MSTR=1,CP0L=0,CPHA=0,SPR1=0,SPR0=0.
  57   1                SPSTAT=0xC0;                  //SPIF=1(清零),WCOL=1(清零)
  58   1               }            
  59          void UART_Init()
  60               {
  61   1                TMOD=0x20;
  62   1                SCON=0x50;
  63   1            PCON=0x00;
  64   1                TH1=0xFD;
  65   1                TL1=0xFD;
  66   1                TR1=1;
  67   1               }
  68          void SPI_SendByte(unsigned char dat)
  69               {
  70   1                SPDAT=dat;
  71   1                while(!(SPSTAT&0x80));
  72   1                SPSTAT=0xC0;
  73   1               }
  74          void NRF905_Init()
  75               {
  76   1                unsigned char i;
  77   1            PWR_UP=1;
  78   1                TRX_CE=0;
  79   1               CSN=0;
  80   1                SPI_SendByte(W_CONFIG);
  81   1                for(i=0;i<10;i++)
  82   1                   {
  83   2                SPI_SendByte(NRF905_Config[i]);                  
  84   2                       }
  85   1           CSN=1;
  86   1               }
  87          
  88          /*void NRF905_WritAdd()
  89              {
  90               unsigned char i;
  91                PWR_UP=1;
  92                TX_EN=1;
  93                    TRX_CE=0;
  94              CSN=0;
  95               SPI_SendByte(W_TX_ADDRESS);
  96               for(i=0;i<4;i++)
  97               {
  98                SPI_SendByte(NRF905_SendAdd[i]);
  99               }
 100              CSN=1;
 101              }*/
 102          
 103          /*void NRF905_ReadConfig()
 104              {
 105               unsigned char i;
 106               unsigned char config_dat[10];
 107                    PWR_UP=1;
 108                    TRX_CE=0;
 109              CSN=0;
 110               SPI_SendByte(R_CONFIG);
 111               for(i=0;i<10;i++)
 112                {
 113                 SPI_SendByte(0x55);
 114                 config_dat[i]=SPDAT;
 115                }
 116              CSN=1;
 117              for(i=0;i<10;i++)
C51 COMPILER V7.08   NRF905_RECEIVE                                                        07/04/2007 07:33:34 PAGE 3   

 118               {
 119                SBUF=config_dat[i];
 120                while(!TI);
 121                TI=0;
 122               }
 123              }
 124          */
 125          /*void NRF905_LoadDat(unsigned char dat)
 126               {
 127                    PWR_UP=1;
 128                TX_EN=1;
 129                    TRX_CE=0;
 130                   CSN=0;
 131                    SPI_SendByte(W_TX_PAYLOAD);
 132                    SPI_SendByte(dat);
 133               CSN=1;
 134                   }*/
 135          
 136          /*void NRF905_SendDat()
 137               {
 138                    PWR_UP=1;
 139                    TX_EN=1;
 140                    TRX_CE=1;
 141                    while(DR==0);
 142                    TRX_CE=0;
 143                    TX_EN=0;
 144                   }*/
 145          
 146          void  NRF905_ReceiveDat()
 147              {
 148   1           unsigned int count;
 149   1               unsigned char flag=1;
 150   1               PWR_UP=1;
 151   1               TX_EN=0;
 152   1               TRX_CE=1;
 153   1               do{
 154   2                 count++;
 155   2                 if(count>50000)
 156   2                  {
 157   3                       count=0;
 158   3                       flag=0;
 159   3                       break;
 160   3                      }
 161   2                 }
 162   1                 while(DR==0);
 163   1              if(flag==1) 
 164   1              {
 165   2           TRX_CE=0;
 166   2               TX_EN=0;
 167   2      /*      CSN=0;
 168   2               SPI_SendByte(R_RX_PAYLOAD);
 169   2               SPI_SendByte(0xAA);
 170   2               temp=SPDAT;
 171   2              CSN=1;
 172   2      */
 173   2      
 174   2              }
 175   1      //      return(temp);
 176   1      }
 177          
 178          typedef unsigned long int u4;
 179          typedef unsigned char u1;
C51 COMPILER V7.08   NRF905_RECEIVE                                                        07/04/2007 07:33:34 PAGE 4   

 180          #define ROTL32(x,c) (((x)<<(c))|((x)>>(32-c)));
 181          #define ROTR32(x,c) (((x)>>(c))|((x)<<(32-c)));
 182          /* rounds and subkeys */
 183          typedef struct{
 184                          u4 *xk;
 185                          unsigned char nr;
 186                        } rc5;
 187          void rc5_init(rc5 *,unsigned char);
 188          void rc5_key(rc5 *,u1 *,unsigned char);
 189          void rc5_decrypt(rc5 *,u4 *,unsigned char);
 190          void rc5_init(rc5 *c,unsigned char rounds)
 191           {
 192   1        c->nr=rounds;
 193   1         init_mempool (c->xk, 0x1000);
 194   1         c->xk=(u4 *) malloc(4*(rounds*2+2));
 195   1       }
 196           void rc5_decrypt(rc5 *c, u4 *dt,unsigned char blocks)
 197          {
 198   1       u4 *d,*sk;
 199   1      unsigned char h1,rc;
 200   1      int i;
 201   1        d=dt;
 202   1       sk=(c->xk)+2;
 203   1       for(h1=0;h1<blocks;h1++)
 204   1          {
 205   2           for(i=c->nr*2-2;i>=0;i-=2)
 206   2              {
 207   3                 d[1]-=sk[i+1];
 208   3                 rc=d[0]&31;
 209   3                 d[1]=ROTR32(d[1],rc);
 210   3                 d[1]^=d[0];
 211   3      
 212   3                 d[0]-=sk[i];
 213   3                 rc=d[1]&31;
 214   3                 d[0]=ROTR32(d[0],rc);
 215   3                 d[0]^=d[1];
 216   3               }
 217   2                 d[0]-=c->xk[0];
 218   2                 d[1]-=c->xk[1];
 219   2           d+=2;
 220   2          }
 221   1      }
 222          void rc5_key(rc5 *c,u1 *key,unsigned char keylen)
 223              {
 224   1           u4 *pk,A,B; /* padded key */
 225   1           unsigned char xk_len,pk_len,i,num_steps,rc;
 226   1           u1 *cp;
 227   1      
 228   1           xk_len=c->nr*2+2;
 229   1           pk_len=keylen/4;
 230   1           if(keylen%4!=0)
 231   1           pk_len+=1;
 232   1           pk=(u4 *)malloc(pk_len*4);   
 233   1      /* Initialize pk */
 234   1          for(i=0;i<pk_len;i++)
 235   1         pk[i]=0;
 236   1         cp=(u1 *)pk;
 237   1         for(i=1;i<keylen;i++)
 238   1         cp[i]=key[i];
 239   1      /* Initialize xk */
 240   1         c->xk[0]=0xb7e15163;/* p32 */
 241   1         for(i=1;i<xk_len;i++)
C51 COMPILER V7.08   NRF905_RECEIVE                                                        07/04/2007 07:33:34 PAGE 5   

 242   1         c->xk[i]=c->xk[i-1]+0x9e3779b9; /* Q32 */
 243   1       
 244   1        /* Expand key into xk. */
 245   1        if(pk_len>xk_len)
 246   1          num_steps=3*pk_len;
 247   1        else
 248   1          num_steps=3*xk_len;
 249   1      
 250   1        A=B=0;
 251   1        for(i=0;i<num_steps;i++)
 252   1        {
 253   2           A=c->xk[i%xk_len]=ROTL32(c->xk[i%xk_len]+A+B,3);
 254   2           rc=(A+B)&31;
 255   2           B=pk[i%pk_len]=ROTL32(pk[i%pk_len]+A+B,rc);
 256   2        }
 257   1        /* Clobber sensitive data */
 258   1        for(i=0;i<pk_len;i++)
 259   1        pk[i]=0;
 260   1        free(pk);
 261   1      }
 262          void main()
 263             {
 264   1        
 265   1               unsigned int  n;
 266   1               unsigned char m;
 267   1               unsigned char temp_reg=0;
 268   1           rc5 c;
 269   1           u1 * dat;
 270   1               u4 *pk;
 271   1           unsigned char key[16] ="0nfjbopa2niuerjf";
 272   1           unsigned char NRF905_Receive[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 273   1          for(n=50000;n>0;n--);
 274   1               LED_905_WORK=0;
 275   1               UART_Init();
 276   1               SPI_Init();
 277   1           NRF905_Init();
 278   1          while(1)
 279   1       {
 280   2           NRF905_ReceiveDat();
 281   2          CSN=0;
 282   2               SPI_SendByte(R_RX_PAYLOAD);
 283   2               for(m=0;m<8;m++)
 284   2           { 
 285   3                SPI_SendByte(0xAA);
 286   3                NRF905_Receive[m]=SPDAT;
 287   3      
 288   3         
 289   3           }
 290   2          CSN=1;
 291   2           pk=(u4*)NRF905_Receive;
 292   2        
 293   2           rc5_init(&c,12);
 294   2           rc5_key(&c,key,16);
 295   2           rc5_decrypt(&c,pk,1);
 296   2          dat=(u1*)pk;
 297   2      
 298   2      
 299   2        /*for(m=0;m<8;m++)
 300   2              {  SBUF=NRF905_Receive[m];
 301   2                while(!TI);
 302   2                 TI=0;
 303   2          }*/
C51 COMPILER V7.08   NRF905_RECEIVE                                                        07/04/2007 07:33:34 PAGE 6   

 304   2        
 305   2            
 306   2               LED_905_WORK=!LED_905_WORK;    
 307   2                for(m=0;m<8;m++)
 308   2           {  
 309   3            SBUF=dat[m];
 310   3                while(!TI);
 311   3                 TI=0;
 312   3            }
 313   2      /*        if(NRF905_Receive[7]==0x08)
 314   2                 {
 315   2                      NRF905_WritAdd();
 316   2                      NRF905_LoadDat(0x5A);
 317   2              NRF905_SendDat();
 318   2                 }*/
 319   2      
 320   2         for(n=50000;n>0;n--);
 321   2       }
 322   1        } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1854    ----
   CONSTANT SIZE    =     24    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     22      87
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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