<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > NRF24L01接收程序(單片機是STC89C52)

          NRF24L01接收程序(單片機是STC89C52)

          作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
          #include

          #include
          typedefunsigned int uint;
          typedefunsigned char uchar;

          本文引用地址:http://www.ex-cimer.com/article/201611/322560.htm

          #define TX_ADDR_WITDH 5//發(fā)送地址寬度設(shè)置為5個字節(jié)
          #define RX_ADDR_WITDH 5
          #define TX_DATA_WITDH 8
          #define RX_DATA_WITDH 8

          #define R_REGISTER0x00// 讀寄存器
          #define W_REGISTER0x20// 寫寄存器
          #define R_RX_PLOAD0x61// 讀RX FIFO有效數(shù)據(jù),1-32字節(jié),當讀數(shù)據(jù)完成后,數(shù)據(jù)被清除,應(yīng)用于接收模式
          #define W_TX_PLOAD0xA0// 寫TX FIFO有效數(shù)據(jù),1-32字節(jié),寫操作從字節(jié)0開始,應(yīng)用于發(fā)射模式
          #define FLUSH_TX0xE1// 清除TX FIFO寄存器,應(yīng)用于發(fā)射模式
          #define FLUSH_RX0xE2// 清除RX FIFO寄存器,應(yīng)用于接收模式
          #define REUSE_TX_PL 0xE3// 重新使用上一包有效數(shù)據(jù),當CE為高過程中,數(shù)據(jù)包被不斷的重新發(fā)射
          #define NOP0xFF// 空操作,可以用來讀狀態(tài)寄存器

          #define CONFIG0x00// 配置寄存器
          #define EN_AA0x01// “自動應(yīng)答”功能寄存器
          #define EN_RX_ADDR0x02// 接收通道使能寄存器
          #define SETUP_AW0x03// 地址寬度設(shè)置寄存器
          #define SETUP_RETR0x04// 自動重發(fā)設(shè)置寄存器
          #define RF_CH0x05// 射頻通道頻率設(shè)置寄存器
          #define RF_SETUP0x06// 射頻設(shè)置寄存器
          #define STATUS0x07// 狀態(tài)寄存器
          #define OBSERVE_TX0x08// 發(fā)送檢測寄存器
          #define CD0x09// 載波檢測寄存器
          #define RX_ADDR_P00x0A// 數(shù)據(jù)通道0接收地址寄存器
          #define RX_ADDR_P10x0B// 數(shù)據(jù)通道1接收地址寄存器
          #define RX_ADDR_P20x0C// 數(shù)據(jù)通道2接收地址寄存器
          #define RX_ADDR_P30x0D// 數(shù)據(jù)通道3接收地址寄存器
          #define RX_ADDR_P40x0E// 數(shù)據(jù)通道4接收地址寄存器
          #define RX_ADDR_P50x0F// 數(shù)據(jù)通道5接收地址寄存器
          #define TX_ADDR0x10// 發(fā)送地址寄存器
          #define RX_PW_P00x11// 數(shù)據(jù)通道0有效數(shù)據(jù)寬度設(shè)置寄存器
          #define RX_PW_P10x12// 數(shù)據(jù)通道1有效數(shù)據(jù)寬度設(shè)置寄存器
          #define RX_PW_P20x13// 數(shù)據(jù)通道2有效數(shù)據(jù)寬度設(shè)置寄存器
          #define RX_PW_P30x14// 數(shù)據(jù)通道3有效數(shù)據(jù)寬度設(shè)置寄存器
          #define RX_PW_P40x15// 數(shù)據(jù)通道4有效數(shù)據(jù)寬度設(shè)置寄存器
          #define RX_PW_P50x16// 數(shù)據(jù)通道5有效數(shù)據(jù)寬度設(shè)置寄存器
          #define FIFO_STATUS 0x17// FIFO狀態(tài)寄存器
          //*********************************************************************************
          ucharsta;// 狀態(tài)變量
          #define RX_DR(sta & 0x40)// 接收成功中斷標志
          #define TX_DS(sta & 0x20)// 發(fā)射成功中斷標志
          #define MAX_RT (sta & 0x10)// 重發(fā)溢出中斷標志

          sbit CE=P1^5;
          sbit IRQ=P1^0;
          sbit CSN=P1^4;
          sbit MOSI=P1^2;
          sbit MISO=P1^1;
          sbit SCK=P1^3;
          sbit LED=P0^0;

          uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
          uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
          uchar RX_Buffer[RX_DATA_WITDH];

          void _delay_us(uint x)
          {
          uint i,j;
          for (j=0;jfor (i=0;i<12;i++);
          }

          void _delay_ms(uint x)
          {
          uint i,j;
          for (j=0;jfor (i=0;i<120;i++);
          }
          void nRF24L01_Init(void)
          {
          _delay_us(2000);
          CE=0;
          CSN=1;
          SCK=0;
          IRQ=1;
          }

          uchar SPI_RW(uchar byte)
          {
          uchar i;
          for(i=0;i<8;i++)
          {
          if(byte&0x80)
          MOSI=1;
          else
          MOSI=0;
          byte<<=1;
          SCK=1;
          if(MISO)
          byte|=0x01;
          SCK=0;
          }
          return byte;
          }

          uchar SPI_W_Reg(uchar reg,uchar value)
          {
          uchar status;
          CSN=0;
          status=SPI_RW(reg);
          SPI_RW(value);
          CSN=1;
          return status;
          }

          uchar SPI_R_byte(uchar reg)
          {
          uchar status;
          CSN=0;
          SPI_RW(reg);
          status=SPI_RW(0);
          CSN=1;
          return status;
          }

          uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
          {
          uchar reg_value,i;
          CSN=0;
          reg_value=SPI_RW(reg);
          for(i=0;i{
          Dat_Buffer[i]=SPI_RW(0);
          }
          CSN=1;
          return reg_value;
          }

          uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
          {
          uchar reg_value,i;
          CSN=0;
          reg_value=SPI_RW(reg);
          for(i=0;i{
          SPI_RW(TX_Dat_Buffer[i]);
          }
          CSN=1;
          return reg_value;
          }

          void nRF24L01_Set_RX_Mode(void)
          {
          CE=0;//待機
          SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);
          SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);
          SPI_W_Reg(W_REGISTER+EN_AA,0x01);//auot ack
          SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
          SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
          SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
          SPI_W_Reg(W_REGISTER+RF_CH,0);
          SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//0db,lna
          SPI_W_Reg(W_REGISTER+CONFIG,0x0f);

          CE=1;
          _delay_ms(5);
          }

          uchar nRF24L01_RX_Data(void)
          {
          sta=SPI_R_byte(R_REGISTER+STATUS);
          if(RX_DR)
          {
          CE=0;
          SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
          SPI_W_Reg(W_REGISTER+STATUS,0xff);
          CSN=0;
          SPI_RW(FLUSH_RX);
          CSN=1;
          return 1;
          }
          else
          return 0;

          }


          void main(void)
          {
          uchar i;
          P0=0xff;
          P1=0xff;
          P2=0xff;
          P3=0xff;
          _delay_us(1000);
          nRF24L01_Init();
          while(1)
          {
          nRF24L01_Set_RX_Mode();
          _delay_ms(100);
          if(nRF24L01_RX_Data())
          {
          LED=0;//如果有數(shù)據(jù)收到燈亮
          }
          else//否則燈熄
          LED=1;
          }
          }



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();