reader.lst

来自「用C语言开发环境编写的nRF2401无线通信程序」· LST 代码 · 共 477 行 · 第 1/2 页

LST
477 行
字号
 225   1      
 226   1        P4=P4|PWR_UP1;          //先进入空闲模式
 227   1        for(i=0;i<10;i++)
 228   1              Delay100();
 229   1      
 230   1        P4=P4|CS1;           //进入配置模式
 231   1        Delay100();
 232   1        //配置寄存器0字节RXEN 设置为0:发送模式
 233   1          CLK1=0;     
 234   1              DATA =0;
 235   1              Delay();
 236   1      
 237   1              CLK1=1;           // CLK1=1;
 238   1              Delay();
 239   1      
 240   1              CLK1=0;            //P4=P4&0XFE;   //CLK1=0;
 241   1              P4=P4&CS0;         //CS=0;使配置有效 
C51 COMPILER V8.02   READER                                                                08/12/2008 00:06:09 PAGE 5   

 242   1              P4=P4|CE1;         
 243   1              Delay100();
 244   1              Delay100();
 245   1              Delay100();
 246   1      }  
 247          
 248          void SetRxMode(void)
 249          {
 250   1        unsigned int i;
 251   1        P4=P4&CS0;       
 252   1        P4=P4&CE0;       
 253   1        CLK1=0;
 254   1        DATA=0;
 255   1      
 256   1        P4=P4|PWR_UP1;    //进入空闲模式       
 257   1        for(i=0;i<10;i++)
 258   1              Delay100();
 259   1      
 260   1        P4=P4|CS1;        //进入配置模式     
 261   1        Delay100();
 262   1      
 263   1          CLK1=0;     
 264   1              DATA =1;
 265   1              Delay();
 266   1      
 267   1              CLK1=1;           // CLK1=1;
 268   1              Delay();
 269   1      
 270   1              CLK1=0;            //P4=P4&0XFE;   //CLK1=0;
 271   1              P4=P4&CS0;         //CS=0; 4.3 1111 0111; 
 272   1              P4=P4|CE1;         //CE=1; 4.2 0000 0100   ??è?·??í??ê?
 273   1              Delay100();
 274   1              Delay100();
 275   1      
 276   1      }
 277          //进行Manchester编码
 278          void Manchester_fun(unsigned char *TxBuf)
 279          {
 280   1        unsigned char i,k=0;
 281   1        for (i=0;i<8;i++)
 282   1          {
 283   2                 if(TxBuf[i]==1)
 284   2                    {
 285   3                         Manchesterbuf[k]=1;
 286   3                         k++;
 287   3                          Manchesterbuf[k]=0;
 288   3                         k++;
 289   3                        }
 290   2                 else
 291   2                    {
 292   3                         Manchesterbuf[k]=0;
 293   3                         k++;
 294   3                          Manchesterbuf[k]=1;
 295   3                         k++;
 296   3                        }     
 297   2              }
 298   1      }
 299          //接收方通道硬件地址
 300          unsigned char TxAddress[]={0xcc,0xcc,0xcc,0xcc};
 301          //nRF2401数据发送函数
 302          void nRF2401_TxPacket(unsigned char TxBuf[])
 303          {
C51 COMPILER V8.02   READER                                                                08/12/2008 00:06:09 PAGE 6   

 304   1       int i;
 305   1       unsigned char variable2;
 306   1       Manchester_fun(TxBuf);
 307   1       P4=P4|PWR_UP1;  
 308   1       P4=P4&CS0; 
 309   1       P4=P4&CE0;             //进入空闲模式
 310   1       CLK1=0;
 311   1       DATA=0;
 312   1       Delay();
 313   1      
 314   1       P4=P4|CE1;    //进入收发模式
 315   1       Delay100();
 316   1      
 317   1       for(i=0;i< (ADDR_W/8);i++)   //写入接收地址(按字节对齐)
 318   1              {
 319   2                      variable2=TxAddress[i];
 320   2                      ByteWrite(variable2);
 321   2              } 
 322   1       for(i=0;i<(DATA1_W/8);i++)  //写入需要发送的数据(按字节对齐)
 323   1              {
 324   2                      variable2=Manchesterbuf[i];
 325   2                      ByteWrite(variable2);
 326   2              }
 327   1              P4=P4&CE0;        //CE置低使发送有效
 328   1              Delay100();
 329   1              Delay100();
 330   1      
 331   1      }
 332          
 333          unsigned int checkconflict_fun(unsigned char *Rxbuf,unsigned char *Readdatabuf)
 334          {
 335   1        unsigned  int i,k;
 336   1        for(i=0;i<16;i=i+2)
 337   1          {
 338   2                       if((Rxbuf[i]==1)&&(Rxbuf[i+1]==0))
 339   2                          {
 340   3                                *Readdatabuf=1; //收到的数据是下降沿,即为数据1;
 341   3                                 Readdatabuf++;
 342   3                                 k++;   
 343   3                              }
 344   2                       else if((Rxbuf[i]==0)&&(Rxbuf[i+1]==1))
 345   2                          {
 346   3                                *Readdatabuf=0; //收到的数据是上降沿,即为数据0;
 347   3                                 Readdatabuf++;
 348   3                                 k++;
 349   3                              }
 350   2                       else
 351   2                          break;
 352   2              } 
 353   1         return  k;   //返回碰撞位
 354   1      }
 355          
 356          
 357          
 358          void main(void)
 359          {
 360   1               unsigned char Txbuf1[8]={1,1,1,1,1,1,1,1,},Rxbuf[16],Readdatabuf[8];
 361   1               unsigned char Txbuf2[8]={0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};
 362   1               unsigned char Txbuf3[8]={0X0A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,};
 363   1               unsigned char Txbuf4[8]={0,1,2,3,4,5,6,7,};
 364   1               unsigned char Txbuf5[8]={11,20,30,50,10,41,98,75,};
 365   1               unsigned char send_flag=1,recive_flag=0,LED=0X1C;
C51 COMPILER V8.02   READER                                                                08/12/2008 00:06:09 PAGE 7   

 366   1               unsigned int  countbit,k=0,m,n,l; 
 367   1               unsigned int *p=&countbit;
 368   1               unsigned int over_flag=1,conflict_bit; 
 369   1               unsigned long int  i=0;                
 370   1                                                 
 371   1               WDTCN=0xde;          // 禁止看门狗定时器
 372   1               WDTCN=0xad;              
 373   1               SYSCLK_Init();          //初始化CPU;
 374   1               UART0_Init();            //配置串口
 375   1               Config2401();            //配置nRF2401;               
 376   1               while(1)
 377   1                 {             
 378   2                               i=0;            
 379   2                              while(i<100)       //发送阶段
 380   2                                       { SetTxMode( );
 381   3                                         i++;
 382   3                                          P4=P4|CE1;
 383   3                                         nRF2401_TxPacket(Txbuf1); 
 384   3                                         P6=P6&LED_ON;   //LED灯亮                      
 385   3                                       } 
 386   2                                             
 387   2                                 SetRxMode();      //设置为接收模式
 388   2                                 P4=P4|CE1;
 389   2                                 P6=P6|LED_OFF;
 390   2                               for(i=0;i<600;i++)
 391   2                                      { 
 392   3                                         for(k=0;k<6000;k++)
 393   3                                         {        
 394   4                                                       if((P4&DR1)!=0)                 //检查是否接收到数据
 395   4                                                        {
 396   5                                                                      P6=P6|LED_ON;  
 397   5                                                                      nrf2401_Rxpack(Rxbuf,p);    //接收到数据,读出来 
 398   5                                                                  conflict_bit=checkconflict_fun( Rxbuf,Readdatabuf);   //检查是否有碰撞,并返回碰撞位
 399   5                                                                      if(conflict_bit<8)              //碰撞位小于8
 400   5                                                                           {
 401   6                                                                                       Txbuf1[conflict_bit]=0;   //把碰撞位置为0
 402   6                                                                               }
 403   5                                                                      else                        //没有碰撞
 404   5                                                                              {
 405   6                                                                                      m=0;                      
 406   6                                                                                      while(m<600)
 407   6                                                                                               { P6=P6|LED_OFF;       
 408   7                                                                                                 SetTxMode( );   //设置为发送模式
 409   7                                                                                                 m++;
 410   7                                                                                                 P4=P4|CE1;
 411   7                                                                                                 nRF2401_TxPacket(Readdatabuf);   //发送接收到的标签号作为确认信息
 412   7                                                                                                 P6=P6&LED_ON; 
 413   7                                                                                                 for(l=0;l<5;l++)
 414   7                                                                                                       {
 415   8                                                                                                          Delay100();
 416   8                                                                                                       }
 417   7                                                                                               }
 418   6                                                                                   for(l=0;l<8;l++)    //向串口写读出的标签号
 419   6                                                                                     {
 420   7                                                                                          SBUF0=Readdatabuf[l];
 421   7                                                                                              while(TI0==0);
 422   7                                                                                          TI0=0;
 423   7                                                                                     }
 424   6                                                                                  for(n=0;n<8;n++)   //确认了一个标签号后,进行下一次搜索,把发送的数据改为1111 1111
 425   6                                                                                               {
 426   7                                                                                                      Txbuf1[n]=1;
 427   7                                                                                                }
C51 COMPILER V8.02   READER                                                                08/12/2008 00:06:09 PAGE 8   

 428   6                                                                               } 
 429   5                                                         recive_flag=1;
 430   5                                                         break;     //接收到了数据就跳出接收数据循环     
 431   5                                                    }
 432   4                                      }                                               
 433   3                                       if(recive_flag==1)
 434   3                                          break;       //接收到了数据就跳出接收数据循环
 435   3                                      }
 436   2                      recive_flag=0;                 
 437   2              }                                         
 438   1      }
 439          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1212    ----
   CONSTANT SIZE    =     58    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     21     103
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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