❶ 51單片機有sip怎樣控制nRF24L01無線模塊
是SPI介面吧,就是將相應介面連接起來就行,這是發送的,如果想加按鍵,可在主函數接收前指定一個I/O口用於按鍵設置,
#include <reg52.h>
#include <intrins.h>
#include <api.h>
/***************************************************/
#define uchar unsigned char
#define TX_ADR_WIDTH   5  // 5位元組寬度的發送/接收地址
#define TX_PLOAD_WIDTH 4  // 數據通道有效數據寬度
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定義一個靜態發送地址
//uchar code RX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x02};
uchar RX_BUF[TX_PLOAD_WIDTH];
uchar TX_BUF[TX_PLOAD_WIDTH] = {0x22,0x34,0x56,0x78};
uchar flag;
uchar DATA = 0x01;
uchar bdata sta;
sbit  RX_DR  = sta^6;
sbit  TX_DS  = sta^5;
sbit  MAX_RT = sta^4;
/**************************************************/
/**************************************************
函數: init_io()
描述:初始化IO
/**************************************************/
void init_io(void)
{
 CE  = 0;        // 待機
 CSN = 1;        // SPI禁止
 SCK = 0;        // SPI時鍾置低
 IRQ = 1;        // 中斷復位
}
/**************************************************/
/**************************************************
函數:delay_ms()
描述:延遲x毫秒
/**************************************************/
void delay_ms(uchar x)
{
    uchar i, j;
    i = 0;
    for(i=0; i<x; i++)
    {
       j = 250;
       while(--j);
    j = 250;
       while(--j);
    }
}
/**************************************************/
/**************************************************
函數:SPI_RW()
描述:根據SPI協議,寫一位元組數據到nRF24L01,同時從nRF24L01讀出一位元組
/**************************************************/
uchar SPI_RW(uchar byte)
{
 uchar i;
    for(i=0; i<8; i++)          // 循環8次
    {
     MOSI = (byte & 0x80);   // byte最高位輸出到MOSI
     byte <<= 1;             // 低一位移位到最高位
     SCK = 1;                // 拉高SCK,nRF24L01從MOSI讀入1位數據,同時從MISO輸出1位數據
     byte |= MISO;        // 讀MISO到byte最低位
     SCK = 0;             // SCK置低
    }
    return(byte);            // 返回讀出的一位元組
}
/**************************************************/
/**************************************************
函數:SPI_RW_Reg()
描述:寫數據value到reg寄存器
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
 uchar status;
   CSN = 0;                   // CSN置低,開始傳輸數據
   status = SPI_RW(reg);      // 選擇寄存器,同時返回狀態字
   SPI_RW(value);             // 然後寫數據到該寄存器
   CSN = 1;                   // CSN拉高,結束數據傳輸
   return(status);            // 返回狀態寄存器
}
/**************************************************/
/**************************************************
函數:SPI_Write_Buf()
描述:把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發射通道數據或接收/發送地址
/**************************************************/
uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
 uchar status, i;
   CSN = 0;                    // CSN置低,開始傳輸數據
   status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
   for(i=0; i<bytes; i++)
     SPI_RW(pBuf[i]);        // 逐個位元組寫入nRF24L01
   CSN = 1;                    // CSN拉高,結束數據傳輸
   return(status);             // 返回狀態寄存器
}
/**************************************************/
/**************************************************
函數:TX_Mode()
描述:這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),130us後啟動發射,數據發送結束後,發送模塊自動轉入接收模式等待應答信號。
/**************************************************/
void TX_Mode(uchar * BUF)
{
 CE = 0;
   SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 寫入發送地址
   SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 為了應答接收設備,接收通道0地址和發送地址相同
   SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                  // 寫數據包到TX FIFO
   SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道0自動應答
   SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0
   SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自動重發延時等待250us+86us,自動重發10次
   SPI_RW_Reg(WRITE_REG + RF_CH, 40);         // 選擇射頻通道0x40
   SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x01);    // 數據傳輸率1Mbps,發射功率0dBm,低雜訊放大器增益
   SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校驗,上電
 CE = 1;
}
/**************************************************/
/**************************************************
函數:Check_ACK()
描述:檢查接收設備有無接收到數據包,設定沒有收到應答信號是否重發
/**************************************************/
uchar Check_ACK(bit clear)
{
 while(IRQ);
 sta = SPI_RW(NOP);                    // 返回狀態寄存器
 if(MAX_RT)
  if(clear)                         // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志後重發
   SPI_RW(FLUSH_TX);
 SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中斷標志
 IRQ = 1;
 if(TX_DS)
  return(0x00);
 else
  return(0xff);
}
/**************************************************/
/**************************************************
函數:main()
描述:主函數
/**************************************************/
void main(void)
{
 init_io();
 while(1)
 {
  TX_Mode(TX_BUF);
  Check_ACK(1);
  delay_ms(1000);
 }
}
/**************************************************/
❷ 甯甯甯蹇欏晩錛屾眰瑙e叧浜巒RF24L01紼嬪簭,紼嬪簭濡備笅錛屾垜鐢ㄤ簡1602鏄劇ず錛
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//鍙戦佸湴鍧瀹藉害璁劇疆涓5涓瀛楄妭
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 8
#define RX_DATA_WITDH 8
/******************************************************************
// nRF24L01鎸囦護鏍煎紡錛
*******************************************************************/
#define R_REGISTER    0x00  // 璇誨瘎瀛樺櫒
#define W_REGISTER    0x20  // 鍐欏瘎瀛樺櫒
#define R_RX_PLOAD    0x61  // 璇籖X FIFO鏈夋晥鏁版嵁錛1-32瀛楄妭錛屽綋璇繪暟鎹瀹屾垚鍚庯紝鏁版嵁琚娓呴櫎錛屽簲鐢ㄤ簬鎺ユ敹妯″紡
#define W_TX_PLOAD    0xA0  // 鍐橳X FIFO鏈夋晥鏁版嵁錛1-32瀛楄妭錛屽啓鎿嶄綔浠庡瓧鑺0寮濮嬶紝搴旂敤浜庡彂灝勬ā寮
#define FLUSH_TX    0xE1  // 娓呴櫎TX FIFO瀵勫瓨鍣錛屽簲鐢ㄤ簬鍙戝皠妯″紡
#define FLUSH_RX    0xE2  // 娓呴櫎RX FIFO瀵勫瓨鍣錛屽簲鐢ㄤ簬鎺ユ敹妯″紡
#define REUSE_TX_PL 0xE3  // 閲嶆柊浣跨敤涓婁竴鍖呮湁鏁堟暟鎹錛屽綋CE涓洪珮榪囩▼涓錛屾暟鎹鍖呰涓嶆柇鐨勯噸鏂板彂灝
#define NOP         0xFF  // 絀烘搷浣滐紝鍙浠ョ敤鏉ヨ葷姸鎬佸瘎瀛樺櫒
/******************************************************************
// nRF24L01瀵勫瓨鍣ㄥ湴鍧
*******************************************************************/
#define CONFIG      0x00  // 閰嶇疆瀵勫瓨鍣
#define EN_AA       0x01  // 鈥滆嚜鍔ㄥ簲絳斺濆姛鑳藉瘎瀛樺櫒
#define EN_RX_ADDR  0x02  // 鎺ユ敹閫氶亾浣胯兘瀵勫瓨鍣
#define SETUP_AW    0x03  // 鍦板潃瀹藉害璁劇疆瀵勫瓨鍣
#define SETUP_RETR  0x04  // 鑷鍔ㄩ噸鍙戣劇疆瀵勫瓨鍣
#define RF_CH       0x05  // 灝勯戦氶亾棰戠巼璁劇疆瀵勫瓨鍣
#define RF_SETUP    0x06  // 灝勯戣劇疆瀵勫瓨鍣
#define STATUS      0x07  // 鐘舵佸瘎瀛樺櫒
#define OBSERVE_TX  0x08  // 鍙戦佹嫻嬪瘎瀛樺櫒
#define CD          0x09  // 杞芥嘗媯嫻嬪瘎瀛樺櫒
#define RX_ADDR_P0  0x0A  // 鏁版嵁閫氶亾0鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P1  0x0B  // 鏁版嵁閫氶亾1鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P2  0x0C  // 鏁版嵁閫氶亾2鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P3  0x0D  // 鏁版嵁閫氶亾3鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P4  0x0E  // 鏁版嵁閫氶亾4鎺ユ敹鍦板潃瀵勫瓨鍣
#define RX_ADDR_P5  0x0F  // 鏁版嵁閫氶亾5鎺ユ敹鍦板潃瀵勫瓨鍣
#define TX_ADDR     0x10  // 鍙戦佸湴鍧瀵勫瓨鍣
#define RX_PW_P0    0x11  // 鏁版嵁閫氶亾0鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P1    0x12  // 鏁版嵁閫氶亾1鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P2    0x13  // 鏁版嵁閫氶亾2鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P3    0x14  // 鏁版嵁閫氶亾3鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P4    0x15  // 鏁版嵁閫氶亾4鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define RX_PW_P5    0x16  // 鏁版嵁閫氶亾5鏈夋晥鏁版嵁瀹藉害璁劇疆瀵勫瓨鍣
#define FIFO_STATUS 0x17  // FIFO鐘舵佸瘎瀛樺櫒
//*********************************************************************************
uchar  sta;    // 鐘舵佸彉閲
#define RX_DR  (sta & 0x40)  // 鎺ユ敹鎴愬姛涓鏂鏍囧織
#define TX_DS  (sta & 0x20)  // 鍙戝皠鎴愬姛涓鏂鏍囧織
#define MAX_RT (sta & 0x10)  // 閲嶅彂婧㈠嚭涓鏂鏍囧織
 
sbit CE=P2^0;
sbit IRQ=P2^5;
sbit CSN=P2^1;
sbit MOSI=P2^3;
sbit MISO=P2^4;
sbit SCK=P2^2;
sbit LED=P3^2;
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;j<x;j++)
for (i=0;i<12;i++);
}
void _delay_ms(uint x)
{
uint i,j;
for (j=0;j<x;j++)
for (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<Dlen;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<Dlen;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)
{
//uchar i,status;
sta=SPI_R_byte(R_REGISTER+STATUS);
if(RX_DR)
{
CE=0;
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
//P3=RX_Buffer[0];
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;
//delay_ms(300);
}
else
LED=1;
}
}
榪欎釜鏄閫氳繃嫻嬭瘯浜嗙殑,鎮ㄥ彲浠ュ弬鑰冧竴涓,娌℃湁鐢ㄥ埌涓鏂,鏄鐢ㄦ煡璇㈢殑鏂瑰紡,甯屾湜瀵逛綘鏈夊府鍔╁惂~!!