基于NRF24L01+温度无线传输51单片机_第1页
基于NRF24L01+温度无线传输51单片机_第2页
基于NRF24L01+温度无线传输51单片机_第3页
基于NRF24L01+温度无线传输51单片机_第4页
基于NRF24L01+温度无线传输51单片机_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、温度无线传输南阳理工 周渴望 本次所做是基于2.4GNRF24L01+芯片的温度的无线传输,甲机作为发射机有DS18B20温度传感器、LCD1602液晶和NRE24L01+2.4G无线传输芯片。乙机作为接收端有LCD1602液晶和NRE24L01+2.4G无线传输芯片。甲机和乙机在硬件上是完全分开的。工作过程:甲机将温度检测出来并显示在液晶上,然后通过NRF24L01将温度数据发送出去,然后乙机通过本机上的NRF24L01芯片将甲机发射的程序接手过来通过单片机处理显示在本机液晶上面。实物图引脚图程序:注:本次程序基于之前所做“1602LCD液晶显示DS18B20温度”程序。发射端#includ

2、e #include #define uchar unsigned char#define uint unsigned int/* sbit ds18b20=P23; /定义DS18B20的数据引脚 bit crrent=1; /定义DS18B20初始化返回值,表示初始化是否成功sbit BEE=P35; sbit AD=P25;sbit DC=P27;sbit lcdrs=P20; /定义LCD引脚sbit lcdrw=P21;sbit lcden=P22; sbit LED=P10;uint HT=340;uint value=0;uchar code str=Tempe:;uchar c

3、ode str1=DS18B20 Error!;uchar code str2=Please Check;uchar tflag; / 是否正负uchar data disdat6;uchar data setdat4;void writelcdcmd(uchar);void writelcddat(uchar);/*#define TX_ADR_WIDTH 5 / 发射地址的字节个数#define TX_PLOAD_WIDTH 2 /发射字节uchar const TX_ADDRESSTX_ADR_WIDTH=0x34,0x55,0x10,0x10,0x01; uchar rx_bufTX_

4、PLOAD_WIDTH;uchar tx_bufTX_PLOAD_WIDTH;uchar distance_data2;uchar flag;/标志sbit CE=P10;/发射高电平大于10MS 接收高电平 sbit CSN=P11;/低电平ISP使能sbit SCK=P12; /下降沿sbit MOSI=P13;/MCU出sbit MISO=P14;/MCU入sbit IRQ=P15;/中断uchar bdata sta;sbitRX_DR=sta6; /接收数据准备就绪sbitTX_DS=sta5; /已发送数据sbitMAX_RT=sta4;sbit DQ=P23;unsigned c

5、har time; /设置全局变量,专门用于严格延时/*NRF24L01*/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NO

6、P 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define

7、 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_P

8、W_P0 0x11 / 接收频道0接收数据长度#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 RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void init_io(void)CE=0;CSN=1;SCK=0;void delay_ms(unsigned

9、int x) unsigned int i,j; for(i=0;ix;i+) j=108; while(j-); uchar SPI_RW(uchar byte)/发送指令,接受状态 ,返回值为状态值uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) MOSI = (byte&0x80); byte = (byte1); SCK = 1; byte|=MISO; SCK=0; return(byte); uchar SPI_RW_Reg(uchar reg, uchar value)uchar status; CSN = 0; status = S

10、PI_RW(reg); SPI_RW(value); CSN = 1; return(status); uchar SPI_Read(uchar reg)uchar reg_val; CSN = 0; SPI_RW(reg); /写指令 reg_val = SPI_RW(0); /读reg的内容 CSN = 1; return(reg_val); uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,byte_ctr; CSN = 0; status = SPI_RW(reg); for(byte_ctr=0;

11、 byte_ctrbytes; byte_ctr+) SPI_RW(*pBuf+); CSN = 1; return(status); void TX_Mode(void)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, tx_buf, TX_PLOAD_WIDTH); /*

12、写待发数据指令a0*/ 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, 0x1a);/等待 500+86us 自动重发10次 SPI_RW_Reg(WRITE_REG + RF_CH,40); SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /数据传输率1Mbps ,发射功率0dBm SPI_RW_Reg(WRITE_REG + CONFIG,

13、 0x0e); /配置寄存器CE=1;void checkflag() sta=SPI_Read(STATUS);/读状态寄存器 if(MAX_RT) SPI_RW_Reg(FLUSH_TX,0); /*冲洗发送FIFO指令*/ SPI_RW_Reg(WRITE_REG+STATUS,sta);/清除中断/以下是DS18B20的操作程序/*/ void delay_18B20(unsigned int i)/延时1微秒 while(i-); set18b20()/*ds1820复位*/ EA=0;ds18b20= 1; /复位delay_18B20(4); /延时ds18b20 = 0; /拉

