/******************************无线温度发送***********************/#include <>#include <>#define uint unsigned int#define uchar unsigned char#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节#define RX_ADDR_WITDH 5#define TX_DATA_WITDH 5#define RX_DATA_WITDH 5/******************************************************************// nRF24L01指令格式:*******************************************************************/#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 // 空操作,可以用来读状态寄存器/******************************************************************// 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=P1^5;sbit IRQ=P1^0;sbit CSN=P1^4;sbit MOSI=P1^2;sbit MISO=P1^1;sbit SCK=P1^3;//sbit key=P1^0;sbit LED=P0^0;sbit DQ=P1^6;uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};//uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};uchar RX_Buffer[RX_DATA_WITDH];uchar Temp_Value[]={0x00,0x00};uchar Temp=0;uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK=1;uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//decimal fractionvoid _delay_tus(uint x){while(--x);}void _delay_us(uint x){uint i,j;for (j=0;j0;i--){DQ=0;dat>>=1;DQ=1;_nop_();_nop_();if(DQ)dat|=0x80;_delay_tus(30);DQ=1;}return dat;}/**************************************************//*函数功能:向DS18B20写一字节*//*入口参数:dat(把dat写入DS18B20) *//*出口函数:无 *//**************************************************/void Write_One_Byte(uchar dat){uchar i;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;_delay_tus(5);DQ=1;dat>>=1;}}/**************************************************//*函数功能:从DS18B20读取数据(数据)*//*入口参数:无 *//*出口函数:无 *//**************************************************/void Read_Temp(void){uchar ng=0;if(DS18B20_Init()==1)DS18B20_IS_OK=0;else{Write_One_Byte(0xcc);Write_One_Byte(0x44);DS18B20_Init();Write_One_Byte(0xcc);Write_One_Byte(0xbe);Temp_Value[0]=Read_One_Byte();Temp_Value[1]=Read_One_Byte();DS18B20_IS_OK=1;}if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng=1;}Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);Display_Digit[3]=Temp/100;Display_Digit[2]=Temp%100/10;Display_Digit[1]=Temp%10;}/**************************************************//*函数功能:从DS18B20读取数据转换成ASCII码写入液晶 *//*模块 *//*入口参数:无 *//*出口函数:无 *//**************************************************//*void Display_Temperature(void){uchar ng=0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng=1;}Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);Display_Digit[3]=Temp/100;Display_Digit[2]=Temp%100/10;Display_Digit[1]=Temp%10;}Display_LINE1[13]=0x43;Display_LINE1[12]=0xdf;Display_LINE1[11]=Display_Digit[0]+'0';Display_LINE1[10]='.';Display_LINE1[9]=Display_Digit[1]+'0';Display_LINE1[8]=Display_Digit[2]+'0';Display_LINE1[7]=Display_Digit[3]+'0';if(Display_Digit[3]==0)Display_LINE1[7]=' ';if(Display_Digit[2]==0&&Display_Digit[3]==0)Display_LINE1[8]=' ';if(ng){if(Display_LINE1[8]==' ')Display_LINE1[8]='-';else if(Display_LINE1[7]==' ')Display_LINE1[7]='-';else Display_LINE1[6]='-';}LCD_POS(0);Show_String(Display_LINE0);LCD_POS(0x40);Show_String(Display_LINE1);}void main(void){Init_LCD();Read_Temp();_delay_ms(1000);while(1){Read_Temp();if(DS18B20_IS_OK)Display_Temperature();_delay_ms(200);}}*//*nRF24L01初始化*/void nRF24L01_Init(void){_delay_us(2000);CE=0;//待机模式ⅠCSN=1;SCK=0;IRQ=1;}/*SPI时序函数*/uchar SPI_RW(uchar byte){uchar i;for(i=0;i<8;i++)//一字节8位循环8次写入{if(byte&0x80)//如果数据最高位是1//当访问多字节寄存器时首先要读/写的是最低字节的高位?MOSI=1;//向NRF24L01写1else //否则写0MOSI=0;byte<<=1;//低一位移到最高位SCK=1;//SCK拉高,写入一位数据,同时读取一位数据if(MISO)byte|=0x01;SCK=0;//SCK拉低}return byte;//返回读取一字节 }/*SPI写寄存器一字节函数*//*reg:寄存器地址*//*value:一字节(值)*/uchar SPI_W_Reg(uchar reg,uchar value){uchar status;//返回状态CSN=0;//SPI片选status=SPI_RW(reg);//写入寄存器地址,同时读取状态SPI_RW(value);//写入一字节CSN=1;//return status;//返回状态}/*SPI*/uchar SPI_R_byte(uchar reg){uchar reg_value;CSN=0;//SPI片选SPI_RW(reg);//写入地址reg_value=SPI_RW(0);//读取寄存器的值CSN=1;return reg_value;//返回读取的值}/*SPI读取RXFIFO寄存器数据*//*reg:寄存器地址*//**Dat_Buffer:用来存读取的数据*//*DLen:数据长度*/uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen){uchar status,i;CSN=0;//SPI片选status=SPI_RW(reg);//写入寄存器地址,同时状态for(i=0;i#include <>#define uint unsigned int#define uchar unsigned char#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节#define RX_ADDR_WITDH 5#define TX_DATA_WITDH 5#define RX_DATA_WITDH 5/******************************************************************// nRF24L01指令格式:*******************************************************************/#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 // 空操作,可以用来读状态寄存器/******************************************************************// 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=P1^5; //RX/TX模式选择端sbit IRQ=P1^0; //可屏蔽中断端sbit CSN=P1^4; //SPI片选端//就是SSsbit MOSI=P1^2;//SPI主机输出从机输入端sbit MISO=P1^1;//SPI主机输出从机输出端sbit SCK=P1^3;//SPI时钟端sbit LED=P0^0;sbit key=P2^0;sbit LCD_RS=P2^2;sbit LCD_RW=P2^1;sbit LCD_EN=P2^0;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];uchar code Display_LINE0[]={" FROM NRF24L01:"};uchar Display_LINE1[]={" TEMP: "};void _delay_us(uint x){uint i,j;for (j=0;j