51单片机52单片机nrf24l01程序

合集下载

NRF24L01无线模块收发程序(实测成功 多图)

NRF24L01无线模块收发程序(实测成功 多图)

NRF24L01无线模块收发程序(实测成功多图)本模块是NRF24L01无线传输模块,用于无线传输数据,距离不远,一般只是能够满足小距离的传输,目测是4-5m,价格一般是4元左右,可以方便的买到。

51最小系统学习板就可以,当时是用了两块学习板,一块用于发送,一块用于接收。

小车也是比较容易购到的,四个端口控制两个电机,两个控制一个电机,当两个端口高低电平不同时电机就会转动,即为赋值1和0是电机转动,赋值可以用单片机作用,当然这是小车启动部分,前进后退左转右转就是你赋值0和1的顺序问题了。

整体思路是用发射端的按键控制小车,即为按键按下就前进,再按其他按键实现其他功能,本次程序是在用NRF24L01发射数据在接收端用1602显示的基础上改变。

下面是程序源码(有好几个文件,分别创建)////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////#include#include#include'1602.h'#include'delay.h'#include 'nrf24l01.h'#define uint unsigned int#define uchar unsigned charuint Weight_Shiwu=1234;unsigned char KeyScan(void);//键盘扫描// unsigned char KeyScan(void);//键盘扫描//#define KeyPort P0sbit KEY1 = P0^0;sbit KEY2 = P0^1;sbit KEY3 = P0^2;sbit KEY4 = P0^3;sbit KEY5 = P0^4;void main(){// char TxDate[4];// LCD_Init(); //初始化液晶屏// LCD_Clear(); //清屏// NRF24L01Int(); //初始化LCD1602// LCD_Write_String(4,0,'welcome');while(1){KeyScan();}}unsigned char KeyScan(void){/********************************************************/ char TxDate[4];{if(!KEY1) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY1) //再次确认按键是否按下,没有按下则退出{while(!KEY1);//如果确认按下按键等待按键释放,没有则退出{TxDate[0] = 1;//向左转TxDate[1] = 0;TxDate[2] = 1;TxDate[3] = 1;NRFSetTxMode(TxDate);//发送数据·while(CheckACK()); //检测是否发送完毕}}}/********************************************************/ else if(!KEY2) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY2) //再次确认按键是否按下,没有按下则退出{while(!KEY2);//如果确认按下按键等待按键释放,没有则退出{TxDate[0] = 1;//向右转TxDate[1] = 1;TxDate[2] = 1;TxDate[3] = 0;NRFSetTxMode(TxDate);//发送数据while(CheckACK()); //检测是否发送完毕}}}/********************************************************/ else if(!KEY3) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY3) //再次确认按键是否按下,没有按下则退出{while(!KEY3);//如果确认按下按键等待按键释放,没有则退出{TxDate[0] = 1;//前进TxDate[1] = 0;TxDate[2] = 1;TxDate[3] = 0;NRFSetTxMode(TxDate);//发送数据while(CheckACK()); //检测是否发送完毕}}}/********************************************************/ else if(!KEY4) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY4) //再次确认按键是否按下,没有按下则退出{while(!KEY4);//如果确认按下按键等待按键释放,没有则退出{TxDate[0] = 0;//后退TxDate[1] = 1;TxDate[2] = 0;TxDate[3] = 1;NRFSetTxMode(TxDate);//发送数据while(CheckACK()); //检测是否发送完毕}}}else if(!KEY5){DelayMs(10);if(!KEY5){while(!KEY5){TxDate[0] = 1;TxDate[1] = 1;TxDate[2] = 1;TxDate[3] = 1;NRFSetTxMode(TxDate);while(CheckACK());}}}}}////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////#include#include#include'1602.h'#include'delay.h'#include 'nrf24l01.h'#define uint unsigned int#define uchar unsigned charuint Weight;sbit a = P2^0;sbit b = P2^1;sbit c = P2^2;sbit d = P2^3;void main(){LCD_Init(); //初始化液晶屏LCD_Clear(); //清屏*(RevTempDate+4)=*\0*;NRF24L01Int();while(1){NRFSetRXMode();//设置为接收模式GetDate();//开始接受数;//Weight=RevTempDate[0]*1000+RevTempDate[1]*100+RevTempDate[2]* 10+RevTempDate[3];LCD_Write_Char(7,0,RevTempDate[0]+0x30);LCD_Write_Char(8,0,RevTempDate[1]+0x30);LCD_Write_Char(9,0,RevTempDate[2]+0x30);LCD_Write_Char(10,0,RevTempDate[3]+0x30);a = RevTempDate[0];//根据接受数据来设置高低电平(目测仅限传输1.0两种数值)b = RevTempDate[1];c = RevTempDate[2];d = RevTempDate[3];}}////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////#include#include 'nrf24l01.h'#define uchar unsigned char#define uint unsigned intsbit IRQ =P1^2;//输入sbit MISO =P1^3; //输入sbit MOSI =P1^1;//输出sbit SCLK =P1^4;//输出sbit CE =P1^5;//输出sbit CSN =P1^0;//输出uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址/*****************状态标志*****************************************/uchar bdata sta; //状态标志sbit RX_DR=sta^6;sbit TX_DS=sta^5;sbit MAX_RT=sta^4;/*****************SPI时序函数******************************************/uchar NRFSPI(uchar date){uchar i;for(i=0;i{if(date&0x80)MOSI=1;elseMOSI=0; // byte最高位输出到MOSIdateSCLK=1;if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO 输出1位数据date|=0x01; // 读MISO到byte最低位SCLK=0; // SCK置低}return(date); // 返回读出的一字节}/**********************NRF24L01初始化函数*******************************/void NRF24L01Int(){DDelay(2);//让系统什么都不干CE=0; //待机模式1CSN=1;SCLK=0;IRQ=1;}/*****************SPI读寄存器一字节函数*********************************/uchar NRFReadReg(uchar RegAddr){uchar BackDate;CSN=0;//启动时序NRFSPI(RegAddr);//写寄存器地址BackDate=NRFSPI(0x00);//写入读寄存器指令CSN=1;return(BackDate); //返回状态}/*****************SPI写寄存器一字节函数*********************************/uchar NRFWriteReg(uchar RegAddr,uchar date){uchar BackDate;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入地址NRFSPI(date);//写入值return(BackDate);}/*****************SPI读取RXFIFO寄存器的值********************************/uchar NRFReadRxDate(uchar RegAddr,uchar *RxDate,uchar DateLen) { //寄存器地址//读取数据存放变量//读取数据长度//用于接收uchar BackDate,i;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址for(i=0;i{RxDate[i]=NRFSPI(0);}CSN=1;return(BackDate);}/*****************SPI写入TXFIFO寄存器的值**********************************/uchar NRFWriteTxDate(uchar RegAddr,uchar *TxDate,uchar DateLen) { //寄存器地址//写入数据存放变量//读取数据长度//用于发送uchar BackDate,i;CSN=0;BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址for(i=0;i{NRFSPI(*TxDate++);}CSN=1;return(BackDate);}/*****************NRF设置为发送模式并发送数据******************************/void NRFSetTxMode(uchar *TxDate){//发送模式NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITD H);//写寄存器指令+接收地址使能指令+接收地址+地址宽度NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WI TDH);//为了应答接收设备,接收通道0地址和发送地址相同NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);//写入数据/******下面有关寄存器配置**************/NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0 NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a); // 自动重发延时等待250us+86us,自动重发10次NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40 NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益NRFWriteReg(W_REGISTER+CONFIG,0x0e); // CRC使能,16位CRC 校验,上电CE=1;DDelay(5);//保持10us秒以上}/*****************NRF设置为接收模式并接收数据******************************///主要接收模式void NRFSetRXMode(){CE=0;NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WI TDH); // 接收设备接收通道0使用和发送设备相同的发送地址NRFWriteReg(W_REGISTER+EN_AA,0x01); // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01); // 使能接收通道0 NRFWriteReg(W_REGISTER+RF_CH,0x40); // 选择射频通道0x40 NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH); // 接收通道0选择和发送通道相同有效数据宽度NRFWriteReg(W_REGISTER+RF_SETUP,0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/NRFWriteReg(W_REGISTER+CONFIG,0x0f); // CRC使能,16位CRC 校验,上电,接收模式CE = 1;DDelay(5);//保持10us秒以上}/****************************检测应答信号******************************/uchar CheckACK(){ //用于发射sta=NRFReadReg(R_REGISTER+STATUS); // 返回状态寄存器if(TX_DS||MAX_RT) //发送完毕中断{NRFWriteReg(W_REGISTER+STATUS,0xff); // 清除TX_DS或MAX_RT中断标志CSN=0;NRFSPI(FLUSH_TX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!CSN=1;return(0);}elsereturn(1);}/******************判断是否接收收到数据,接到就从RX取出*********************///用于接收模式uchar NRFRevDate(uchar *RevDate){uchar RevFlags=0;sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器if(RX_DR) // 判断是否接收到数据{CE=0; //SPI使能NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);// 从RXFIFO读取数据RevFlags=1; //读取数据完成标志}NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标return(RevFlags);}void DDelay(uint t){uint x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//////////////////////////////////////////////////////////////////////////////////////////////////////// #include 'delay.h'/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}///////////////////////////////////////////////////////////////////////////////////////////下面是接收的NRF24L01的程序。