14、低delay_18B20(100); /精确延时大于480usds18b20 = 1; /拉高delay_18B20(10);crrent=ds18b20;while(!ds18b20);EA=1;return(crrent); /返回值 uchar read18b20() /*读数据*/ uchar i; uchar dat = 0; EA=0;for(i=0x01; i!=0; i0; i-) ds18b20 = 0; _nop_(); _nop_(); ds18b20=wdata&0x01; delay_18B20(10); ds18b20 = 1; wdata=1; EA=1;/*LC

15、D1602*void delayms(uint z) /不精确延时uchar x;uint y;for(x=z;x0;x-)for(y=125;y0;y-); void LCD_BUSY() /LCD忙检测uchar sta; P0=0xff;lcdrs=0;lcdrw=1; dolcden=1;sta=P0;lcden=0;while(sta & 0x80);void writelcdcmd(uchar cmd) /LCD写命令LCD_BUSY();delayms(1);lcdrs=0;lcdrw=0;lcden=0;P0=cmd;delayms(1);lcden=1;delayms(1);

16、lcden=0;void writelcddat(uchar dat) /LCD写数据LCD_BUSY();delayms(1);lcdrs=1;lcdrw=0;lcden=0;P0=dat;delayms(1);lcden=1;delayms(1);lcden=0;void inilcd() /LCD初始化 delayms(15);writelcdcmd(0x38);delayms(5);writelcdcmd(0x0c);delayms(5);writelcdcmd(0x06);delayms(5);writelcdcmd(0x01);delayms(5);void play(unsign

17、ed char *p)/显示/while(*p!=0)writelcddat(*p);p+;delayms(1);/*void readtemperature(void) uchar TL; /储存暂存器的温度低位 uchar TH; /储存暂存器的温度高位 set18b20(); write18b20(0xcc); write18b20(0x44); set18b20(); write18b20(0xcc); write18b20(0xbe); TL=read18b20(); /先读的是温度值低位TH=read18b20(); /接着读的是温度值高位 distance_data0=TH ;

18、/测量结果的高8位 distance_data1=TL; /放入16位的高8位 value=TH; value=8; value=value|TL; /*温度显示*/void disp18b20() /液晶显示温度 uint i,t; if(valueHT)&(crrent=0) /这里设置温度上限值,来控制继电器,需加crrent=0,不然DS18B20在拔掉后会出错 while(t-) while(i-) /这里是继电器导通为3分钟左右,中间不读取温度 set18b20(); LED=0; if(valueHT)&(crrent=0) LED=0; /*改变设定温度*/DC=1;AD=1;

19、if(AD=0) /设定温度加HT+;while(!AD);if(DC=0) /设定温度减HT-;while(!DC); /*/ /*读取上限值温度*/ setdat0=HT/100+0; /十位 setdat1=HT%100/10+0x30;/个位 setdat2=HT%10+0; /*/ /*读取当前温度*/ disdat0=value/1000+0x30;/百位数 disdat1=value%1000/100+0x30;/十位数 disdat2=value%100/10+0x30;/个位数 disdat3=value%10+0x30;/小数位 if(tflag=0) disdat4=0x

20、20; else disdat4=0x2d; /当最高位为0时,最高位不显示 if(disdat0=0x30) disdat0=0x20;if(disdat1=0x30)disdat1=0x20; /*显示当前温度*/ writelcdcmd(0x86); writelcddat(disdat4); /符号位 writelcdcmd(0x87); writelcddat(disdat0); writelcdcmd(0x88); writelcddat(disdat1); writelcdcmd(0x89); writelcddat(disdat2); writelcdcmd(0x8a); wr

21、itelcddat(0x2e); /小数点 writelcdcmd(0x8b); writelcddat(disdat3); writelcdcmd(0x8d); /单位 writelcddat(0xdf); writelcdcmd(0x8e); writelcddat(C); /*显示设定温度温度*/ writelcdcmd(0xc0); writelcddat(H); writelcdcmd(0xc1); writelcddat(T); writelcdcmd(0xc2); writelcddat(:); writelcdcmd(0xc3); writelcddat(setdat0); w

