nrf24l01无线温度收发程序,系统控制芯片是msp430f149,求完整代码,本人新手在这里先谢谢了!

2024-12-17 05:14:36
推荐回答(1个)
回答1:

MSP430 code for nRF2401 
********************************************************************* 
//你可以参考一下!
CPU=MSP430F149 
//搜索:智凡单片机。mcuc.com.cn
********************************************************************* 
TX code: 
#include  
#define uchar unsigned char 
#define uint    unsigned int 
 
uchar InitData[18]; 
uchar TXData[14]; 
uchar RXData[2]; 
uchar temp; 
uchar ByteCnt; 
uchar ByteCnt1; 
uchar BitCnt; 
uchar BitCnt1; 
uchar Data1=0xff; 
uchar tempi; 
 
#define PWR   BIT0 //P4.0 
#define DR1   BIT3 //P4.3 
#define CLK1  BIT4 //P4.4 
#define DATA  BIT5//P4.5 
 
#define CE    BIT1 //P4.1 
#define CS    BIT2 //P4.2 
 
 
 
 
void  init_io(); 
void  nRF2401_ON(); 
void  BuildInitWord(); 
void  InitnRF2401(); 
void  DoSPIClock(); 
void  CE_High(); 
void  RXEN_HIGH(); 
void  TXEN_LOW(); 
void  Delay500ns(); 
void  Delay5us(); 
void Delay202us(); 
void  Delay3ms(); 
void  BuildShockWord(); 
 
void  ShockBurst(); 
void  ReceiveShock(); 
void  time_set(); 
 
