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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī) SPI nRF24L01無線 可以放在2個單片機(jī)里實(shí)現(xiàn)通信

          51單片機(jī) SPI nRF24L01無線 可以放在2個單片機(jī)里實(shí)現(xiàn)通信

          作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          main.c
          1 #include2 #include"2401.h"3 4 #define uint unsigned int5 #define uchar unsigned char6 7 sbit KEY8=P3^7;     //發(fā)送按鍵 8 sbit beep=P2^3;//喇叭 9 sbit LED6=P1^6;     ////接收到數(shù)據(jù)后的功能實(shí)現(xiàn)燈  10 11 void delay_ms(uint z)     //延時函數(shù) 12 {13     uint x,y;14     for(x=z;x>0;x--)15         for(y=110;y>0;y--);16 }17 void delayms(unsigned int x)18 {19     unsigned int i;20     while(x--)21         for(i=125;i>0;i--);22 }23 void main()24 {25      uchar Tx_Buf1[]={1};//發(fā)送的信息1 26      uchar Rx_Buf[32];  //接收到的數(shù)據(jù)暫存器,最多32字節(jié)數(shù)據(jù)  27      init_NRF24L01();28      LED6=1;//初始燈6熄滅   29 30 31     while(NRF24L01_Check())        //檢查不到24l01則報警 32     {33         beep=0;34         delayms(200);35         beep=1;36         delayms(200);37     }38     while(1)39     {    40         RX_Mode();//接收模式  41         while(!nRF24L01_RxPacket(Rx_Buf)) //等待接收數(shù)據(jù) ,返回1則接收到數(shù)據(jù) ,在等待接收數(shù)據(jù)期間,可以隨時變成發(fā)送模式  42         {43             if(KEY8==0)     //按了按鍵8   則變成發(fā)送模式,發(fā)送對應(yīng)數(shù)據(jù),發(fā)送完后變成接收模式 44             {    45                 delay_ms(5);//消抖動 46                 if(KEY8==0)47                 {48                      while(!KEY8);49                     TX_Mode();     //發(fā)送模式 50                     nRF24L01_TxPacket(Tx_Buf1);    // 發(fā)送命令數(shù)據(jù)51                       LED6=0;52                     delay_ms(300);53                     LED6=1;54                     delay_ms(300);            //發(fā)送后LED6閃一下 55                     break;    //退出最近的循環(huán),從而變回接收模式,這句關(guān)鍵56                  }57                 58              }59          }60          if(Rx_Buf[0]==1)       //若接收到對應(yīng)的數(shù)據(jù)則實(shí)現(xiàn)對應(yīng)功能 61          {62              Rx_Buf[0]=0;//清空數(shù)據(jù) 63                LED6=0;64              delay_ms(300);65              LED6=1;66              delay_ms(300);//接收到數(shù)據(jù) 后閃爍      67          }         68     }69 }


          1 #ifndef __NRF24L01_H__2 #define __NRF24L01_H__3 #include4 #define uchar unsigned char5 #define uint unsigned int6 7 sbit    CE        =P1^0;8 sbit    CSN        =P1^1;9 sbit    SCK        =P1^2;10 sbit     MOSI    =P1^3;11 sbit     MISO    =P1^4;12 sbit    IRQ        =P1^5;13 14 //uchar TxBuf[20]={"1234567890abcdefghij"};15 #define TX_ADR_WIDTH    5       // 5 uints TX address width16 #define RX_ADR_WIDTH    5       // 5 uints RX address width17 #define TX_PLOAD_WIDTH  32      // 32 uints TX payload18 #define RX_PLOAD_WIDTH  32      // 32 uints TX payload19 uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};    //本地地址20 uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};    //接收地址21 ///***************************************NRF24L01寄存器指令*******************************************************22 #define READ_REG        0x00      // 讀寄存器指令23 #define WRITE_REG       0x20     // 寫寄存器指令24 #define RD_RX_PLOAD     0x61      // 讀取接收數(shù)據(jù)指令25 #define WR_TX_PLOAD     0xA0      // 寫待發(fā)數(shù)據(jù)指令26 #define FLUSH_TX        0xE1     // 沖洗發(fā)送 FIFO指令27 #define FLUSH_RX        0xE2      // 沖洗接收 FIFO指令28 #define REUSE_TX_PL     0xE3      // 定義重復(fù)裝載數(shù)據(jù)指令29 #define NOP             0xFF      // 保留30 ///*************************************SPI(nRF24L01)寄存器地址****************************************************31 #define CONFIG          0x00  // 配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式32 #define EN_AA           0x01  // 自動應(yīng)答功能設(shè)置33 #define EN_RXADDR       0x02  // 可用信道設(shè)置34 #define SETUP_AW        0x03  // 收發(fā)地址寬度設(shè)置35 #define SETUP_RETR      0x04  // 自動重發(fā)功能設(shè)置36 #define RF_CH           0x05  // 工作頻率設(shè)置37 #define RF_SETUP        0x06  // 發(fā)射速率、功耗功能設(shè)置38 #define NRFRegSTATUS    0x07  // 狀態(tài)寄存器39 #define OBSERVE_TX      0x08  // 發(fā)送監(jiān)測功能40 #define CD              0x09  // 地址檢測           41 #define RX_ADDR_P0      0x0A  // 頻道0接收數(shù)據(jù)地址42 #define RX_ADDR_P1      0x0B  // 頻道1接收數(shù)據(jù)地址43 #define RX_ADDR_P2      0x0C  // 頻道2接收數(shù)據(jù)地址44 #define RX_ADDR_P3      0x0D  // 頻道3接收數(shù)據(jù)地址45 #define RX_ADDR_P4      0x0E  // 頻道4接收數(shù)據(jù)地址46 #define RX_ADDR_P5      0x0F  // 頻道5接收數(shù)據(jù)地址47 #define TX_ADDR         0x10  // 發(fā)送地址寄存器48 #define RX_PW_P0        0x11  // 接收頻道0接收數(shù)據(jù)長度49 #define RX_PW_P1        0x12  // 接收頻道1接收數(shù)據(jù)長度50 #define RX_PW_P2        0x13  // 接收頻道2接收數(shù)據(jù)長度51 #define RX_PW_P3        0x14  // 接收頻道3接收數(shù)據(jù)長度52 #define RX_PW_P4        0x15  // 接收頻道4接收數(shù)據(jù)長度53 #define RX_PW_P5        0x16  // 接收頻道5接收數(shù)據(jù)長度54 #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態(tài)寄存器設(shè)置55 ///*****************************子函數(shù)集*********************************************************56 uchar NRF24SPI_Send_Byte(uchar dat);57 uchar SPI_WR_Reg(uchar reg, uchar value);58 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len);59 uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len);60 uchar nRF24L01_RxPacket(unsigned char* rx_buf);61 void nRF24L01_TxPacket(unsigned char * tx_buf);62 uchar SPI_RD_Reg(uchar reg);63 void init_NRF24L01(void);64 void TX_Mode(void);65 void RX_Mode(void);66 void NRF_Send(void);67 uchar NRF24L01_Check(void);68 ///*************************************************************************************69 uchar NRF24SPI_Send_Byte(uchar dat)70 {71   uchar i;72    for (i = 0; i < 8; i++) // output 8-bit73    {74       //發(fā)送1位數(shù)據(jù)75       if (dat & 0x80)         // output uchar, MSB to MOSI76       {77          MOSI = 1;78       }79       else80       {81          MOSI = 0;82       }83 84       dat <<= 1;           // shift next bit into MSB..85       86       //讀取1位數(shù)據(jù)87       SCK = 1;                      // Set SCK high..88 89       if (MISO)90       {91          dat = 1;92       }             // capture current MISO bit93       else94       {95          dat &= 0xFE;96       }97       SCK = 0;                    // ..then set SCK low again98    }99    100    return(dat);                  // return read uchar101 }102 103 void Delay_n10us(uint n)       //延時n個10us104 {105    for(;n>0;n--)106    {107         unsigned char a,b;108      for(b=1;b>0;b--)109          for(a=2;a>0;a--);110    }}112 ///****************************************************************************************113 ///*NRF24L01檢測是否存在114 ///***************************************************************************************/115 uchar NRF24L01_Check(void)116 {117     uchar bu[5]={0XA5,0XA5,0XA5,0XA5,0XA5};118     uchar bu1[5];119     uchar i;        120     SPI_Write_Buf(WRITE_REG+TX_ADDR,bu,5);//寫入5個字節(jié)的地址.    121     SPI_Read_Buf(TX_ADDR,bu1,5);              //讀出寫入的地址      122     for(i=0;i<5;i++)if(bu1[i]!=0XA5)break;                       123     if(i!=5)return 1;                               //NRF24L01不在位    124     return 0;                                        //NRF24L01在位125 }          126 ///****************************************************************************************127 ///*NRF24L01初始化128 ///***************************************************************************************/129 void init_NRF24L01(void)130 {131    uchar buf[5]={0};132    Delay_n10us(10);133    CE = 0;    // chip enable134    CSN= 0;    // Spi disable 135   136   SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 測試原來的本地地址:復(fù)位值是:0xE7 0xE7 0xE7 0xE7 0xE7137   138 //    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫本地地址    139 //    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址140 141 //    142 //    SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);      //  頻道0自動    ACK應(yīng)答允許    143 //    SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允許接收地址只有頻道0,如果需要多頻道可以參考Page21  144 //    SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 設(shè)置自動重發(fā)時間和次數(shù):500us + 86us, 10 retrans...145 //    SPI_WR_Reg(WRITE_REG + RF_CH, 22);        //   設(shè)置信道工作為2.4GHZ,收發(fā)必須一致146 //    SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)147 //    SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07);           //設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB148 //  149 //  SPI_RD_Reg(WRITE_REG + EN_AA);150 //  SPI_RD_Reg(WRITE_REG + EN_RXADDR);151 //  SPI_RD_Reg(WRITE_REG + RF_CH);152 //  SPI_RD_Reg(WRITE_REG + RX_PW_P0);153 //  SPI_RD_Reg(WRITE_REG + RF_SETUP);154 }155 ///****************************************************************************************************156 ///*函數(shù):uchar SPI_Read(uchar reg)157 ///*功能:NRF24L01的SPI時序158 ///****************************************************************************************************/159 uchar SPI_RD_Reg(uchar reg)160 {161     uchar reg_val;162     163     CSN = 0;                // CSN low, initialize SPI communication...164     NRF24SPI_Send_Byte(reg);            // Select register to read from..165     reg_val = NRF24SPI_Send_Byte(0);    // ..then read registervalue166     CSN = 1;                // CSN high, terminate SPI communication167     168     return(reg_val);        // return register value169 }170 //****************************************************************************************************/171 //*功能:NRF24L01讀寫寄存器函數(shù)172 //****************************************************************************************************/173 uchar SPI_WR_Reg(uchar reg, uchar value)174 {175     uchar status;176     177     CSN = 0;                   // CSN low, init SPI transaction178     status = NRF24SPI_Send_Byte(reg);// select register179     NRF24SPI_Send_Byte(value);             // ..and write value to it..180     CSN = 1;                   // CSN high again181     182     return(status);            // return nRF24L01 status uchar183 }184 ///****************************************************************************************************/185 //*函數(shù):uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)186 //*功能: 用于讀數(shù)據(jù),reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchars:讀出數(shù)據(jù)的個數(shù)187 //****************************************************************************************************/188 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)189 {190     uint status,i;191     192     CSN = 0;                            // Set CSN low, init SPI tranaction193     status = NRF24SPI_Send_Byte(reg);               // Select register to write to and read status uchar194     195   for(i=0;i
          2401.h



          評論


          技術(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); })();