❶ 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;
}
}
榪欎釜鏄閫氳繃嫻嬭瘯浜嗙殑,鎮ㄥ彲浠ュ弬鑰冧竴涓,娌℃湁鐢ㄥ埌涓鏂,鏄鐢ㄦ煡璇㈢殑鏂瑰紡,甯屾湜瀵逛綘鏈夊府鍔╁惂~!!