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

📄 nrf2401a的51单片机的代码.txt

📁 此代码为RFID射频识别系统nRF2401a芯片的51单片机的代码
💻 TXT
字号:
**********************************************************************************/
/**********************************************************************************/
// The nRF2401 2.4GHz Multi Channel Software
//
// This software and any related documentation is provided "as is" without any
// warranty of any kind, either express or implied, including, without
// limitation, the implied warranties or merchantability, fitness for a
// particular purpose, and noninfringment. The entire risk arising out of use
// of this software remains with you.
// cpu= At89S52,keilC51 compiler

/**********************************************************************************/
/**********************************************************************************/
#include "reg52.h"   //晶振可以用11.0592MHZ,如果用串口的话
                     //提示:在调试程序的时候晶振用12MHZ
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "intrins.h"
/**********************************************************************************/
#define uchar unsigned char 
#define uint  unsigned int

#define Fclk 3686400
#define BitRate 19200
#define BRR  (Fclk/(16*Bitrate))-1

#define timerdiv 1
#define timerval 256-(Fclk/timerdiv)/100000   // timeout each 10us
/**********************************************************************************/
uchar  InitData[15];
uchar  TXData[14];
uchar  RXData[10];

uchar  Temp;
uchar  BitCnt; 
uchar  ByteCnt;
uchar  Data1= 0xff;

bdata  uchar  tempi;
/**********************************************************************************/
sbit CLK1  =P1^7;
sbit CS  =P1^5;
sbit Data =P3^2;
sbit CE  =P1^1;
//sbit Clk2 =P1^5;
//sbit Dout2 =P1^6;

//sbit DR2  =P3^2;
sbit DR1  =P1^6;
sbit PWR_UP =P1^0;

sbit LED1 =P0^0;
sbit LED2 =P0^2;
sbit LED3 =P0^4;
sbit LED4 =P0^6;

/*sbit CLK1  =P2^0;
sbit CS  =P2^2;
sbit Data =P2^3;
sbit CE  =P2^4;
sbit Clk2 =P2^5;
sbit Dout2 =P2^6;

sbit DR2  =P3^2;
sbit DR1  =P3^3;
sbit PWR_UP =P3^5;

sbit LED1 =P0^4;
sbit LED2 =P0^5;
sbit LED3 =P0^6;
sbit LED4 =P0^7;
*/
sbit  bflag =tempi^7;
/**********************************************************************************/
void  init_io();
void  nRF2401_ON();
void  BuildInitWord();
void  InitnRF2401();
void  DoSPIClock();
void  CE_High();
void  RXEN_HIGH();
void  TXEN_LOW();
void delay_n(uchar n);
void  BuildShockWord(Data1);
void  ShockBurst();
void  CheckButtons();
void  ReceiveShock();
void  Inituart();
/*****************************************MAIN  START ******************************/

