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

📄 nrf905_send.lst

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


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

line level    source

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

  56                         }rc5;
  57          #define ROTL32(x,c) (((x)<<(c))|((x)>>(32-c)));
  58          /*Function prototypes */
  59          //u4 ROTL32(u4,int);
  60          void rc5_init(rc5 *,unsigned char);
  61          void rc5_key(rc5 *,unsigned char *,unsigned char);
  62          void rc5_encrypt(rc5 *,u4 *,unsigned char);
  63          /*SPI初始化*/
  64          void SPI_Init()
  65               {
  66   1                SPCTL=0xD0;                   //SSIG=1,SPEN=1,DORD=0,MSTR=1,CP0L=0,CPHA=0,SPR1=0,SPR0=0.
  67   1                SPSTAT=0xC0;                  //SPIF=1(清零),WCOL=1(清零)
  68   1               }            
  69          void UART_Init()
  70               {
  71   1                TMOD=0x20;
  72   1                SCON=0x50;
  73   1                TH1=0xFD;
  74   1                TL1=0xFD;
  75   1                TR1=1;
  76   1               }
  77          void SPI_SendByte(unsigned char dat)
  78               {
  79   1                SPDAT=dat;
  80   1                while(!(SPSTAT&0x80));
  81   1        //    temp=SPDAT;
  82   1                SPSTAT=0xC0;
  83   1               }
  84          
  85          void NRF905_Init()
  86               {
  87   1               unsigned char i;
  88   1            PWR_UP=1;
  89   1                 TX_EN=1;
  90   1                 TRX_CE=0;
  91   1               CSN=0;
  92   1                SPI_SendByte(W_CONFIG);
  93   1                for(i=0;i<10;i++)
  94   1                   {
  95   2                SPI_SendByte(NRF905_Config[i]);                  
  96   2                       }
  97   1           CSN=1;
  98   1               }
  99          /*void NRF905_ReadConfig()
 100              {
 101               unsigned char i;
 102               unsigned char config_dat[10];
 103             CSN=0;
 104                SPI_SendByte(R_CONFIG);
 105                for(i=0;i<10;i++)
 106                 {
 107                  SPI_SendByte(0x55);
 108                  config_dat[i]=SPDAT;       
 109                 }
 110             CSN=1;
 111              for(i=0;i<10;i++)
 112                {
 113                 SBUF=config_dat[i];
 114                 while(!TI);
 115                 TI=0;
 116                }
 117              }*/