NRF24L01的发送与接收程序

NRF24L01的发送与接收程序

N R F24L01的发送与接收程序-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN#include <>#include <>typedef unsigned char uchar;typedef unsigned char uint;SCK = 1;uchar |= MISO; then set SCK low again}return(uchar); .SPI_RW(reg);reg_val = SPI_RW(0); then read registervalueCSN = 1; and write value to it..CSN = 1;SCK = 1;uchar |= MISO; then set SCK low again}return(uchar); .SPI_RW(reg);reg_val = SPI_RW(0); then read registervalueCSN = 1; and write value to it..CSN = 1; // CSN high againreturn(status); // return nRF24L01 status uchar}/*********************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*********************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; // Set CSN low, init SPI tranactionstatus = SPI_RW(reg); // Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr] = SPI_RW(0); //CSN = 1;return(status); // return nRF24L01 status uchar}/**************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/**************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; //SPI使能status = SPI_RW(reg);for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //SPI_RW(*pBuf++);CSN = 1; //关闭SPIreturn(status); //}/********************//*函数:void SetRX_Mode(void)/*功能:数据接收配置/**********************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主接收CE = 1;inerDelay_us(130); //延时不能太短}/**********************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/***********************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){unsigned char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}/****************************/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/****************************/void nRF24L01_TxPacket(unsigned char * tx_buf){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,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}//************************************主函数void main(void){uchar temp =0;init_NRF24L01() ;nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataDelay(6000);P0=0xBF;while(1){nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataLED=0;Delay(10000); //可变SPI_RW_Reg(WRITE_REG+STATUS,0XFF);LED=1;Delay(8000);}}。

