基于51单片机和NRF24L01的无线温度监控_第1页
基于51单片机和NRF24L01的无线温度监控_第2页
基于51单片机和NRF24L01的无线温度监控_第3页
基于51单片机和NRF24L01的无线温度监控_第4页
基于51单片机和NRF24L01的无线温度监控_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于51单片机和NRF24L01的无线温度监控一丶实现功能:以51单片机为核心实现智能化远程无线温度监控。利用18B20温度传感器获取温度信号,将需要测量的温度信号自动转化为数字信号,通过无线模块NRF24L01一对一传送将数据传送到接收机,最终单片机将信号转换成LCD可以识别的信息显示输出。二丶所需原件:51单片机*2DS18B20*1(温度测量范围为-55~+125^C)12M晶振*222uf电容*25V降压至3.3V降压模块*2NRF24101无线模块*21602液晶显示屏*1按键*3蜂鸣器*1发光二极管*1排阻10K*9脚*2四丶NRF12401JI介绍:1、调制,硬件集成OSI链路层;2、具有自动应答和自动再发射功能;3、片内自动生成报头和CRC校验码;4、数据传输率为l

Mb/s或2Mb/s;5、SPI速率为0

Mb/s~10

Mb/s;6、125个频道与其他系列射频器件相兼容;引脚4

mm×4

mm封装;供电电压为~;封装引脚介绍:CE:使能发射或接收;CSN,SCK,MOSI,:SPI引脚端,微处理器可通过此引脚配置::中断标志位;:电源输入端;VSS:电源地;XC2,XC1:晶体振荡器引脚;:为功率放大器供电,输出为;:天线接口;:参考电流输入;工作模式:工作原理:发射数据时,首先将配置为发射模式:接着把接收节点地址和有效数据按照时序由SPI口写入缓存区,必须在CSN为低时连续写入,而在发射时写入一次即可,然后CE置为高电平并保持至少10μs130μs后发射数据;那么地址应该与接收节点地址一致)功,置高,同时从TX

FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,置高,中数据保留以便在次重发或置高时,使IRQ变低,产生中断,通知MCU。最后发射成功时,若CE为低则进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。接收数据时,首先将配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC中,同时中断标志位RX_DR置高,变低,产生中断,通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则进入空闲模式1。在写寄存器之前一定要进入待机模式或掉电模式。SPI配置:SPI指令设置用于SPI接口的常用命令见下表。当CSN为低时,SPI接口开始等待一条指令,任何一条新指令均由CSN的由高到低的转换开始寄存器:读操作写操作五丶温度监测:温度检测模块软件设计DS18B20的测温原理遵循严格的单总线协议,以确保通信数据的准确性,单片机通过时序来写入和读出DS18B20中的数据,包括初始化、读l、读0,写1、写0等操作。传感器复位后,接收应答信号,跳过读ROM中序列号后,启动温度转换,等待温度转换完毕后,保存数据。如此反复,完成所有操作。六丶无线流程:发射:首先进行初始化操作,初始化包括设置单片机I/O和SPI相关寄存器两部分其可以和nRF24L01通信。通过SPI总线配置射频芯片使其进入正确的工作模式。发射数据时,首先将nRF24L01配置为发射模式。接着把发送端待发射数据的目标地址TX—ADDR和数据TX—PLD写入nRF24L01缓冲区,延时后发射数据,其流程图如图4.2所示接收:待数据的到来。当接收方检测到有效地址和CRC时,就将数据包储存在接收堆栈中,同时状态寄存器中的中断标志位RX—置高,产生中断使引脚变为低电平,以便通知MCU去取数据,其流程图如图4.3所示。七丶软件总体部分:发送部分:发送部分的一个循环的总体思路是这样的先初始化DS18B20,从DS18B20读出温度(DS18B20采用默认的12位精度),将得到的温度值的反码转化成十制,取温度数组的高两位(即整数部分)写入发送数据数组,然后初始化nRF24L01,将温度发送,其流程图如图4.5所示接收部分:接收部分的总体思路是这样的,首先还是初始化,然后进入大循环判断状态寄存器是否有接收中断。如果有就从读入二进制数据,然后将数据转换成十进制在数码管上显示出来,其流程图如图4.6所示。八:电路图:发射机:接收机:九丶程序清单:接收机:#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineREAD_REG0x00//Definereadcommandtoregister#defineWRITE_REG0x20//Definewritecommandtoregister#defineRD_RX_PLOAD0x61//DefineRXpayloadregisteraddress#defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress#defineFLUSH_TX0xE1//DefineflushTXregistercommand#defineFLUSH_RX0xE2//DefineflushRXregistercommand#defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand#defineNOP0xFF//DefineNoOperation,mightbeusedtoreadstatusregister#defineCONFIG0x00//'Config'registeraddress#defineEN_AA0x01//'EnableAutoAcknowledgment'registeraddress#defineEN_RXADDR0x02//'EnabledRXaddresses'registeraddress#defineSETUP_AW0x03//'Setupaddresswidth'registeraddress#defineSETUP_RETR0x04//'SetupAuto.Retrans'registeraddress#defineRF_CH0x05//'RFchannel'registeraddress#defineRF_SETUP0x06//'RFsetup'registeraddress#defineSTATUS0x07//'Status'registeraddress#defineOBSERVE_TX0x08//'ObserveTX'registeraddress#defineCD0x09//'CarrierDetect'registeraddress#defineRX_ADDR_P00x0A//'RXaddresspipe0'registeraddress#defineRX_ADDR_P10x0B//'RXaddresspipe1'registeraddress#defineRX_ADDR_P20x0C//'RXaddresspipe2'registeraddress#defineRX_ADDR_P30x0D//'RXaddresspipe3'registeraddress#defineRX_ADDR_P40x0E//'RXaddresspipe4'registeraddress#defineRX_ADDR_P50x0F//'RXaddresspipe5'registeraddress#defineTX_ADDR0x10//'TXaddress'registeraddress#defineRX_PW_P00x11//'RXpayloadwidth,pipe0'registeraddress#defineRX_PW_P10x12//'RXpayloadwidth,pipe1'registeraddress#defineRX_PW_P20x13//'RXpayloadwidth,pipe2'registeraddress#defineRX_PW_P30x14//'RXpayloadwidth,pipe3'registeraddress#defineRX_PW_P40x15//'RXpayloadwidth,pipe4'registeraddress#defineRX_PW_P50x16//'RXpayloadwidth,pipe5'registeraddress#defineFIFO_STATUS0x17//'FIFOStatusRegister'registeraddress#defineTX_ADR_WIDTH5#defineRX_ADR_WIDTH5#defineTX_PLOAD_WIDTH4#defineTX_PLOAD_WIDTH4floatf_temp;uinttemp;ucharTX_ADDRESS[5]={0x34,0x43,0x19,0x91,0x09};ucharbdatasta;sbitCE=P2^7;sbitCSN=P2^2;sbitMOSI=P2^3;sbitMISO=P2^5;sbitSCK=P2^6;sbitIRQ=P2^4;sbitds=P3^7;sbitled0=P1^0;sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;voidinit_io(void){CE=0;CSN=1;SCK=0;IRQ=1;}ucharSPI_RW(ucharbyte){uchari;for(i=0;i<8;i++){ MOSI=(byte&0x80); byte=(byte<<1); SCK=1; byte|=MISO; SCK=0;}return(byte);}ucharSPI_RW_reg(ucharreg,ucharvalue){ucharstatus;CSN=0;status=SPI_RW(reg);SPI_RW(value);CSN=1;return(status);}ucharSPI_read(ucharreg){ucharreg_val;CSN=0;SPI_RW(reg);reg_val=SPI_RW(0);CSN=1;return(reg_val);}ucharSPI_read_pload(ucharreg,uchar*pBuf,ucharbytes){ucharstatus,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i++) pBuf[i]=SPI_RW(0);CSN=1;return(status);}ucharSPI_write_pload(ucharreg,uchar*pBuf,ucharbytes){ucharstatus,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i++) SPI_RW(pBuf[i]);CSN=1;return(status);}voidTX_mode(uchar*tx_buf){ CE=0;SPI_write_pload(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);SPI_write_pload(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);SPI_write_pload(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);SPI_RW_reg(WRITE_REG+EN_AA,0X01);SPI_RW_reg(WRITE_REG+EN_RXADDR,0X01);SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1F);SPI_RW_reg(WRITE_REG+RF_CH,40);SPI_RW_reg(WRITE_REG+RF_SETUP,0X0F);SPI_RW_reg(WRITE_REG+CONFIG,0X0e);CE=1; //CE置高,使能发送}ucharCheck_ACK(){//while(IRQ//CE=0;sta=SPI_read(STATUS);if(TX_DS||MAX_RT){SPI_RW_reg(WRITE_REG+STATUS,0xff);CSN=0;SPI_RW(FLUSH_TX);CSN=1;return(1);}elsereturn(0);//CE=1;IRQ=1;//if(TX_DS)//return(0x00);//else//return(0xff);}/*ucharCheckACK(){sta=NRFReadReg(READ_REG+STATUS);if(TX_DS||MAX_RT){NRFWriteReg(WRITE_REG+STATUS,0xff);CSN=0;NRFSPI(FLUSH_TX);CSN=1;return(0);}elsereturn(1);}*/voiddelayus(uintz,uintx){uinti,j;for(i=z;i>0;i--) for(j=x;j>0;j--);}voiddreset(void){uinti;//ds=1;//_nop_();ds=0; delayus(7,15);ds=1;i=4;while(i>0)i--;delayus(1,100);}bittempreadbit(void){uinti;bitdat;//ds=1;i++;ds=0;_nop_();ds=1;i++;i++;dat=ds;i=8;while(i>0) i--;return(dat);}uchartempread(void){uchari,j,dat;dat=0;for(i=0;i<8;i++){ j=tempreadbit(); dat=(j<<7)|(dat>>1);}return(dat);}voidtempwritebyte(uchardat){uinti;ucharj;bittestb;for(j=0;j<8;j++){ testb=dat&0x01; dat=dat>>1;if(testb){ ds=0; i++;i++; ds=1; i=8; while(i>0) i--;}else{ ds=0;//i=8;//while(i>0)i--;delayus(1,5); ds=1; i++;i++;}}}voidtempchange(void){dreset();delayus(1,113);tempwritebyte(0xcc);tempwritebyte(0x44);}uintget_temp(){uchara,b;dreset();delayus(1,113);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempread();b=tempread();temp=b;temp<<=8;temp=temp|a;f_temp=temp*0.0625;temp=f_temp*10+0.5;//f_temp=f_temp+0.05;returntemp;}voidmain(){uchartx_buf[4]={0};init_io();while(1){ tempchange(); delayus(1,113); get_temp(); tx_buf[0]=(uchar)(temp/100); tx_buf[1]=(uchar)(((temp-500)%100)/10); tx_buf[2]='.'; tx_buf[3]=(uchar)((temp%100)%10); TX_mode(tx_buf);}}接收机:#include<reg52.h>//#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineREAD_REG0x00//Definereadcommandtoregister#defineWRITE_REG0x20//Definewritecommandtoregister#defineRD_RX_PLOAD0x61//DefineRXpayloadregisteraddress#defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress#defineFLUSH_TX0xE1//DefineflushTXregistercommand#defineFLUSH_RX0xE2//DefineflushRXregistercommand#defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand#defineNOP0xFF//DefineNoOperation,mightbeusedtoreadstatusregister//SPI(nRF24L01)registers(addresses)#defineCONFIG0x00//'Config'registeraddress#defineEN_AA0x01//'EnableAutoAcknowledgment'registeraddress#defineEN_RXADDR0x02//'EnabledRXaddresses'registeraddress#defineSETUP_AW0x03//'Setupaddresswidth'registeraddress#defineSETUP_RETR0x04//'SetupAuto.Retrans'registeraddress#defineRF_CH0x05//'RFchannel'registeraddress#defineRF_SETUP0x06//'RFsetup'registeraddress#defineSTATUS0x07//'Status'registeraddress#defineOBSERVE_TX0x08//'ObserveTX'registeraddress#defineCD0x09//'CarrierDetect'registeraddress#defineRX_ADDR_P00x0A//'RXaddresspipe0'registeraddress#defineRX_ADDR_P10x0B//'RXaddresspipe1'registeraddress#defineRX_ADDR_P20x0C//'RXaddresspipe2'registeraddress#defineRX_ADDR_P30x0D//'RXaddresspipe3'registeraddress#defineRX_ADDR_P40x0E//'RXaddresspipe4'registeraddress#defineRX_ADDR_P50x0F//'RXaddresspipe5'registeraddress#defineTX_ADDR0x10//'TXaddress'registeraddress#defineRX_PW_P00x11//'RXpayloadwidth,pipe0'registeraddress#defineRX_PW_P10x12//'RXpayloadwidth,pipe1'registeraddress#defineRX_PW_P20x13//'RXpayloadwidth,pipe2'registeraddress#defineRX_PW_P30x14//'RXpayloadwidth,pipe3'registeraddress#defineRX_PW_P40x15//'RXpayloadwidth,pipe4'registeraddress#defineRX_PW_P50x16//'RXpayloadwidth,pipe5'registeraddress#defineFIFO_STATUS0x17//'FIFOStatusRegister'registeraddress#defineTX_ADR_WIDTH5#defineRX_ADR_WIDTH5#defineTX_PLOAD_WIDTH4#defineRX_PLOAD_WIDTH4ucharidatarxbuf1[2]={0};//ucharidataaa[20]={0};ucharRX_ADDRES[5]={0x34,0x43,0x19,0x91,0x09};ucharcodetable[]="0123456789";ucharbdatasta;sbitRX_DR=sta^6;sbitTX_DS=sta^5;sbitMAX_RT=sta^4;sbitlcd_rs=P1^0;sbitlcd_rw=P1^1;sbitlcd_en=P1^2;sbitCE=P2^7;sbitCSN=P2^2;sbitMOSI=P2^3;sbitMISO=P2^5;sbitSCK=P2^6;sbitIRQ=P2^4;sbitK1=P3^4;sbitK2=P3^6;sbitK3=P3^5;sbitBJ=P1^3;sbitBEEF=P1^4;ucharMAX=30;ucharMIN=20;uchara;bitflag=0;ucharslnum=0;voiddelayms(uintx){uinti,j;for(i=x;i>0;i--) for(j=113;j>0;j--);}voidinit_io(void){CE=0;CSN=1;SCK=0;IRQ=1;}ucharSPI_RW(ucharbyte){uchari;for(i=0;i<8;i++){ MOSI=(byte&0x80); byte=(byte<<1); SCK=1; byte|=MISO; SCK=0;}return(byte);}ucharSPI_RW_reg(ucharreg,ucharvalue){ucharstatus;CSN=0;status=SPI_RW(reg);SPI_RW(value);CSN=1;return(status);}ucharSPI_read(ucharreg){ucharreg_val;CSN=0;SPI_RW(reg);reg_val=SPI_RW(0);CSN=1;return(reg_val);}ucharSPI_read_pload(ucharreg,uchar*pBuf,ucharbytes){ucharstatus,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i++)pBuf[i]=SPI_RW(0);CSN=1;return(status);}ucharSPI_write_pload(ucharreg,uchar*pBuf,ucharbytes){ucharstatus,i;CSN=0;status=SPI_RW(reg);for(i=0;i<bytes;i++) SPI_RW(pBuf[i]);CSN=1;return(status);}voidRX_mode(){CE=0;SPI_write_pload(WRITE_REG+RX_ADDR_P0,RX_ADDRES,TX_ADR_WIDTH);SPI_RW_reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);SPI_RW_reg(WRITE_REG+EN_AA,0X01);SPI_RW_reg(WRITE_REG+EN_RXADDR,0X01);SPI_RW_reg(WRITE_REG+SETUP_RETR,0X1F);SPI_RW_reg(WRITE_REG+RF_CH,40);SPI_RW_reg(WRITE_REG+RF_SETUP,0X0F);SPI_RW_reg(WRITE_REG+CONFIG,0X0F);CE=1;}ucharRxPacket(uchar*rx_buf){ucharflag=0;sta=SPI_read(STATUS);if(RX_DR){CE=0;SPI_read_pload(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);flag=1;SPI_RW_reg(WRITE_REG+STATUS,0xff);CSN=0;SPI_RW(FLUSH_RX);CSN=1;CE=1;}return(flag);}voidwrite_com(ucharcom){lcd_rs=0;lcd_rw=0;P0=com;lcd_en=1;delayms(1);lcd_en=0;}voidwrite_data(uchardate){lcd_rs=1;lcd_rw=0;P0=date;lcd_en=1;delayms(1);lcd_en=0;}voidlcd_init(){lcd_en=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}voidwrite_str(ucharx,uchary,uchar*s){switch(y){ case0: write_com(0x08+x);break; case1: write_com(0x08+0x40+x);break;}while(*s){write_data(*s);s++;}}voidwrite_maxmin(ucharadd,uchardate){ucharshi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}voidkeyscan(){ucharslnum;if(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论