C51 COMPILER V7.08   NRF905_SEND                                                           07/04/2007 22:15:39 PAGE 3   

 118          void NRF905_WritAdd()
 119              {
 120   1                unsigned char i;
 121   1            PWR_UP=1;
 122   1                 TX_EN=1;
 123   1                 TRX_CE=0;
 124   1        CSN=0;
 125   1           SPI_SendByte(W_TX_ADDRESS);
 126   1           for(i=0;i<4;i++)
 127   1           {
 128   2            SPI_SendByte(NRF905_SendAdd[i]);
 129   2           }
 130   1        CSN=1;
 131   1          }
 132          void NRF905_LoadDat(unsigned char *dat)
 133               { 
 134   1                 unsigned char i;
 135   1                 PWR_UP=1;
 136   1                 TX_EN=1;
 137   1                 TRX_CE=0;
 138   1                 for(i=0;i<8;i++)
 139   1                SPI_SendByte(dat[i]);    
 140   1               }
 141          void NRF905_SendDat()
 142               {
 143   1                PWR_UP=1;
 144   1                TX_EN=1;
 145   1                TRX_CE=1;
 146   1                while(DR==0);
 147   1                TRX_CE=0;
 148   1                TX_EN=0;
 149   1               }
 150          
 151          
 152          void rc5_init(rc5 *c,unsigned char rounds)
 153           {
 154   1        c->nr=rounds;
 155   1        init_mempool (c->xk, 0x0100);
 156   1        c->xk=(u4 *) malloc(4*(rounds*2+2));
 157   1       }
 158          void rc5_key(rc5 *c,unsigned char *key,unsigned char keylen)
 159              {
 160   1           u4 *pk,A,B; /* padded key */
 161   1           unsigned char xk_len,pk_len,i,num_steps,rc;
 162   1           unsigned char *cp;
 163   1      
 164   1           xk_len=c->nr*2+2;
 165   1           pk_len=keylen/4;
 166   1           if(keylen%4!=0)
 167   1           pk_len+=1;
 168   1           pk=(u4 *)malloc(pk_len*4);   
 169   1      /* Initialize pk */
 170   1          for(i=0;i<pk_len;i++)
 171   1         pk[i]=0;
 172   1         cp=(unsigned char*)pk;
 173   1         for(i=0;i<keylen;i++)
 174   1         cp[i]=key[i];
 175   1      /* Initialize xk */
 176   1         c->xk[0]=0xb7e15163;/* p32 */
 177   1         for(i=1;i<xk_len;i++)
 178   1         c->xk[i]=c->xk[i-1]+0x9e3779b9; /* Q32 */
 179   1       
C51 COMPILER V7.08   NRF905_SEND                                                           07/04/2007 22:15:39 PAGE 4   

 180   1        /* Expand key into xk. */
 181   1        if(pk_len>xk_len)
 182   1          num_steps=3*pk_len;
 183   1        else
 184   1          num_steps=3*xk_len;
 185   1      
 186   1        A=B=0;
 187   1        for(i=0;i<num_steps;i++)
 188   1        {
 189   2           A=c->xk[i%xk_len]=ROTL32(c->xk[i%xk_len]+A+B,3);
 190   2           rc=(A+B)&31;
 191   2           B=pk[i%pk_len]=ROTL32(pk[i%pk_len]+A+B,rc);
 192   2        }
 193   1        /* Clobber sensitive data */
 194   1        for(i=0;i<pk_len;i++)
 195   1        pk[i]=0;
 196   1        free(pk);
 197   1      }
 198           void rc5_encrypt(rc5 *c,u4 *dt,unsigned char blocks)
 199          {
 200   1        u4 *d,*sk;
 201   1         unsigned char h,i,rc;
 202   1        d=dt;
 203   1        sk=(c->xk)+2;
 204   1        for(h=0;h<blocks;h++)
 205   1        {  d[0]+=c->xk[0];
 206   2           d[1]+=c->xk[1];
 207   2           for(i=0;i<c->nr*2;i+=2)
 208   2              {
 209   3              d[0]^=d[1];
 210   3              rc=d[1]&31;
 211   3              d[0]=ROTL32(d[0],rc);
 212   3              d[0]+=sk[i];
 213   3              d[1]^=d[0];
 214   3              rc=d[0]&31;
 215   3              d[1]=ROTL32(d[1],rc);
 216   3              d[1]+=sk[i+1];
 217   3              }
 218   2           d+=2;
 219   2        }
 220   1      }
 221          void main()
 222             {
 223   1         
 224   1           unsigned int  n;
 225   1           unsigned char m;
 226   1               unsigned char dat[8]={0};
 227   1           unsigned char key[16] ="0nfjbopa2niuerjf";
 228   1           rc5 c;
 229   1               unsigned char *pk;
 230   1               u4 dt[2]={0x03040506,0x0708090A};
 231   1           for(n=50000;n>0;n--);
 232   1           LED_905_WORK=0;
 233   1               UART_Init();
 234   1               SPI_Init();
 235   1           NRF905_Init();
 236   1           NRF905_WritAdd();
 237   1            
 238   1                rc5_init(&c,12); 
 239   1            rc5_key(&c,key,16);
 240   1            rc5_encrypt(&c,dt,1);
 241   1                pk=(unsigned char*)dt;
C51 COMPILER V7.08   NRF905_SEND                                                           07/04/2007 22:15:39 PAGE 5   

 242   1      
 243   1                while(1)
 244   1           {
 245   2       for(n=50000;n>0;n--);    
 246   2         CSN=0;
 247   2             SPI_SendByte(0x20);        
 248   2             NRF905_LoadDat(pk);
 249   2         CSN=1;
 250   2              
 251   2         NRF905_SendDat();
 252   2        
 253   2          CSN=0;
 254   2                SPI_SendByte(0x21);
 255   2                   
 256   2                for(m=0;m<8;m++)
 257   2            {
 258   3                SPI_SendByte(0x55);
 259   3            SBUF=SPDAT;
 260   3               while(!TI);
 261   3                TI=0;
 262   3                }
 263   2          CSN=1;
 264   2      
 265   2       LED_905_WORK=!LED_905_WORK;
 266   2      /*  temp_reg=NRF905_ReceiveDat();
 267   2          SBUF=temp_reg;
 268   2              while(!TI);
 269   2              TI=0;
 270   2      */
 271   2          for(n=50000;n>0;n--);
 272   2      
 273   2        }
 274   1        }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1861    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     21      90
   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 + -