nrf24l01无线模块基于51单片机的发送程序

nrf24l01无线模块基于51单片机的发送程序
{
uint status;
CSN = 0; // CSN low, init SPI transaction
status = SPI_RW(reg); // select register
SPI_RW(value); // ..and write value to it..
#define TX_PLOAD_WIDTH 1 // 20 uints TX payload
#define RX_PLOAD_WIDTH 1 // 20 uints TX payload
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
#define RX_PW_P1 0x12 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define EN_RXADDR 0x02 // 可用信道设置
#define SETUP_AW 0x03 // 收发地址宽度设设置
#define RF_CH 0x05 // 工作频率设置
#define RD_RX_PLOAD 0x61 // 读取接收数据指令
#define WR_TX_PLOAD 0xA0 // 写待发数据指令
#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令
#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令
sbit RX_DR =sta^6;

nRF24L01测试程序_51单片机

nRF24L01测试程序_51单片机
#define FIFO_STATUS 0x17 // 'FIFO Status Register' register address //------------------------------------------------------------
// 写一个字节到24L01,同时读出一个字节
SCK = 1; // Set SCK high..
byte |= MISO; // capture current MISO bit
SCK = 0; // ..then set SCK low again
}
return(byte); // return read byte
}
// 向寄存器reg写一个字节,同时返回状态字节
{
CE = 0; // stand by mode
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);// clear RX_DR or TX_DS or MAX_RT interrupt flag
SPI_RW(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status byte
}
// 读出bytes字节的数据
uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)

