怎么用msp430nrf24l01 单片机连接和nrf24l01发送浮点数据?

基于MSP430单片机驱动NRF24L01无线模块接收C语言程序
> 基于MSP430单片机驱动NRF24L01无线模块接收C语言程序
基于MSP430单片机驱动NRF24L01无线模块接收C语言程序
uint recieve_adrs(){int k,a;uint buffer1=0x0000,b=0x0000;Delayus(250);for(k=32;k>0;k--){alldata[k]=P2IN&0x02;Delayus(1000);}for(k=32;k>16;k--){a=alldata[k];a=a>>1;b=b|a;b=b<>1;buffer1=buffer1|b;}return buffer1;}ulong recieve_data(){int k,a;ulong buffer2=0x0000,b=0x0000;for(k=16;k>0;k--){a=alldata[k];a=a>>1;b=b|a;b=b<>1;buffer2=buffer2|b;}return buffer2;}/*************************************************************************///显示数据void print_tmp(){ulong TEMP=0;int TEMPFLG=0;char TEMP1,TEMP2,TEMP3,TEMP4;TEMP = recieve_data()&0xfff8;if(TEMP>0x8000){TEMP=TEMP>>3;TEMP=TEMP<35)//P1OUT &= ~BIT1;//
Delayus_ms(700);TEMP1=char11[TEMP/1000];TEMP2=char11[TEMP%];TEMP3=char11[TEMP%100/10];TEMP4=char11[TEMP%10];if(TEMP1==0){ if(TEMP2==0){if(TEMPFLG==1)writechar(0x90,-);writechar(0x91,TEMP3);writechar(0x92,.);writechar(0x93,TEMP4);}else{if(TEMPFLG==1)writechar(0x90,-);writechar(0x91,TEMP2);writechar(0x92,TEMP3);writechar(0x93,.);writechar(0x94,TEMP4);}}else{if(TEMPFLG==1)writechar(0x90,-);writechar(0x91,TEMP1);writechar(0x92,TEMP2);writechar(0x93,TEMP3);writechar(0x94,.);writechar(0x95,TEMP4);}}void print_light(){lgt=recieve_data()&0x0004;lgt=lgt>>2;if(lgt)writechinese(0x98,"暗");elsewritechinese(0x98,"亮");}void print_data(){num=char11[Rx_Buff[0]];writechar(0x90,num);num=char11[Rx_Buff[1]];writechar(0x91,num);num=char11[Rx_Buff[2]];writechar(0x92,num);}/********************************************************************************///键盘void key_Init(){P5SEL = 0;P6SEL = 0;P6DIR|=0
//P6=OUTP5DIR=0x8b;
//P5.2、4、5、6=in,P5.0、1、3、7=out}void key_read(){//第一排扫描P6OUT=0x18;Delayus(100);key0=P5IN&0x70 ;if (key0==0x30){key11=1;if(keyflg==0){CLEAR();writechinese(0x80,"单独探测节点");writechinese(0x90,"1-选择1#节点");writechinese(0x88,"2-选择2#节点");writechinese(0x98,"g-返回主菜单");keyflg=1;}else if(keyflg==1){CLEAR();writechinese(0x80,"寻检1#节点");writechinese(0x90,"d-确认,g-返回");keyflg=2;}Delayus(30000);}if (key0==0x40){key11=2;if(keyflg==0){CLEAR();writechinese(0x80,"轮寻模式");writechinese(0x90,"d-确认,g-返回");keyflg=4;}if(keyflg==1){CLEAR();writechinese(0x80,"寻检2#节点");writechinese(0x90,"d-确认,g-返回");keyflg=3;}Delayus(30000);}if (key0==0x50){key11=3;Delayus(30000);}if (key0==0x60){Delayus(30000);key11=4;}//第二排扫描P6OUT=0x20;Delayus(100);key0=P5IN&0x70 ;if (key0==0x30){key11=5;Delayus(30000);}if (key0==0x40){key11=6;Delayus(30000);}if (key0==0x50){key11=7;Delayus(30000);}if (key0==0x60){key11=8;Delayus(30000);}//第三排扫描P6OUT=0x28;Delayus(100);key0=P5IN&0x70 ;if (key0==0x30){key11=9;Delayus(30000);}if (key0==0x40){key11=A;Delayus(30000);}if (key0==0x50){key11=B;Delayus(30000);}if (key0==0x60){key11=C;Delayus(30000);}//第四排扫描P6OUT=0x30;Delayus(100);key0=P5IN&0x70 ;if (key0==0x30){key11=D;if(keyflg==2){CLEAR();writechinese(0x80,"发送1#节点请求");send_bit1();send_adrs(0x0001);_EINT();//发送1号节点请求}if(keyflg==3){CLEAR();writechinese(0x80,"发送2#节点请求");send_bit1();send_adrs(0x0002);_EINT();//发送2号节点请求}if(keyflg==4){CLEAR();writechinese(0x80,"发送1#节点请求");send_bit1();send_adrs(0x0001);keyflg=2;Delayus(20000);writechinese(0x80,"发送2#节点请求");send_bit1();send_adrs(0x0002);keyflg=3;_EINT();}Delayus(30000);}if (key0==0x40){key11=E;Delayus(30000);}if (key0==0x50){key11=F;Delayus(30000);}if (key0==0x60){key11=G;CLEAR();writechinese(0x80,"江南大学");writechinese(0x90,"通信与控制工程");writechinese(0x88,"无线监测模拟装置");Delayus(100000);CLEAR();writechinese(0x80,"选择接受模式");writechinese(0x90,"1-单独探测节点");writechinese(0x88,"2-轮巡模式");keyflg=0;Delayus(30000);Init_nRF24L01_IO();}}void print1(ulong x){ulong cvt0,cvt1;
int k,i;char data[10];cvt0=x;for(k=4,i=0;k>0;k--,i++){cvt1=cvt0&0x000f;data[i]=char11[cvt1%16];cvt0=cvt0>>4;}writechar(0x90,data[3]);writechar(0x91,data[2]);writechar(0x92,data[1]);writechar(0x93,data[0]);}/********************************************************************///主程序void main(void){WDTCTL=WDTPW+WDTHOLD;_DINT();Init_Port1();IO_Init();LCD_Init();CLEAR();key11=M;// LCDL=安;//汉字显示示例writechinese(0x80,"江南大学");writechinese(0x90,"通信与控制工程");writechinese(0x88,"无线监测模拟装置");Delayus(100000);CLEAR();writechinese(0x80,"调试接收模式");//writechinese(0x90,"1-单独探测节点");//writechinese(0x88,"2-轮巡模式");keyflg=0;bostart=0x00;boflg=0x00;key_Init();Init_nRF24L01_IO();nRF24L01_RX_MODE();nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);nRF24L01_Flush_RX_FIFO();nRF24L01_CE_1;_EINT();do{key11=key_read();}while(1);}#pragma vector=PORT1_VECTOR__interrupt void P1_ISR(void){_DINT();P1IFG=0;P1IE=0;P1IES=0;Delayus(500);CLEAR();writechinese(0x80,"正在接收");//
print_data();nRF24L01SpiWriteReg(nRF24L01_W_REGISTER+nRF24L01_STATUS,0x4e);//Reset_Rx_DSnRF24L01_Read_Rx_Payload(Rx_Buff,3);nRF24L01_Flush_RX_FIFO();print_data();IO_Init();Init_Port1();_EINT();}
分享给小伙伴们:
我来说两句……
微信公众号二
微信公众号一后使用快捷导航没有帐号?
请完成以下验证码
查看: 2815|回复: 2
NRF24L01无线模块频率配置问题,求助
在线时间10 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
NRF24L01无线模块中寄存器RF_CH共包括六位,这六位决定了不同的工作方式频率,0x40应该是其中的一种工作通道频率;请问下,这六种不同的工作方式频率分别是哪些呢?SPI_RW_Reg(WRITE_REG + RF_CH, 40);& && && &// 选择射频通道0x40& &这句配置的频率是多少呢?
在线时间2 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 102, 距离下一级还需 98 积分
一粒金砂(中级), 积分 102, 距离下一级还需 98 积分
2.4+40/GHZ
提供各种无线模块,欢迎交流 需要请发邮件 索要资料
交流方式: 电话:024-(陈先生) QQ: &&MSN:
15:03 上传
点击文件名下载附件
7.17 KB, 下载次数: 39
全系列NRF24L01
在线时间2 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 102, 距离下一级还需 98 积分
一粒金砂(中级), 积分 102, 距离下一级还需 98 积分
2.4+40/GHZ
15:05 上传
点击文件名下载附件
7.17 KB, 下载次数: 68
EEWORLD 官方微信
Powered by程序———史上最简单的nrf24l01无线发送和接收试验!!!【单片机吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:148,139贴子:
程序———史上最简单的nrf24l01无线发送和接收试验!!!收藏
大家只要在程序里把无线模块的引脚定义和LED灯改成和你们电路一样的就可以了,发送端的功能就是每隔1秒发送一次数据,指示灯闪一下!!接收端就是一直处于接收模式,只要一成功接收到信号,指示灯就闪一下!!
接收程序:#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
//接收地址宽度设置为5个字节#define TX_DATA_WITDH 2
//发送数据宽度#define RX_DATA_WITDH 2
//接收数据宽度 //以下为命令寄存器#define R_REGISTER
0x00 // 读寄存器#define W_REGISTER
0x20 // 写寄存器#define R_RX_PLOAD
0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式#define W_TX_PLOAD
0xA0 // 写TX 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 // 空操作,可以用来读状态寄存器//以下为寄存器地址#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状态寄存器
// 状态变量#define RX_DR (sta & 0x40)
// 接收成功中断标志 (sta^6)#define TX_DS (sta & 0x20)
// 发射成功中断标志
(sta^5)#define MAX_RT (sta & 0x10) // 重发溢出中断标志
(sta^4)//nRF24L01引脚定义sbit MISO=P2^3;sbit
IRQ=P2^2;sbit
SCK=P2^4;sbit MOSI=P2^1;sbit
CE=P2^5;sbit
CSN=P2^0;//外围引脚定义sbit
LED=P3^7;uchar code TX_Addr[TX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};uchar code RX_Addr[RX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};uchar RX_Buffer[RX_DATA_WITDH]={0};uchar m=0;void _delay_us(int x){int i,j;for (j=0;j&x;j++)for (i=0;i&12;i++);}void _delay_ms(int x){int i,j;for (j=0;j&x;j++)for (i=0;i&120;i++);}//SPI时序函数(1)uchar SPI_RW(uchar byte)
{for(i=0;i&8;i++){if(byte&0x80)MOSI=1;else MOSI=0;byte&&=1;SCK=1;if(MISO)byte|=0x01;SCK=0;}
}//往寄存器写一字节(2)uchar SPI_W_Reg(uchar reg,uchar value){//返回状态CSN=0;//SPI片选status=SPI_RW(reg);//写入寄存器地址,同时读取状态SPI_RW(value);//写入一字节CSN=1;////返回状态}//从寄存器中读一字节(3)uchar SPI_R_byte(uchar reg){uchar reg_CSN=0;SPI_RW(reg);reg_value=SPI_RW(0);CSN=1;return reg_}//从寄存器中读多个字节(4)uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen){uchar status,i;CSN=0;status=SPI_RW(reg);for(i=0;i&Di++){Dat_Buffer[i]=SPI_RW(0);}CSN=1;} //往寄存器中写多个字节(5)uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{uchar status,i;CSN=0;status=SPI_RW(reg);for(i=0;i&Di++){SPI_RW(TX_Dat_Buffer[i]);}CSN=1;
}//nRF24L01初始化void nRF24L01_Init(void)
{_delay_us(100);CE=0;CSN=1;SCK=0;IRQ=1;SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//本机地址
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,RX_Addr,RX_ADDR_WITDH);//接收地址SPI_W_Reg(W_REGISTER+EN_AA,0x01); //自动应答SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//通道一SPI_W_Reg(W_REGISTER+RF_CH,0);//频道SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);//接收数据长度SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//发射率速
}void nRF24L01_Set_RX_Mode()
SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
_delay_us(300);
}uchar nRF24L01_RX(uchar *rx_buf)
uchar value=0;
sta=SPI_R_byte(STATUS);
if(RX_DR){CE=0;SPI_R_DBuffer(R_RX_PLOAD,rx_buf,RX_DATA_WITDH);SPI_W_Reg(W_REGISTER+STATUS,sta);value=1;CSN=0;SPI_W_Reg(FLUSH_RX,0x00);
CSN=1; LED=0;_delay_ms(100);LED=1;_delay_ms(100);}}void main(){nRF24L01_Init();LED=1;while(1){
nRF24L01_Set_RX_Mode();
nRF24L01_RX(RX_Buffer);}}
发送程序:#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
//接收地址宽度设置为5个字节#define TX_DATA_WITDH 2#define RX_DATA_WITDH 2 //以下为命令寄存器#define R_REGISTER
0x00 // 读寄存器#define W_REGISTER
0x20 // 写寄存器#define R_RX_PLOAD
0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式#define W_TX_PLOAD
0xA0 // 写TX 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 // 空操作,可以用来读状态寄存器//以下为寄存器地址#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状态寄存器
// 状态变量#define RX_DR (sta & 0x40)
// 接收成功中断标志 (sta^6)#define TX_DS (sta & 0x20)
// 发射成功中断标志
(sta^5)#define MAX_RT (sta & 0x10) // 重发溢出中断标志
(sta^4)//nRF24L01引脚定义sbit MISO=P2^3;sbit
IRQ=P2^2;sbit
SCK=P2^4;sbit MOSI=P2^1;sbit
CE=P2^5;sbit
CSN=P2^0;//外围引脚定义sbit
LED=P3^7;uchar code TX_Addr[TX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};uchar code RX_Addr[RX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};uchar
TX_Buffer[TX_DATA_WITDH]={0};void _delay_us(int x){int i,j;for (j=0;j&x;j++)for (i=0;i&12;i++);}void delay(int x){int i,j;for (j=0;j&x;j++)for (i=0;i&120;i++);} //SPI时序函数(1)uchar SPI_RW(uchar byte)
{for(i=0;i&8;i++){if(byte&0x80)MOSI=1;else MOSI=0;byte&&=1;SCK=1;if(MISO)byte|=0x01;SCK=0;}
}//往寄存器写一字节(2)uchar SPI_W_Reg(uchar reg,uchar value){//返回状态CSN=0;//SPI片选status=SPI_RW(reg);//写入寄存器地址,同时读取状态SPI_RW(value);//写入一字节CSN=1;////返回状态}//从寄存器中读一字节(3)uchar SPI_R_byte(uchar reg){uchar reg_CSN=0;SPI_RW(reg);reg_value=SPI_RW(0);CSN=1;return reg_}//往寄存器中写多个字节(5)uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{uchar status,i;CSN=0;status=SPI_RW(reg);for(i=0;i&Di++){SPI_RW(TX_Dat_Buffer[i]);}CSN=1;
}//nRF24L01初始化void nRF24L01_Init(void)
{_delay_us(200);CE=0;CSN=1;SCK=0;IRQ=1;SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//本机地址SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,RX_Addr,RX_ADDR_WITDH);//接收地址SPI_W_DBuffer(W_TX_PLOAD,TX_Buffer,TX_DATA_WITDH);//写发送数据SPI_W_Reg(W_REGISTER+EN_AA,0x01); //自动应答SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);//自动重发SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//通道一SPI_W_Reg(W_REGISTER+RF_CH,0);//频道0SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//发射速率
}//设置发送模式void nRF24L01_Set_TX_Mode(){CE=0; SPI_W_DBuffer(W_TX_PLOAD,TX_Buffer,TX_DATA_WITDH);//写发送数据SPI_W_Reg(W_REGISTER+CONFIG,0x0e);CE=1;_delay_us(300);}uchar ACK(){uchar value=0;sta=SPI_R_byte(STATUS);if(TX_DS|MAX_RT)//{
SPI_W_Reg(W_REGISTER+STATUS,0xFF);/*CSN=0;SPI_W_Reg(FLUSH_TX,0x00);CSN=1;*/return(0);}elsereturn(1); }void main(){nRF24L01_Init();while(1){ nRF24L01_Set_TX_Mode();//发送数据 while(ACK());//检查是否发送成功 LED=0; delay(500);
LED=1; delay(500);
可以手动按键led显示发送么?
谢谢楼主不过我看不懂
你是用单片机的5V直接供电的么,会不会烧坏
lz可以加一下我QQ吗,有事详谈
mark 发送端调出现象 但是接受端没现象
专业从事单片机开发的生产,具有高品质的研发团队和设备,产品高品质保证,10年生产开发经验.
楼主 对与NRF24L01我的程序不知道为什么有些奇怪 不知道是不是漏了哪些地方 能加QQ问问你吗 我
楼主,在那改变发送的数据。。
接受程序里,接受到的数据怎么调用出来,接受的数据是保存在什么地方,新手求解
我有一对买来在吃灰。还没玩。明天试试
#include &msp430g2553.h&#define uchar unsigned char#define uint unsigned int#define CPU_F
((double)1000000)#define delay_us(x)
__delay_cycles((long)(CPU_F*(double)x/))#define delay_ms(x)
__delay_cycles((long)(CPU_F*(double)x/1000.0))char RxBuf[32];#define RF24L01_CE_0 P2OUT&=~BIT0#define RF24L01_CE_1 P2OUT|=BIT0#define RF24L01_MOSI_0 P2OUT&=~BIT4#define RF24L01_MOSI_1 P2OUT|=BIT4#define RF24L01_SCK_0 P2OUT&=~BIT1#define RF24L01_SCK_1 P2OUT|=BIT1#define RF24L01_CSN_0 P2OUT&=~BIT3#define RF24L01_CSN_1 P2OUT|=BIT3#define RF24L01_MISO P2IN&BIT2#define RF24L01_IRQ P2IN&BIT5#define TX_ADR_WIDTH
// 5 uints TX address width#define RX_ADR_WIDTH
// 5 uints RX address width#define TX_PLOAD_WIDTH
// 20 uints TX payload#define RX_PLOAD_WIDTH
// 20 uints TX payloadchar TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址char RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG
// 读寄存器指令#define WRITE_REG
// 写寄存器指令#define RD_RX_PLOAD
// 读取接收数据指令#define WR_TX_PLOAD
// 写待发数据指令#define FLUSH_TX
// 冲洗发送 FIFO指令#define FLUSH_RX
// 冲洗接收 FIFO指令#define REUSE_TX_PL
// 定义重复装载数据指令#define NOP
// 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG
// 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA
// 自动应答功能设置#define EN_RXADDR
// 可用信道设置#define SETUP_AW
// 收发地址宽度设置#define SETUP_RETR
// 自动重发功能设置#define RF_CH
// 工作频率设置#define RF_SETUP
// 发射速率、功耗功能设置#define STATUS
// 状态寄存器#define OBSERVE_TX
// 发送监测功能#define CD
// 地址检测#define RX_ADDR_P0
// 频道0接收数据地址#define RX_ADDR_P1
// 频道1接收数据地址#define RX_ADDR_P2
// 频道2接收数据地址#define RX_ADDR_P3
// 频道3接收数据地址#define RX_ADDR_P4
// 频道4接收数据地址#define RX_ADDR_P5
// 频道5接收数据地址#define TX_ADDR
// 发送地址寄存器#define RX_PW_P0
// 接收频道0接收数据长度#define RX_PW_P1
// 接收频道0接收数据长度#define RX_PW_P2
// 接收频道0接收数据长度#define RX_PW_P3
// 接收频道0接收数据长度#define RX_PW_P4
// 接收频道0接收数据长度#define RX_PW_P5
// 接收频道0接收数据长度#define FIFO_STATUS
// FIFO栈入栈出状态寄存器设置//**************************************************************//===========================RF24L01端口设置==========================================
void RF24L01_IO_set(void){ P2DIR|=BIT0+BIT1+BIT4+BIT3; P2DIR&=~BIT2; P2DIR&=~BIT5;}//==============================================================================//函数:uint SPI_RW(uint uchar)//功能:NRF24L01的SPI写时序//******************************************************************************char SPI_RW(char data){ char i,temp=0; for(i=0;i&8;i++) // output 8-bit {
if((data & 0x80)==0x80)
RF24L01_MOSI_1; // output &#39;uchar&#39;, MSB to MOSI
RF24L01_MOSI_0;
data = (data && 1); // shift next bit into MSB..
RF24L01_SCK_1; // Set SCK high..
if(RF24L01_MISO)temp++; // capture current MISO bit
RF24L01_SCK_0; // ..then set SCK low again } return(temp); // return read uchar}//****************************************************************************************************//函数:uchar SPI_Read(uchar reg)//功能:NRF24L01的SPI时序//****************************************************************************************************char SPI_Read(char reg){ char reg_ RF24L01_CSN_0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue RF24L01_CSN_1; // CSN high, terminate SPI communication return(reg_val); // return register value}//****************************************************************************************************///功能:NRF24L01读写寄存器函数//****************************************************************************************************/char SPI_RW_Reg(char reg, char value){ char status1; RF24L01_CSN_0; // CSN low, init SPI transaction status1 = SPI_RW(reg); // select register SPI_RW(value); // ..and write value to it.. RF24L01_CSN_1; // CSN high again return(status1); // return nRF24L01 status uchar}//****************************************************************************************************///函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数//****************************************************************************************************/char SPI_Read_Buf(char reg, char *pBuf, char chars){ char status2,uchar_ RF24L01_CSN_0; // Set CSN low, init SPI tranaction status2 = SPI_RW(reg); // Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctr&uchar_ctr++) {
pBuf[uchar_ctr] = SPI_RW(0); } RF24L01_CSN_1; return(status2); // return nRF24L01 status uchar}//*********************************************************************************************************//函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于写数据 reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数//*********************************************************************************************************/char SPI_Write_Buf(char reg, char *pBuf, char chars){ char status1,uchar_ RF24L01_CSN_0; //SPI使能 status1 = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr& uchar_ctr++) {
SPI_RW(*pBuf++); } RF24L01_CSN_1; //关闭SPI return(status1);}//****************************************************************************************************///函数:void SetRX_Mode(void)//功能:数据接收配置//****************************************************************************************************/void SetRX_Mode(void){ RF24L01_CE_0; SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主接收 RF24L01_CE_1; delay_ms(2); //注意不能太小}//******************************************************************************************************///函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)//功能:数据读取后放如rx_buf接收缓冲区中//******************************************************************************************************/char nRF24L01_RxPacket(char* rx_buf){ char revale=0; sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况 if(sta&0x40) // 判断是否接收到数据 { RF24L01_CE_0 ; //SPI使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer revale =1; //读取数据完成标志 } SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志}//***********************************************************************************************************//函数:void nRF24L01_TxPacket(char * tx_buf)//功能:发送 tx_buf中数据//**********************************************************************************************************/void nRF24L01_TxPacket(char * tx_buf){ RF24L01_CE_0 ; //StandBy I模式 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据 // SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 RF24L01_CE_1; //置高CE,激发数据发送 delay_us(60);}//****************************************************************************************//NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){ delay_us(250); RF24L01_CE_0 ; // chip enable RF24L01_CSN_1; // Spi disable RF24L01_SCK_0; // Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // IRQ收发完成中断响应,16位CRC ,主接收}} void main(){ WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 BCSCTL1=CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL=CALDCO_1MHZ; P1DIR|=BIT0+BIT6; P1OUT&=~BIT0; P1OUT&=~BIT6; RF24L01_IO_set(); init_NRF24L01() ; SetRX_Mode();
//数据接收配置 while(1) {
SetRX_Mode();
//数据接收配置
要写在里面
if(nRF24L01_RxPacket(RxBuf))
if(RxBuf[0]==0x02)
P1OUT|=BIT0;
P1OUT&=~BIT6;
if(RxBuf[0]==0x01)
P1OUT&=~BIT0;
P1OUT|=BIT6;
P1OUT&=~BIT6;
P1OUT&=~BIT0;
msp430g接受程序,网上找的。
/*发送定版 * main.c *///测试可用#include &msp430g2553.h&#define uchar unsigned char#define uint unsigned int#define CPU_F
((double)1000000)#define delay_us(x)
__delay_cycles((long)(CPU_F*(double)x/))#define delay_ms(x)
__delay_cycles((long)(CPU_F*(double)x/1000.0))char TxBuf[32];#define RF24L01_CE_0 P2OUT&=~BIT0#define RF24L01_CE_1 P2OUT|=BIT0#define RF24L01_MOSI_0 P2OUT&=~BIT4#define RF24L01_MOSI_1 P2OUT|=BIT4#define RF24L01_SCK_0 P2OUT&=~BIT1#define RF24L01_SCK_1 P2OUT|=BIT1#define RF24L01_CSN_0 P2OUT&=~BIT3#define RF24L01_CSN_1 P2OUT|=BIT3#define RF24L01_MISO P2IN&BIT2#define RF24L01_IRQ P2IN&BIT5#define TX_ADR_WIDTH
// 5 uints TX address width#define RX_ADR_WIDTH
// 5 uints RX address width#define TX_PLOAD_WIDTH
// 20 uints TX payload#define RX_PLOAD_WIDTH
// 20 uints TX payloadchar TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址char RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG
// 读寄存器指令#define WRITE_REG
// 写寄存器指令#define RD_RX_PLOAD
// 读取接收数据指令#define WR_TX_PLOAD
// 写待发数据指令#define FLUSH_TX
// 冲洗发送 FIFO指令#define FLUSH_RX
// 冲洗接收 FIFO指令#define REUSE_TX_PL
// 定义重复装载数据指令#define NOP
// 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG
// 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA
// 自动应答功能设置#define EN_RXADDR
// 可用信道设置#define SETUP_AW
// 收发地址宽度设置#define SETUP_RETR
// 自动重发功能设置#define RF_CH
// 工作频率设置#define RF_SETUP
// 发射速率、功耗功能设置#define STATUS
// 状态寄存器#define OBSERVE_TX
// 发送监测功能#define CD
// 地址检测#define RX_ADDR_P0
// 频道0接收数据地址#define RX_ADDR_P1
// 频道1接收数据地址#define RX_ADDR_P2
// 频道2接收数据地址#define RX_ADDR_P3
// 频道3接收数据地址#define RX_ADDR_P4
// 频道4接收数据地址#define RX_ADDR_P5
// 频道5接收数据地址#define TX_ADDR
// 发送地址寄存器#define RX_PW_P0
// 接收频道0接收数据长度#define RX_PW_P1
// 接收频道0接收数据长度#define RX_PW_P2
// 接收频道0接收数据长度#define RX_PW_P3
// 接收频道0接收数据长度#define RX_PW_P4
// 接收频道0接收数据长度#define RX_PW_P5
// 接收频道0接收数据长度#define FIFO_STATUS
// FIFO栈入栈出状态寄存器设置//**************************************************************//===========================RF24L01端口设置==========================================void RF24L01_IO_set(void){ P2DIR|=BIT0+BIT1+BIT4+BIT3; P2DIR&=~BIT2; P2DIR&=~BIT5;}//==============================================================================//函数:uint SPI_RW(uint uchar)//功能:NRF24L01的SPI写时序//******************************************************************************char SPI_RW(char data){ char i,temp=0; for(i=0;i&8;i++) // output 8-bit {
if((data & 0x80)==0x80)
RF24L01_MOSI_1; // output &#39;uchar&#39;, MSB to MOSI
RF24L01_MOSI_0;
data = (data && 1); // shift next bit into MSB..
RF24L01_SCK_1; // Set SCK high..
if(RF24L01_MISO)temp++; // capture current MISO bit
RF24L01_SCK_0; // ..then set SCK low again } return(temp); // return read uchar}//****************************************************************************************************//函数:uchar SPI_Read(uchar reg)//功能:NRF24L01的SPI时序//****************************************************************************************************char SPI_Read(char reg){ char reg_ RF24L01_CSN_0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue RF24L01_CSN_1; // CSN high, terminate SPI communication return(reg_val); // return register value}//****************************************************************************************************///功能:NRF24L01读写寄存器函数//****************************************************************************************************/char SPI_RW_Reg(char reg, char value){ char status1; RF24L01_CSN_0; // CSN low, init SPI transaction status1 = SPI_RW(reg); // select register SPI_RW(value); // ..and write value to it.. RF24L01_CSN_1; // CSN high again return(status1); // return nRF24L01 status uchar}
//****************************************************************************************************///函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数//****************************************************************************************************/char SPI_Read_Buf(char reg, char *pBuf, char chars){ char status2,uchar_ RF24L01_CSN_0; // Set CSN low, init SPI tranaction status2 = SPI_RW(reg); // Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctr&uchar_ctr++) {
pBuf[uchar_ctr] = SPI_RW(0); } RF24L01_CSN_1; return(status2); // return nRF24L01 status uchar}//*********************************************************************************************************//函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)//功能: 用于写数据 reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数//*********************************************************************************************************/char SPI_Write_Buf(char reg, char *pBuf, char chars){ char status1,uchar_ RF24L01_CSN_0; //SPI使能 status1 = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr& uchar_ctr++) {
SPI_RW(*pBuf++); } RF24L01_CSN_1; //关闭SPI return(status1);}//****************************************************************************************************///函数:void SetRX_Mode(void)//功能:数据接收配置//****************************************************************************************************/void SetRX_Mode(void){ RF24L01_CE_0; SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主接收 RF24L01_CE_1; delay_ms(2); //注意不能太小}//******************************************************************************************************///函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)//功能:数据读取后放如rx_buf接收缓冲区中//******************************************************************************************************/char nRF24L01_RxPacket(char* rx_buf){ char revale=0; sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况 if(sta&0x40) // 判断是否接收到数据 { RF24L01_CE_0 ; //SPI使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer revale =1; //读取数据完成标志 } SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志}//***********************************************************************************************************//函数:void nRF24L01_TxPacket(char * tx_buf)//功能:发送 tx_buf中数据//**********************************************************************************************************/void nRF24L01_TxPacket(char * tx_buf){ RF24L01_CE_0 ; //StandBy I模式 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 RF24L01_CE_1; //置高CE,激发数据发送 delay_us(60);}//****************************************************************************************//NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){ delay_us(250); RF24L01_CE_0 ; // chip enable RF24L01_CSN_1; // Spi disable RF24L01_SCK_0; // Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // IRQ收发完成中断响应,16位CRC ,主接收}} void main(){ WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 BCSCTL1=CALBC1_1MHZ; //设定DCO 为1MHZ DCOCTL=CALDCO_1MHZ; P1DIR|=BIT0+BIT6; P1OUT&=~BIT0; P1OUT&=~BIT6; P1DIR&=~BIT3;//KEY P1REN|=BIT3; P1OUT|=BIT3; RF24L01_IO_set(); init_NRF24L01() ; nRF24L01_TxPacket(TxBuf);// SetRX_Mode();
//数据接收配置 while(1) {/*
TxBuf[2]=0x01;
nRF24L01_TxPacket(TxBuf);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);//要加上*/
if(!(P1IN&BIT3))//按键按下
delay_ms(10);
if(!(P1IN&BIT3))
TxBuf[0]=0x01;
delay_ms(2);
nRF24L01_TxPacket(TxBuf);
delay_ms(2);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
delay_ms(2);
P1OUT|=BIT0;
P1OUT&=~BIT6;
if(P1IN&BIT3)//按键没按下
delay_ms(10);
if(P1IN&BIT3)
TxBuf[0]=0x02;
delay_ms(2);
nRF24L01_TxPacket(TxBuf);
delay_ms(2);
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
delay_ms(2);
P1OUT|=BIT6;
P1OUT&=~BIT0;
长长的代码。。。
楼主用的什么型号的单片机?
﹏﹏﹏&#x270E; Microsoft&#x2122; Nokia&#x00AE; &#x1D35;&#x1D58;&#x1D50;&#x1DA4;&#x1D43; --来&#x0489;自诺&#x0489;基&#x0489;亚 &#x0489; Lumia638
楼主在吗?为什么我的接收端的led一直都是闪烁的啊?急急急急急急
为什么我的接收端的数据一直都是0xff,我是用串口读出来的
拔掉无线模块电源后
串口显示也是0xff
我就是用你的程序
只是改了端口
在接收程序里 加了个串口函数
之前用其他的程序
也是这个问题
我的是按4个按键发送4种数组,为什么我的只可以接收一次,,还有发送的数组的值不能赋给IO口控制IO口的电平?????发送***********************#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 //接收地址宽度设置为5个字节#define TX_DATA_WITDH 4#define RX_DATA_WITDH 4//以下为命令寄存器#define R_REGISTER 0x00 // 读寄存器#define W_REGISTER 0x20 // 写寄存器#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式#define W_TX_PLOAD 0xA0 // 写TX 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 // 空操作,可以用来读状态寄存器//以下为寄存器地址#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状态寄存器#define FOSC
// 状态变量#define RX_DR (sta & 0x40) // 接收成功中断标志 (sta^6)#define TX_DS (sta & 0x20) // 发射成功中断标志
(sta^5)#define MAX_RT (sta & 0x10) // 重发溢出中断标志
(sta^4)//nRF24L01引脚定义sbit MISO=P1^6;sbit IRQ=P1^4;sbit SCK=P1^7;sbit MOSI=P1^5;sbit CE=P1^2;sbit CSN=P1^3;//外围引脚定义sbit LED=P1^0;sbit KEY1
P3^0;sbit KEY2
P3^1;sbit KEY3
P3^2;sbit KEY4
P3^3;uchar code TX_Addr [TX_ADDR_WITDH]
{0x34,0x43,0x10,0x10,0x01};uchar code RX_Addr [RX_ADDR_WITDH]
{0x34,0x43,0x10,0x10,0x01};uchar
[TX_DATA_WITDH]
void _delay_us(int x)
for (j=0;j&x;j++)
for (i=0;i&12;i++);
void delay(int x)
for (j=0;j&x;j++)
for (i=0;i&120;i++);
} void delay_ms(uint z){uint x,y;#if FOSC==for(x=z;x&0;x--)for(y=112;y&0;y--);#elif FOSC==for(x=z;x&0;x--)for(y=122;y&0;y--);#elif FOSC==for(x=z;x&0;x--)for(y=228;y&0;y--);#endif}//SPI时序函数(1)uchar SPI_RW(uchar byte){for(i=0;i&8;i++){if(byte&0x80)MOSI=1;else MOSI=0;byte&&=1;SCK=1;if(MISO)byte|=0x01;SCK=0;}}//往寄存器写一字节(2)uchar SPI_W_Reg(uchar reg,uchar value){//返回状态CSN=0;//SPI片选status=SPI_RW(reg);//写入寄存器地址,同时读取状态SPI_RW(value);//写入一字节CSN=1;////返回状态}//从寄存器中读一字节(3)uchar SPI_R_byte(uchar reg){uchar reg_CSN=0;SPI_RW(reg);reg_value=SPI_RW(0);CSN=1;return reg_}//往寄存器中写多个字节(5)uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen){uchar status,i;CSN=0;status=SPI_RW(reg);for(i=0;i&Di++){SPI_RW(TX_Dat_Buffer[i]);}CSN=1;}//nRF24L01初始化void nRF24L01_Init(void){_delay_us(200);CE=0;CSN=1;SCK=0;IRQ=1;SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//本机地址SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,RX_Addr,RX_ADDR_WITDH);//接收地址SPI_W_DBuffer(W_TX_PLOAD,TX_Buffer,TX_DATA_WITDH);//写发送数据SPI_W_Reg(W_REGISTER+EN_AA,0x01); //自动应答SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);//自动重发SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//通道一SPI_W_Reg(W_REGISTER+RF_CH,0);//频道0SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//发射速率}//设置发送模式void nRF24L01_Set_TX_Mode(uchar *TXDATA){CE=0; SPI_W_DBuffer(W_TX_PLOAD,TXDATA ,TX_DATA_WITDH);//写发送数据SPI_W_Reg(W_REGISTER+CONFIG,0x0e);CE=1;_delay_us(300);}
uchar ACK()
uchar value=0;
sta=SPI_R_byte(STATUS);
if(TX_DS|MAX_RT)//
SPI_W_Reg(W_REGISTER+STATUS,0xFF);/*CSN=0;SPI_W_Reg(FLUSH_TX,0x00);CSN=1;*/ return(0);
}elsereturn(1); } uchar KeyScan( )
/********************************************************/
if(!KEY1) //如果检测到低电平,说明按键按下
delay_ms(15); //延时去抖,一般10-20ms
if(!KEY1) //再次确认按键是否按下,没有按下则退出
while(!KEY1);//如果确认按下按键等待按键释放,没有则退出
{TX_Buffer[0] = 1;//向左转TX_Buffer[1] = 0;TX_Buffer[2] = 1;TX_Buffer[3] = 1;nRF24L01_Set_TX_Mode(TX_Buffer);//发送数据·while(ACK()); //检测是否发完?
/********************************************************/
else if(!KEY2) //如果检测到低电平,说明按键按下
delay_ms(15); //延时去抖,一般10-20ms
if(!KEY2) //再次确认按键是否按下,没有按下则退出
while(!KEY2);//如果确认按下按键等待按键释放,没有则退出
{TX_Buffer[0] = 1;//向右转TX_Buffer[1] = 1;TX_Buffer[2] = 1;TX_Buffer[3] = 0;
nRF24L01_Set_TX_Mode(TX_Buffer);//发送数据while(ACK()); //检测是否发送完毕}
}/********************************************************/
else if(!KEY3) //如果检测到低电平,说明按键按下
delay_ms(15); //延时去抖,一般10-20ms
if(!KEY3) //再次确认按键是否按下,没有按下则退出
while(!KEY3);//如果确认按下按键等待按键释放,没有则退出{TX_Buffer[0] = 1;//前进TX_Buffer[1] = 0;TX_Buffer[2] = 1;TX_Buffer[3] = 0;
nRF24L01_Set_TX_Mode(TX_Buffer);//发送数据while(ACK()); //检测是否发送完毕}
/********************************************************/
else if(!KEY4) //如果检测到低电平,说明按键按下
delay_ms(15); //延时去抖,一般10-20ms
if(!KEY4) //再次确认按键是否按下,没有按下则退出
while(!KEY4);//如果确认按下按键等待按键释放,没有则退出{TX_Buffer[0] = 0;//后退TX_Buffer[1] = 1;TX_Buffer[2] = 0;TX_Buffer[3] = 1;nRF24L01_Set_TX_Mode(TX_Buffer);//发送数据while(ACK()); //检测是否发送完毕}
void main()
nRF24L01_Init();
KeyScan( );
接收************************************#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 //接收地址宽度设置为5个字节#define TX_DATA_WITDH 4 //发送数据宽度#define RX_DATA_WITDH 4 //接收数据宽度寄存器#define R_REGISTER 0x00 // 读寄存器#define W_REGISTER 0x20 // 写寄存器#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式#define W_TX_PLOAD 0xA0 // 写TX 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 // 空操作,可以用来读状态寄存器寄存器地址#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状态寄存器 // 状态变量#define RX_DR (sta & 0x40) // 接收成功中断标志 (sta^6)#define TX_DS (sta & 0x20) // 发射成功中断标志
(sta^5)#define MAX_RT (sta & 0x10) // 重发溢出中断标志
(sta^4)//nRF24L01引脚定义sbit MISO=P1^6;sbit IRQ=P1^4;sbit SCK=P1^7;sbit MOSI=P1^5;sbit CE=P1^2;sbit CSN=P1^3;//外围引脚定义sbit LED=P1^0;sbit a
P2^4;sbit b
P2^5;sbit c
P2^6;sbit d
P2^7;uchar code TX_Addr[TX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};uchar code RX_Addr[RX_ADDR_WITDH]={0x34,0x43,0x10,0x10,0x01};uchar RX_Buffer[RX_DATA_WITDH];uchar m=0;void _delay_us(int x){int i,j;for (j=0;j&x;j++)for (i=0;i&12;i++);}void _delay_ms(int x){int i,j;for (j=0;j&x;j++)for (i=0;i&120;i++);}//SPI时序函数(1)uchar SPI_RW(uchar byte){for(i=0;i&8;i++){if(byte&0x80)MOSI=1;else MOSI=0;byte&&=1;SCK=1;if(MISO)byte|=0x01;SCK=0;}}//往寄存器写一字节(2)uchar SPI_W_Reg(uchar reg,uchar value){//返回状态CSN=0;//SPI片选status=SPI_RW(reg);//写入寄存器地址,同时读取状态SPI_RW(value);//写入一字节CSN=1;////返回状态}//从寄存器中读一字节(3)uchar SPI_R_byte(uchar reg){uchar reg_CSN=0;SPI_RW(reg);reg_value=SPI_RW(0);CSN=1;return reg_}//从寄存器中读多个字节(4)uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen){uchar status,i;CSN=0;status=SPI_RW(reg);for(i=0;i&Di++){Dat_Buffer[i]=SPI_RW(0);}CSN=1;} //往寄存器中写多个字节(5)uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen){uchar status,i;CSN=0;status=SPI_RW(reg);for(i=0;i&Di++){SPI_RW(TX_Dat_Buffer[i]);}CSN=1;}//nRF24L01初始化void nRF24L01_Init(void){_delay_us(100);CE=0;CSN=1;SCK=0;IRQ=1;SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//本机地址SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,RX_Addr,RX_ADDR_WITDH);//接收地址SPI_W_Reg(W_REGISTER+EN_AA,0x01); //自动应答SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//通道一SPI_W_Reg(W_REGISTER+RF_CH,0);//频道SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);//接收数据长度SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//发射率速}void nRF24L01_Set_RX_Mode(){CE=0;SPI_W_Reg(W_REGISTER+CONFIG,0x0f);CE=1;_delay_us(300);}uchar nRF24L01_RX(uchar *rx_buf){uchar value=0;sta=SPI_R_byte(STATUS);if(RX_DR){CE=0;SPI_R_DBuffer(R_RX_PLOAD,rx_buf,RX_DATA_WITDH);SPI_W_Reg(W_REGISTER+STATUS,sta);value=1;CSN=0;SPI_W_Reg(FLUSH_RX,0x00);CSN=1;LED=0;_delay_ms(200);LED=1;_delay_ms(200);}}void main(){
LED=1;while(1){ dnRF24L01_Init();nRF24L01_Set_RX_Mode();nRF24L01_RX(RX_Buffer);a=RX_Buffer[0];b=RX_Buffer[1];c=RX_Buffer[2];d=RX_Buffer[3];}}
吧里牛人多啊,小弟真的是佩服你们能写出这么复杂的程序来
有原理图和pcb吗
楼主,我把各个引脚都改了怎么还是不行?
测试不成功,弄了挺久了,也找了大部分程序,看来是模块坏了
登录百度帐号

我要回帖

更多关于 nrf24l01 51单片机 的文章

 

随机推荐