void main (void) 
{  uint i; 
  WDTCTL = WDTPW + WDTHOLD; 
  BCSCTL1&=~XT2OFF;                  
  BCSCTL2=0x88;                   //10001000; XT2 as MCLK, 6M  
   
  do 
  { 
     IFG1&=~OFIFG;                  //clear OSCFault flag_breathe 
     for(i=0xFF;i>0;i--);               //delay wait 
  } while((IFG1&OFIFG)!=0);   
   
  init_io(); 
  nRF2401_ON(); 
  BuildInitWord(); 
  InitnRF2401(); 
  BuildShockWord(); 
  ShockBurst(); 

   
  void init_io(void) 
  {P4DIR|=CS+DATA+PWR;//P1.0+P1.3+P1.4 
   P4DIR&=~DR1;//P1.1 
   P4DIR|=CLK1;//P5.6 
   P4DIR|=CE; //P6.6 
   P4OUT&=~DATA; 
   P4OUT&=~PWR; 
   P4OUT&=~CS; 
   P4OUT&=~CLK1; 
   P4OUT&=~CE; 
   } 
    void nRF2401_ON(void) 
     {P4OUT|=PWR; 
     } 
 
   void BuildInitWord(void) 
   {InitData[0]=0x8E;// 
    InitData[1]=0x08;// 
    InitData[2]=0x1C;// 
 
    InitData[3]=0x10;// 频道 2 数据长度 
    InitData[4]=0x10;// 频道 1 数据长度,16bit,2byte. 
     
    InitData[5]=0x00;// 频道 2 地址 
    InitData[6]=0x1c;// 频道 2 地址 
    InitData[7]=0xcc;// 频道 2 地址 
    InitData[8]=0xcc;// 频道 2 地址 
    InitData[9]=0xcc;// 频道 2 地址 
 
    InitData[10]=0x00;//频道 1 地址 
    InitData[11]=0xcc;//频道 1 地址 
    InitData[12]=0xcc;//频道 1 地址 
    InitData[13]=0xcc;//频道 1 地址 
    InitData[14]=0xcc;//频道 1 地址 
 
    InitData[15]=0x83;//4byte 地址,16CRC,CRC 允许 
    InitData[16]=0x4f;//一个频道接收,shock 模式,250K,16MCRY ,0DBm 
    InitData[17]=0x04;//tx 
    } 
     
    void InitnRF2401(void) 
    { 
     P4OUT|=CS; 
     Delay5us();// 
     for(ByteCnt=0;ByteCnt<18;ByteCnt++) 
      {tempi=InitData[ByteCnt]; 
       for(BitCnt=0;BitCnt<8;BitCnt++) 
        { P4OUT&=~CLK1;  
        if(tempi&0x80) 
         P4OUT|=DATA; 
        else 
          P4OUT&=~DATA; 
        Delay500ns(); 
        P4OUT|=CLK1; 
        Delay500ns(); 
        P4OUT&=~CLK1;  
        tempi=tempi<<1; 
         
         } 
        } 
        P4OUT&=~CS;  
        P4OUT&=~DATA; 
      } 
       
       
    
    
         
       void Delay500ns(void) 
        { 
          _NOP(); 
        }  
         
        void Delay5us(void) 
        {uchar x;  
         uchar y; 
         for(y=0;y<5;y++) 
          for(x=0;x<2;x++); 
        }  
         
         
         void  Delay202us(void) 
        {uchar n;  
         uchar m; 
         for(m=0;m<200;m++) 
          for(n=0;n<3;n++); 
        }   
         
        void Delay3ms(void) 
        {  
         int i; 
         unsigned long j; 
         for(i = 3;i > 0;i--) 
         { 
        for(j = 2000;j > 0;j--); 
         } 
        } 
 
        void BuildShockWord(void) 
       {TXData[0]=0xcc; 
        TXData[1]=0xcc; 
        TXData[2]=0xcc; 
        TXData[3]=0xcc; 
         
        TXData[4]=0x01; 
        TXData[5]=0x01; 
        
      } 
        void ShockBurst(void) 
        { 
         P4OUT|=CE; 
         Delay5us();// 
 
         for(ByteCnt1=0;ByteCnt1<6;ByteCnt1++) 
          {tempi=TXData[ByteCnt1]; 
           for(BitCnt1=0;BitCnt1<8;BitCnt1++) 
            {P4OUT&=~CLK1;  
             if(tempi&0x80) 
              P4OUT|=DATA; 
             else 
              P4OUT&=~DATA; 
             Delay500ns(); 
             P4OUT|=CLK1; 
             Delay500ns(); 
             P4OUT&=~CLK1;  
            tempi=tempi<<1; 
            } 
           } 
           
           P4OUT&=~CE; 
           P4OUT&=~DATA; 
           Delay202us(); 
        } 
*******************************************************************************         
RX code: 
#include  
#define uchar unsigned char 
#define uint    unsigned int 
 
uchar InitData[18]; 
uchar TXData[14]; 
uchar RXData[2]; 
uchar temp; 
uchar ByteCnt; 
uchar ByteCnt1; 
uchar BitCnt; 
uchar BitCnt1; 
uchar Data1=0xff; 
uchar tempi; 
 
#define PWR   BIT0 //P4.0 
#define DR1   BIT3 //P4.3 
#define CLK1  BIT4 //P4.4 
#define DATA  BIT5//P4.5 
 
#define CE    BIT1 //P4.1 
#define CS    BIT2 //P4.2 
 
 
 
 
void  init_io(); 
void  nRF2401_ON(); 
void  BuildInitWord(); 
void  InitnRF2401(); 
void  DoSPIClock(); 
void  CE_High(); 
void  RXEN_HIGH(); 
void  TXEN_LOW(); 
void  Delay500ns(); 
void  Delay5us(); 
void Delay202us(); 
void  Delay3ms(); 
void  BuildShockWord(); 
 
void  ShockBurst(); 
void  ReceiveShock(); 
void  time_set(); 
 
void main (void) 
{  uint i; 
   WDTCTL = WDTPW + WDTHOLD; 
 BCSCTL1&=~XT2OFF;                  
  BCSCTL2=0x88;                    //10001000;   XT2 as MCLK, 6M  
  
  do 
  { 
     IFG1&=~OFIFG;                //clear OSCFault flag_breathe 
     for(i=0xFF;i>0;i--);               //delay wait 
  } while((IFG1&OFIFG)!=0);   
   
  init_io(); 
  nRF2401_ON(); 
  Delay3ms(); 
  BuildInitWord(); 
  InitnRF2401();   
  P4OUT|=CE; 
  Delay202us(); 
  while(1) 
   {if(P4IN&DR1) 
    ReceiveShock(); 
   } 
 } 
   
  void init_io(void) 
  {P4DIR|=CS+DATA+PWR;//P1.0+P1.3+P1.4 
   P4DIR&=~DR1; 
   P4DIR|=CLK1; 
   P4DIR|=CE;  
   P4OUT&=~DATA; 
   P4OUT&=~PWR; 
   P4OUT&=~CS; 
   P4OUT&=~CLK1; 
   P4OUT&=~CE; 
   } 
    
    
   void BuildInitWord(void) 
   {InitData[0]=0x8E;// 
    InitData[1]=0x08;// 
    InitData[2]=0x1C;// 
 
    InitData[3]=0x50;// 频道 2 数据长度 
    InitData[4]=0x10;// 频道 1 数据长度,80bit,10byte. 
     
    InitData[5]=0x00;// 频道 2 地址 
    InitData[6]=0x1c;// 频道 2 地址 
    InitData[7]=0xcc;// 频道 2 地址 
    InitData[8]=0xcc;// 频道 2 地址 
    InitData[9]=0xcc;// 频道 2 地址 
 
    InitData[10]=0x00;//频道 1 地址 
    InitData[11]=0xcc;//频道 1 地址 
    InitData[12]=0xcc;//频道 1 地址 
    InitData[13]=0xcc;//频道 1 地址 
    InitData[14]=0xcc;//频道 1 地址 
 
    InitData[15]=0x83;//4byte 地址,16CRC,CRC 允许 
    InitData[16]=0x4f;//一个频道接收,shock 模式,250K,16MCRY ,0DBm 
    InitData[17]=0x05;//receive 
 
    } 
    
    void InitnRF2401(void) 
    { 
     P4OUT|=CS; 
     Delay5us(); 
 
     for(ByteCnt=0;ByteCnt<18;ByteCnt++) 
      {tempi=InitData[ByteCnt]; 
       for(BitCnt=0;BitCnt<8;BitCnt++) 
        { P4OUT&=~CLK1;  
        if(tempi&0x80) 
         P4OUT|=DATA; 
        else 
         P4OUT&=~DATA; 
       Delay500ns(); 
       P4OUT|=CLK1; 
       Delay500ns(); 
       P4OUT&=~CLK1;  
       tempi=tempi<<1; 
        } 
      } 
       P4OUT&=~CS;  
       P4OUT&=~DATA; 
    } 
       
        
       void nRF2401_ON(void) 
       {P4OUT|=PWR; 
       } 
        
     
         
      void Delay500ns(void) 
        { 
          _NOP(); 
        }  
         
         void Delay5us(void) 
        {uchar x;  
         uchar y; 
         for(y=0;y<5;y++) 
          for(x=0;x<1;x++); 
        }  
         
        void Delay3ms(void) 
        {  
         int i; 
         unsigned long j; 
         for(i = 3;i > 0;i--) 
         { 
        for(j = 1000;j > 0;j--); 
         } 
        } 
         
        void  Delay202us(void) 
        {uchar n;  
         uchar m; 
         for(m=0;m<200;m++) 
          for(n=0;n<3;n++); 
        }   
          
          
          void ReceiveShock(void) 
          {uchar i=0,j=0; 
           uchar dat; 
           P4DIR&=~DATA; 
           while(P4IN&DR1) 
           { dat=dat<<1; 
            
            P4OUT&=~CLK1; 
             
             if(P4IN&DATA) 
              dat=dat|0x01; 
             i++; 
             P4OUT|=CLK1; 
             Delay500ns(); 
             if(i>7) 
             {i=0; 
              RXData[j]=dat; 
              j++; 
           } 
            P4OUT&=~CLK1; 
           } 
          } 
********************************  END  *************************************