NRF24L01接收程序_ATMEGA16

NRF24L01接收程序_ATMEGA16

参考网上资源 ------------------------------------------------------------------------------*///----------------------------------------------------------------------------//--------------------------------NRF24L01 接口定义-------------------------------//-----------------------------------------------------------------------------#include<iom16v.h> #define uint unsigned int #define uchar unsigned char //#define NRF24L01_MISO #define Hign_24L01_MISO #define Low_24L01_MISO #define Read_24L01_MISO //#define NRF24L01_MOSI #define Hign_24L01_MOSI #define Low_24L01_MOSI #define Read_24L01_MOSI //#define NRF24L01_SCK #define Hign_24L01_SCK #define Low_24L01_SCK #define Read_24L01_SCK //#define NRF24L01_CSN #define Low_24L01_CSN #define Hign_24L01_CSN //#define NRF24L01_CE #define Hign_24L01_CE #define Low_24L01_CE #define Read_24L01_CE //#define #define #define #define PB4 //输入 0 PORTB |= (1 << PB4) PORTB &= ~(1 << PB4) PINB & (1 << PB4) PB3 //输出 1 PORTB |= (1 << PB3) PORTB &= ~(1 << PB3) PINB & (1 << PB3) PB5 //输出 1 PORTB |= (1 << PB5) PORTB &= ~(1 << PB5) PINB & (1 << PB5); PB2 //输出 1 PORTB &= ~(1 << PB2) PORTB |= (1 << PB2) PB1 //输出 1 PORTB |= (1 << PB1) PORTB &= ~(1 << PB1) PINB & (1 << PB1)

nrf24l01发送接收点对点 汇编程序

nrf24l01发送接收点对点 汇编程序

;延时14s子程序
YANSHI1S MOV R7,#250
YANSHI1S1 MOV R6,#250
YANSHI1S2 NOP
NOP
DJNZ R6,YANSHI1S2
DJNZ R2,DUZT1
SETB P1.7 ;CSN变高,完成一次命令
RET
START MOV P1,#0AFH ;模块待机
DJNZ R6,DL0
DJNZ R7,DL1
RET
;将58开始的单或多字节(字节数在R3中)写入芯片
XIENB MOV R0,#58H
CLR P1.7 ;SCN变低
MOV 58H,#21H ;01寄存器
MOV 59H,#03H ;0,1通道允许自动应答
MOV R3,#02H
LCALL XIENB
MOV P1.5,C ;数据送上MOSI线
SETB P1.4 ;数据移入模块
CLR P1.4
SETB P1.6 ;启动发射
MOV R7,#5
DJNZ R7,$
CLR P1.6
MOV R3,#02H
LCALL XIENB
MOV 58H,#2AH ;0A寄存器(通道0)
MOV 59H,#02H ;配置地址
DJNZ R2,XIE1B1
RET
;读芯片状态字 将芯片状态字读到5FH
DUZT MOV R2,#8
SETB P1.5
MOV R0,#70H
XIEXUN LCALL XIE1B
INC R0
DJNZ R3,XIEXUN
SETB P1.7
MOV 58H,#31H ;11寄存器

NRF24L01、DHT22程序