22、ritelcdcmd(0xc4); writelcddat(setdat1); writelcdcmd(0xc5); writelcddat(.); writelcdcmd(0xc6); writelcddat(setdat2); /*主函数*void main(void)uchar xx;init_io();inilcd();while(1) readtemperature();/实时更新温度 writelcdcmd(0x01); /每次数据变化清屏显示 do readtemperature(); checkflag();for(xx=0;xx2;xx+)tx_bufxx= distance

23、_dataxx;/发数据之前必须把要发送的数据装入它TX_Mode();/必须启动发送模块delay_ms(5); writelcdcmd(0x80); play(str); disp18b20(); while(!crrent); /检测DS18B20存在,显示温度 do readtemperature();writelcdcmd(0x80); play(str1); writelcdcmd(0x80+0x40); play(str2);BEE=1;while(crrent);接收端:#include #include #define uchar unsigned char#define u

24、int unsigned intsbit lcdrs=P20; /定义LCD引脚sbit lcdrw=P21;sbit lcden=P22;uint value=0;uchar code str=Tempe:;uchar code str1=No signal;uchar code str2=Please Check;uchar tflag; / 是否正负uchar data disdat6;uchar data setdat4;void writelcdcmd(uchar);void writelcddat(uchar); /*uchar tm2;#define TX_ADR_WIDTH 5

25、 #define TX_PLOAD_WIDTH 2 uchar const TX_ADDRESSTX_ADR_WIDTH=0x34,0x55,0x10,0x10,0x01; uchar rx_bufTX_PLOAD_WIDTH;uchar tx_bufTX_PLOAD_WIDTH;uchar flag;/标志int cout;sbit CE=P10;/发射高电平大于10MS 接收高电平 sbit CSN=P11;/低电平ISP使能sbit SCK=P12; /下降沿sbit MOSI=P13;/MCU出sbit MISO=P14;/MCU入sbit IRQ=P15;/中断uchar bdata

26、 sta;sbitRX_DR=sta6; /接收数据准备就绪sbitTX_DS=sta5; /已发送数据sbitMAX_RT=sta4;sbit RS=P20; /寄存器选择位,将RS位定义为P2.0引脚sbit RW=P21; /读写选择位,将RW位定义为P2.1引脚sbit E=P22; /使能信号位,将E位定义为P2.2引脚sbit BF=P07; /忙碌标志位,将BF位定义为P0.7引脚/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61

27、 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 / 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置

28、#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 0

29、x0C / 频道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 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX

30、_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void init_io(void)CE=0;CSN=1;SCK=0; void delay_ms(unsigned int x) unsigned int i,j; for(i=0;ix;i+) j=108; while(j-); uchar SPI_RW(uchar byte)uchar bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) MOSI =

31、(byte&0x80); byte = (byte1); SCK = 1; byte|=MISO; SCK=0; return(byte); uchar SPI_RW_Reg(uchar reg, uchar value)uchar status; CSN = 0; status = SPI_RW(reg); SPI_RW(value); CSN = 1; return(status); uchar SPI_Read(uchar reg)uchar reg_val; CSN = 0; SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1; return(reg_v

32、al); uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,byte_ctr; CSN = 0; status = SPI_RW(reg); for(byte_ctr=0;byte_ctrbytes;byte_ctr+) pBufbyte_ctr = SPI_RW(0); CSN = 1; return(status); uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)uchar status,byte_ctr; CSN = 0; status

33、= SPI_RW(reg); for(byte_ctr=0; byte_ctr0;x-)for(y=125;y0;y-); void LCD_BUSY() /LCD忙检测uchar sta; P0=0xff;lcdrs=0;lcdrw=1; dolcden=1;sta=P0;lcden=0;while(sta & 0x80);void writelcdcmd(uchar cmd) /LCD写命令LCD_BUSY();delayms(1);lcdrs=0;lcdrw=0;lcden=0;P0=cmd;delayms(1);lcden=1;delayms(1);lcden=0;void write

34、lcddat(uchar dat) /LCD写数据LCD_BUSY();delayms(1);lcdrs=1;lcdrw=0;lcden=0;P0=dat;delayms(1);lcden=1;delayms(1);lcden=0;void inilcd() /LCD初始化 delayms(15);writelcdcmd(0x38);delayms(5);writelcdcmd(0x0c);delayms(5);writelcdcmd(0x06);delayms(5);writelcdcmd(0x01);delayms(5);void play(unsigned char *p)/显示/while(*p!=0)writelcddat(*p);p+;delayms(1);void xianshi(void) uchar TL; /储存暂存器的温度低位 uchar TH; /储存暂存器的温度高位 TH=tm0 ; TL=tm1; /这样得到的是温度小数部分的第一位数字(保留1位小数) value=TH; value=8; value=value|T

温馨提示

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

评论

0/150

提交评论