/*****************************************MAIN  START ******************************/
void main(void)
{ 
 init_io();                                      //初始化51的I/O口
 nRF2401_ON();                                   //给NRF2401上电,开启2401,PWR-up=1
 delay_n(100);///jia////////
 BuildInitWord();                                //初始化120位状态字
 InitnRF2401();                                  //送120位状态字到NRF2401
 Inituart();                                     //单片机初始化计时器 
 CE_High();                                      //置CE为高
 RXEN_HIGH();                                    //51单片机从NRF2401的DATA读出数据,NRF2401由配置方式转为激发方式
 delay_n(100);       //delay for LED light
    
    P0=0xff;    //close all LED 
    TXEN_LOW();    // set TX mode                //51单片机向NRF2401写入数据
 BuildShockWord(Data1);  
 ShockBurst();  
 delay_n(10);    // delay for mode change
 RXEN_HIGH();                          
 while(1)
  {
   CheckButtons(); //check if the button is pressed
   DR1=1;
   if(DR1==1)  // Check if DR1 is high (any received from nRF2401) 
    ReceiveShock();   
  }  
}
/*************************************Rmain      END *******************************/
/*************************************init_io   START ******************************/
void init_io()
{
 P0=0Xff;
 P1=0x00;
 P2=0xff;
 P3=0xff;
 P0=0xff;
/*
 P0=0Xff;
 P1=0xff;
 P2=0x00;
 P3=0xff;
 P0=0x0f;
 */
}
/*************************************init_io    END *******************************/
void Inituart(void)
{
 TMOD = 0x20;    //timer1 working mode 1
 TL1 = 0xfd;     //f7=9600 for 16mhz Fosc,and ... 
 TH1 = 0xfd;     //...fd=19200 for 11.0592mhz Fosc
 SCON = 0xd8;    //uart mode 3,ren==1
 PCON = 0x80;    //smod=0
 TR1 = 1;     //start timer1

   /* SCON=0x50;  //模式1
    TMOD=0x21;  //定时模式2
    IE=0x90;

    //=====9600=======设置串口通讯寄存器
    PCON=0x00;   //波特率9600BPS,晶振11.0592MHZ
    TH1=0xFD;  //
    TL1=0xFD;  //计数器初值
 TR1 = 1;     //start timer1*/
}
/*************************************BuildSPIWord START****************************/
void BuildInitWord()
{
 InitData[0]=0x50;  //RX receiver 2, Datalength 80bit(10 byte)
 InitData[1]=0x50;  //RX receiver 1, Datalength 80bit(10 byte)
 InitData[2]=0x00;
 InitData[3]=0xcc;
 InitData[4]=0xcc;
 InitData[5]=0xcc;
 InitData[6]=0xcc;
 InitData[7]=0xcc;
 InitData[8]=0xcc;   //RX receiver 1 address   High byte
 InitData[9]=0xcc;  //RX receiver 1 address   High byte
 InitData[10]=0xcc;  //RX receiver 1 address   Low byte
 InitData[11]=0xcc;  //RX receiver 1 address   Low byte
 //InitData[12]=0x82; //this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC disable(Bit0) for ES chip
 InitData[12]=0x83;  //this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip 
 InitData[13]=0x4f;  //One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
 //InitData[13]=0x6f; //One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 1M, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
 InitData[14]=0x05;  //Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}
/*************************************BuildSPIWord END******************************/
void TxData (uchar x)
{
 SBUF=x; 
 while(TI==0);
  TI=0;

}


/*************************************InitnRF2401 START******************************/  
void InitnRF2401()
{
 CE=0;      //Disable CE
 CS=1;      //Enable CS--confige mode
 for (ByteCnt=0;ByteCnt<15;ByteCnt++)
  {
  tempi=InitData[ByteCnt];
  for (BitCnt=0;BitCnt<8;BitCnt++)
   {
    if (bflag==1) //Check if first bit is HIGH
     Data=1;  //Set Data high
    else
     Data=0;  //Set Data low
    tempi=tempi<<1; //Left Shift to get next bit
    DoSPIClock(); //Call "DoClock" to generate a clock pulse
   }
  }
 CS=0;      //Disable CS--standby mode 
 Data=0;      //Set Data low
}
/*************************************InitnRF2401 END *******************************/
/*************************************DoSPIClock START******************************/
void DoSPIClock()
{
 CLK1=1;
 _nop_();
 _nop_();
 CLK1=0;
} 

/*************************************DoSPIClock END *******************************/
/*************************************CE_High   START ******************************/
void CE_High()
{
 CE=1;
}
/*************************************CE_High    END *******************************/
/*************************************TXEN_LOW  START ******************************
void CE_Low()
{
 CE=0;
}
*************************************CE_Low     END ********************************/
/*************************************nRF2401_ON START******************************/
void nRF2401_ON()
{
 PWR_UP=1;
}
/*************************************nRF2401_ON END *******************************/
/*************************************nRF2401_OFF START*****************************/
//void nRF2401_OFF()
//{
// PWR_UP=0;   // Set Power_Up low 
//}
/*************************************nRF2401_OFF END ******************************/
/*************************************RXEN_HIGH START ******************************/
void RXEN_HIGH()
{
 CE=0;    //Set CE LOW  
 CS=1;    //Set CS HIGH--confige mode
 Data=1;    //Set Data HIGH
 DoSPIClock();   //Make one SPIClock cycle
 CS=0;    //Set CS LOW  
 CE=1;    //Set CE HIGH--active mode
}
/*************************************RXEN_HIGH  END *******************************/
/*************************************TXEN_LOW  START ******************************/  
void TXEN_LOW()
{
 CE=0;    //Set CE LOW   
 CS=1;    //Set CS HIGH--confige mode
 Data=0;    //Set Data LOW
 DoSPIClock();  //Make one SPIClock cycle
 CS=0;    //Set CS LOW  
 CE=1;    //Set CE HIGH--active mode
}

/*************************************TXEN_LOW   END *******************************/
/*************************************delay_n   START *****************************/ 
void delay_n(uchar n)
{
 uchar  x;
 uchar  y;
 for(x=0;x<n;x++)
  {
  //for(y=0;y<100;y++)
  for(y=0;y<130;y++)/////jia
  _nop_();
  }
}
/*************************************delay_n   END *******************************/
/*************************************ShockBurst START *****************************/
void BuildShockWord(Data1)
{
 TXData[0]=0xcc;  //MSB    ;RX receiver 1 address   High byte
 TXData[1]=0xcc;  //MSB-1  ;RX receiver 1 address   High byte
 TXData[2]=0xcc;  //MSB-2  ;RX receiver 1 address   Low byte
 TXData[3]=0xcc;  //MSB-3  ;RX receiver 1 address   Low  byte
 TXData[4]=Data1; //MSB-4  ;Data byte 9
 TXData[5]=0x02;  //MSB-5  ;Data byte 8
 TXData[6]=0x03;  //MSB-6  ;Data byte 7
 TXData[7]=0x04;  //MSB-7  ;Data byte 6
 TXData[8]=0x05;  //MSB-8  ;Data byte 5
 TXData[9]=0x06;  //MSB-9  ;Data byte 4
 TXData[10]=0x07; //MSB-10 ;Data byte 3
 TXData[11]=0x08; //MSB-11 ;Data byte 2
 TXData[12]=0x09; //MSB-12 ;Data byte 1
 TXData[13]=0x10; //MSB-13 ;Data byte 0   
}
/************************************* BuildShockWord END *******************************/
/************************************* ShockBurst   START *******************************/
void ShockBurst()
{
 CS=0;     //Pull CS low
 CE=1;     //Enable CE active mode
 for (ByteCnt=0;ByteCnt<14;ByteCnt++)
 {
  tempi=TXData[ByteCnt];
  for (BitCnt=0;BitCnt<8;BitCnt++)
  {
   if (bflag==1) //Check if first bit is HIGH
    Data=1;  //Set Data high
   else
    Data=0;  //Set Data low
   tempi=tempi<<1; //Left Shift to get next bit
   DoSPIClock();
   //SendData(); //Call SendData
  }
 }
 CE=0;     //Disable CE (TX Starts!)--standby mode
 Data=0;     //Set Data low
}
/************************************* ShockBurst END ***********************************/
/************************************* SendData     START *******************************
  
void SendData()
{
 for (BitCnt=0;BitCnt<8;BitCnt++)
  {
  if (bflag==1)  //Check if first bit is HIGH
   Data=1;   //Set Data high
  else
   Data=0;   //Set Data low
  tempi=tempi<<1;  //Left Shift to get next bit
  DoSPIClock();  //Call "DoClock" to generate a clock pulse
  }
}

************************************** SendData END *************************************/
/************************************* CheckButtons START *******************************/ 
/*
void CheckButtons_jia()
{
 uchar xx;
 P0=0xff;
 Temp=P0&0x0f;   //read key value from port P0
 if (Temp!=0x0f)
 {
  delay_n(10);
  Temp=P0&0x0f;   //read key value from port P0
  if (Temp!=0x0f)
  {
   xx=Temp;
   Temp=Temp<<4;
   Data1=Temp;  //put the button Data in dada package
   P0=Data1;  //Turn On the LED
   TXEN_LOW();  //set TX mode
   BuildShockWord(Data1);
   ShockBurst();
   TxData(xx);
   delay_n(500);
   P0=0xff;  //close LED display
   RXEN_HIGH();

   while((P0&0x0f)!=0x0f);
   }
  }
}
*/
void CheckButtons()
{
 uchar xx;
 P0=0xff;
 Temp=P0&0xaa;   //read key value from port P0
 if (Temp!=0xaa)
 {
  delay_n(10);
  Temp=P0&0xaa;   //read key value from port P0
  if (Temp!=0xaa)
  {
   xx=Temp;
   Temp=Temp>>1;
   Data1=Temp;  //put the button Data in dada package
   P0=Data1;  //Turn On the LED
   TXEN_LOW();  //set TX mode
   BuildShockWord(Data1);
   ShockBurst();
   TxData(xx);
   delay_n(500);
   P0=0xff;  //close LED display
   RXEN_HIGH();

   while((P0&0xaa)!=0xaa);
   }
  }
}
/************************************* CheckButtons END *********************************/
/************************************* ReceiveShock START *******************************/
/*
void ReceiveShock_jia()
{
 uchar xx;
 Data=1;     //Set Data tri state
 Temp=0;
 for (ByteCnt=0;ByteCnt<10;ByteCnt++)
 {
  for(BitCnt=0;BitCnt<8;BitCnt++)
  {
   Temp=Temp<<1; //shift left to receive next bit
   CLK1=1;   //set clock high
   _nop_(); 
   _nop_();  //wait one clk cycle
   Data=1;
   if(Data==1)  //check if Data=high  
    Temp|=0x01; //yes - set bit high
   CLK1=0;   //set clock low
   _nop_();  //wait one clk cycle
  }
  _nop_();
  RXData[ByteCnt]=Temp;
  DR1=1;
  if(DR1!=1)   //check if DR1 is not still high
  {  
   _nop_();
   P0=RXData[0]; //Turn On the LED
   xx=(RXData[0]>>4)&0x0f;
   TxData(xx);
   delay_n(500);
        P0=0xff;
  }
  }
}
*/
void ReceiveShock()
{
 uchar xx;
 Data=1;     //Set Data tri state
 Temp=0;
 for (ByteCnt=0;ByteCnt<10;ByteCnt++)
 {
  for(BitCnt=0;BitCnt<8;BitCnt++)
  {
   Temp=Temp<<1; //shift left to receive next bit
   CLK1=1;   //set clock high
   _nop_(); 
   _nop_();  //wait one clk cycle
   Data=1;
   if(Data==1)  //check if Data=high  
    Temp|=0x01; //yes - set bit high
   CLK1=0;   //set clock low
   _nop_();  //wait one clk cycle
  }
  _nop_();
  RXData[ByteCnt]=Temp;
  DR1=1;
  if(DR1!=1)   //check if DR1 is not still high
  {  
   _nop_();
   P0=RXData[0]; //Turn On the LED
   xx=RXData[0]<<1;//
   TxData(xx);
   delay_n(500);
        P0=0xff;
  }
  }
}
/************************************* ReceiveShock END *********************************/ 

⌨️ 快捷键说明

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