#include "DELAY.h"#include "stc15f2k61s2.h"#include "intrins.h"void Delay10us() //@11.0592MHz {unsigned char i;_nop_();i = 25;while (--i);}void Delay1000ms() //@11.0592MHz {unsigned char i, j, k;_nop_();_nop_();i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);}void Delay_N1ms(unsigned int i){unsigned int m,n;for(m=i;m>0;m--)for(n=110;n>0;n--);}#include "config.h"#include"DELAY.h"unsigned char bdata sta;sbit RX_DR=sta^6;sbit TX_DS=sta^5;sbit MAX_RT=sta^4;//=======================硬件SPI初始化=============================================================================== ==================void SPI_Init(void) //空闲时钟高电平第二边沿采样第一位为最高位速率CPU_CLK/4 {SPSTAT=0XC0; //清零传输完成标注及写冲突标志SPCTL=SPI_NRF24L01; //NRF24L01 空闲时钟低电平第一边沿采样第一位为最高位速率CPU_CLK/4 未开启SPISPCTL|=SPI_STAT; //开启SPI}unsigned char SPI_WRITE_READ(unsigned dat) //SPI 读写字节{SPDAT =dat; //写入寄存器while(!(SPSTAT & 0X80)); //等待传输完成SPSTAT=0XC0; //清零标志return SPDAT;}void SPI_SPEED(unsigned char num) //设置SPI 速度0~3 0为最大速度{num=num&0x03; //约束范围SPCTL&=~0x03; //清零之前操作SPCTL|= num;SPCTL|=SPI_STAT; //开启SPI}//============================================================================= ======================//发送地址---------------------------------------------------------------------code unsigned char TX_ADDRESS[TX_ADR_WIDTH]={0x00,0x43,0x10,0x10,0x01}; //发送地址一次只能向一个地址发送5字节地址独立发送时必须与//RX_ADDR_P0地址相同//接收通道地址-------------------------------------------------------------------------code unsigned char RX_ADDRESS[5]={0x00,0x43,0x10,0x10,0x01}; //5字节地址完全独立//SPI写寄存器//reg:指定寄存器地址//value:写入的值unsigned char NRF24L01_Write_Reg(unsigned char reg,unsigned char value){unsigned char status;NRF24L01_CSN=0; //使能SPI传输status =SPI_WRITE_READ(reg);//发送寄存器号SPI_WRITE_READ(value); //写入寄存器的值NRF24L01_CSN=1; //禁止SPI传输return(status); //返回状态值}//读取SPI寄存器值//reg:要读的寄存器unsigned char NRF24L01_Read_Reg(unsigned char reg){unsigned char reg_val;NRF24L01_CSN = 0; //使能SPI传输SPI_WRITE_READ(reg); //发送寄存器号reg_val=SPI_WRITE_READ(0);//读取寄存器内容NRF24L01_CSN = 1; //禁止SPI传输return(reg_val); //返回状态值}//在指定位置读出指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值unsigned char NRF24L01_Read_Buf(unsigned char reg,unsigned char *pBuf,unsigned char len){unsigned char status,u8_ctr;NRF24L01_CSN = 0; //使能SPI传输status=SPI_WRITE_READ(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI_WRITE_READ(0XFF);//读出数据NRF24L01_CSN=1; //关闭SPI传输return status; //返回读到的状态值}//在指定位置写指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值unsigned char NRF24L01_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char len){unsigned char status,u8_ctr;NRF24L01_CSN = 0; //使能SPI传输status = SPI_WRITE_READ(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI_WRITE_READ(*pBuf++); //写入数据NRF24L01_CSN = 1; //关闭SPI传输return status; //返回读到的状态值}void NRF24L01_Init(void){SPI_Init(); //初始化SPISPI_SPEED(0); //约束速度NRF24L01最大速度10MNRF24L01_CSN=0; //使能NRF24L01_IRQ=1; //中断IO 输出高电平类似上拉效果NRF24L01_CE=0; //进入待机模式允许设置NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX通道地址写发送通道地址NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX通道地址,主要为了使能ACK 必须与发射地址一致NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01); //使能通道0的自动应答NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01); //使能通道0的接收地址NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);//500us+86us,10次重发NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,0); //设置RF通道为40 发射与接收必须一致NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x07); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);//设置接受数据长度,本次设置位32字节}//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:发送完成状况unsigned char NRF24L01_TxPacket(unsigned char *txbuf){NRF24L01_CE=0; //使能拉低NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0e);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式NRF24L01_CE=1;//启动发送Delay10us();while(NRF24L01_IRQ!=0);//等待发送完成sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(MAX_RT)//达到最大重发次数{NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器return MAX_TX;}if(TX_DS)//发送完成{return TX_OK;}return 0xff;//其他原因发送失败}//mian函数#include "config.h"#include"DELAY.h"#include"DHT22.h"//unsigned char buf_tx[32]={3};unsigned char Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};unsigned char Sensor_Check; //校验和unsigned char Sensor_AnswerFlag; //收到起始标志位unsigned char Sensor_ErrorFlag; //读取传感器错误标志unsigned int Sys_CNT;unsigned int Tmp;sbit Sensor_SDA = P1^1;unsigned char Sensor_flag,num;unsigned char Read_SensorData(void) //读一位数据{unsigned char i,cnt;unsigned char buffer,tmp;buffer = 0;for(i=0;i<8;i++){cnt=0;while(!Sensor_SDA) //检测上次低电平是否结束{if(++cnt >= 300){break;}}//延时Min=26us Max50us 跳过数据"0" 的高电平Delay10us(); //延时30usDelay10us();Delay10us();//判断传感器发送数据位tmp =0;if(Sensor_SDA){tmp = 1;}cnt =0;while(Sensor_SDA) //等待高电平结束{if(++cnt >= 200){break;}}buffer <<=1;buffer |= tmp;}return buffer;}unsigned char Read_Sensor(void) //读全部数据{unsigned char i;//主机拉低(Min=800US Max=20Ms)Sensor_SDA = 0;Delay_N1ms(2); //延时2Ms//释放总线延时(Min=30us Max=50us)Sensor_SDA = 1;Delay10us();//延时30usDelay10us();Delay10us();//主机设为输入判断传感器响应信号Sensor_SDA = 1;Sensor_AnswerFlag = 0; // 传感器响应标志//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(Sensor_SDA ==0){Sensor_AnswerFlag = 1;//收到起始信号Sys_CNT = 0;//判断从机是否发出80us 的低电平响应信号是否结束while((!Sensor_SDA)){if(++Sys_CNT>300) //防止进入死循环{Sensor_ErrorFlag = 1;return 0;}}Sys_CNT = 0;//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while((Sensor_SDA)){if(++Sys_CNT>300) //防止进入死循环{Sensor_ErrorFlag = 1;return 0;}}// 数据接收传感器共发送40位数据// 即5个字节高位先送5个字节分别为湿度高位湿度低位温度高位温度低位校验和// 校验和为:湿度高位+湿度低位+温度高位+温度低位for(i=0;i<5;i++){Sensor_Data[i] = Read_SensorData();}}else{Sensor_AnswerFlag = 0; // 未收到传感器响应}return 1;}{/*STC15W系列单片机的IO口上电默认为高阻状态下面的配置是必须的。

