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