nrf24l01无线通信模块与51单片机工作原理

nrf24l01无线通信模块与51单片机工作原理无线通信技术在现代社会中扮演着重要的角色,其中nrf24l01无线通信模块与51单片机也成为了无线通信的重要组成部分。

本文将探讨nrf24l01无线通信模块与51单片机的工作原理,以及它们之间的配合关系。

一、nrf24l01无线通信模块nrf24l01无线通信模块是一种低功耗的2.4GHz无线收发模块,广泛应用于物联网、无线传感器网络等领域。

其工作原理基于射频通信技术,通过无线信道进行数据的传输。

nrf24l01模块由无线收发器和嵌入式射频微控制器组成,具备高速率、长距离传输和多通道选择等特性。

1. 发射端工作原理nrf24l01发射端主要由收发器、天线和控制电路组成。

当51单片机通过SPI总线与nrf24l01通信时,可将要发送的数据通过控制电路和收发器转换成射频信号,并通过天线发送出去。

发送端的工作原理可简述为以下几个步骤:a. 初始化设置:通过配置寄存器进行初始化设置,包括工作频率、数据传输速率、天线增益等参数。

b. 数据准备与发送:将待发送的数据加载到发送缓冲区中,并通过发送指令启动数据的发送。

c. 发送前导码:在发送数据之前,发射端会先发送一段前导码作为同步信号,以确保接收端正确接收数据。

d. 数据传输与重发机制:发送端将数据以数据包的形式传输,接收端在接收到数据后会进行确认应答,发送端根据应答情况决定是否进行重发。

2. 接收端工作原理nrf24l01接收端与发送端相似,主要由收发器、天线和控制电路组成。

当发送端通过射频信号将数据发送过来时,接收端的工作原理如下:a. 初始化设置:与发送端类似,接收端也需要通过配置寄存器进行初始化设置,以匹配发送端的参数。

b. 接收与解码:接收端在接收到射频信号后,对信号进行解码,并将解码后的数据加载到接收缓冲区。

c. 数据处理与应答:通过与51单片机的交互,将接收到的数据进行处理,并向发送端发送确认应答,确保数据的可靠性。

NRF24L01

GPIO_Init(GPIOB, &GPIO_InitStructure);
/* 配置NRF24L01+ 模式选择 PB1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //NRF24L01 MODE-CE
void MODE_CE(unsigned char a){ //NRF24L01 MODE-CE
if(a==1) GPIO_SetBits(GPIOB, GPIO_Pin_1); //On
else GPIO_ResetBits(GPIOB, GPIO_Pin_1); //Off
* 功 能:通过SPI2 发送一个字节的数据。
* 入口参数:byte: 发送的数据
* 出口参数:接收到的字节
* 说 明:
* 调用方法:SPI**************************************************************************/
void RX_Mode(void);
void TX_Mode(void);
/****************************************************************************
* 名 称:void MODE_CE(unsigned char a)
/* 使能SPI2 */
SPI_Cmd(SPI2, ENABLE);
}
/****************************************************************************
* 名 称:unsigned char SPI2_NRF_SendByte(unsigned char byte)

nrf24l01无线通信模块与51单片机工作原理

nrf24l01无线通信模块与51单片机工作原理
nRF24L01是一款低功耗的2.4GHz无线通信模块,适用于微
控制器和嵌入式系统之间的短距离数据传输。

它可以与51单
片机进行配合使用。

nRF24L01模块包括一个射频发射芯片和一个射频接收芯片。

模块通过SPI接口与51单片机连接。

其工作原理如下:
1. 初始化:首先,51单片机通过SPI接口向nRF24L01模块发送配置命令,包括设置通信频率、通信通道、发射功率等参数。

2. 发送数据:当需要发送数据时,51单片机将待发送的数据
通过SPI接口发送给nRF24L01模块的发送芯片。

发送芯片将
数据转换为无线信号,并通过天线发射出去。

3. 接收数据:当有数据被接收时,nRF24L01模块的接收芯片
会把接收到的数据通过SPI接口传递给51单片机。

单片机再
根据需要对接收到的数据进行处理。

4. 确认和重传:发送芯片在发送数据后会等待接收芯片的确认信号。

如果收到确认信号,发送芯片会继续发送下一个数据包。

如果未收到确认信号,发送芯片会进行多次重传,以确保数据的可靠传输。

5. 通信协议:nRF24L01模块支持多种通信协议,如无线串口、SPI、I2C等。

可以根据需要选择合适的通信协议进行数据传输。

通过上述工作原理,nRF24L01模块可以实现低功耗、短距离的无线数据传输,并与51单片机进行可靠的通信。

它被广泛应用于无线遥控、传感器网络、智能家居等领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档