无线广告屏——无线模块

NRF24L01无线模块原理图:

无线NRF24L01例程:

NRF24L01发送模块:

Allhead.h

#ifndef _ALLHEAD_H_
#define _ALLHEAD_H_
/******************************************/
#include"pubile.h"
#include"Delay.h"
#include"NRF24L01.h"
#include"DS18N02.h"
/*****************************************/
#endif

Delay.c

#include"reg52.h"
#include"Allhead.h"
/***************************延时函数****************/
void Delay(unint t)
{unintx,y;for(x=t;x>0;x--)for(y=110;y>0;y--);
}
/**********************************************DS18B20专用延时子函数
**********************************************/
void DDelay(unint t)
{ unint n;n=0; while(n<t) {n++;}
}

Delay.h

#ifndef _DELAY_H_
#define _DELAY_H_
/*****************************************/
void Delay(unint t);
void DDelay(unint t);
/*******************************************/
#endif

DS18B20.c

#include"reg52.h"
#include"allhead.h"
sbit DQ=P1^0;//数据端
unint tempL,tempH;
/********************************************************* DS18B20复位函数
**********************************************************/
void Reset()
{   DQ=1;DDelay(8); DQ=0; DDelay(85); DQ=1;DDelay(14);}
/*********************************************************** DS18B20写一个字节函数
*********************************************************/
void WriteChar(unchar dat)
{ unint i; for(i=8;i>0;i--) { DQ=0;   DQ=dat&0x01;DDelay(5);DQ=1;dat>>=1;} DDelay(4);
}
/**************************************************** DS18B20读一个字节函数
****************************************************/
unint ReadChar()
{            unchar i,dat=0;for (i=8;i>0;i--) { DQ=1; DDelay(1);DQ=0;  dat>>=1;DQ=1; if(DQ)dat=dat|0x80;DDelay(4);}
return(dat);
}
/*************************************************** DS18B20读温度程序
****************************************************/
unint ReadTemperature()
{ unint temperature;Reset(); WriteChar(0xcc); WriteChar(0x44); DDelay(125); Reset();WriteChar(0xcc);WriteChar(0xbe);tempL=ReadChar(); tempH=ReadChar();temperature=((tempH*256)+tempL)*0.0625*10;   DDelay(200);return(temperature); //返回的是0123格式
}

DS18B20.h

#ifndef _DS18B20_H_
#define _DS18B20_H_
/*****************************************/
extern void Reset();
extern void WriteChar(unchar dat);
extern unint ReadChar();
extern unint ReadTemperature();
/*****************************************/
#endif

NRF14L01.c

#include"reg52.h"
#include"Allhead.h"
sbit CE=P2^0;  //RX/TX模式选择端
sbit IRQ=P2^5; //可屏蔽中断端
sbit CSN=P2^3; //SPI片选端//就是SS
sbit MOSI=P2^4;    //SPI主机输出从机输入端
sbit MISO=P2^2;    //SPI主机输出从机输出端
sbit SCLK=P2^1;    //SPI时钟端
unchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址
/*****************状态标志*****************************************/
unchar bdata sta;   //状态标志
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;
/*****************SPI时序函数******************************************/
unchar NRFSPI(unchar date)
{unchar i;for(i=0;i<8;i++)          // 循环8次{if(date&0x80)MOSI=1;elseMOSI=0;   // byte最高位输出到MOSIdate<<=1;             // 低一位移位到最高位SCLK=1; if(MISO)               // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01;        // 读MISO到byte最低位SCLK=0;                // SCK置低}return(date);              // 返回读出的一字节
}
/**********************NRF24L01初始化函数*******************************/
void NRF24L01Int()
{Delay(2);//让系统什么都不干CE=0; //待机模式1   CSN=1;  SCLK=0;IRQ=1;
}
/*****************SPI读寄存器一字节函数*********************************/
unchar NRFReadReg(unchar RegAddr)
{unchar BackDate;CSN=0;//启动时序NRFSPI(RegAddr);//写寄存器地址BackDate=NRFSPI(0x00);//写入读寄存器指令  CSN=1;return(BackDate); //返回状态
}
/*****************SPI写寄存器一字节函数*********************************/
unchar NRFWriteReg(unchar RegAddr,unchar date)
{unchar BackDate;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入地址NRFSPI(date);//写入值CSN=1;return(BackDate);
}
/*****************SPI读取RXFIFO寄存器的值********************************/
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen)
{  //寄存器地址//读取数据存放变量//读取数据长度//用于接收unchar BackDate,i;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址for(i=0;i<DateLen;i++) //读取数据{RxDate[i]=NRFSPI(0);} CSN=1;return(BackDate);
}
/*****************SPI写入TXFIFO寄存器的值**********************************/
unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen)
{ //寄存器地址//写入数据存放变量//读取数据长度//用于发送unchar BackDate,i;CSN=0;BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址for(i=0;i<DateLen;i++)//写入数据{NRFSPI(*TxDate++);}   CSN=1;return(BackDate);
}
/*****************NRF设置为发送模式并发送数据******************************/
void NRFSetTxMode(unchar *TxDate)
{//发送模式CE=0; NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+接收地址使能指令+接收地址+地址宽度NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);//写入数据 /******下面有关寄存器配置**************/NRFWriteReg(W_REGISTER+EN_AA,0x01);       // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);   // 使能接收通道0NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);  // 自动重发延时等待250us+86us,自动重发10次NRFWriteReg(W_REGISTER+RF_CH,0x40);         // 选择射频通道0x40NRFWriteReg(W_REGISTER+RF_SETUP,0x07);    // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益NRFWriteReg(W_REGISTER+CONFIG,0x0e);      // CRC使能,16位CRC校验,上电  CE=1;Delay(5);//保持10us秒以上
}
/*****************NRF设置为接收模式并接收数据******************************/
//主要接收模式
void NRFSetRXMode()
{CE=0;  NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);  // 接收设备接收通道0使用和发送设备相同的发送地址NRFWriteReg(W_REGISTER+EN_AA,0x01);               // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);           // 使能接收通道0NRFWriteReg(W_REGISTER+RF_CH,0x40);                 // 选择射频通道0x40NRFWriteReg(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;Delay(5);//保持10us秒以上
}
/****************************检测应答信号******************************/
unchar 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取出*********************/
//用于接收模式
unchar NRFRevDate(unchar *RevDate)
{unchar 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);
}

NRF24L01.h

#ifndef _NRF24L01_H_
#define _NRF24L01_H_
/*******************************************************/
#define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节
#define TX_DATA_WITDH 4//发送数据宽度1个字节
#define RX_DATA_WITDH 4//接收数据宽度1个字节
/*******************命令寄存器***************************/
#define  R_REGISTER      0x00//读取配置寄存器
#define  W_REGISTER      0x20//写配置寄存器
#define  R_RX_PAYLOAD    0x61//读取RX有效数据
#define  W_TX_PAYLOAD    0xa0//写TX有效数据
#define  FLUSH_TX        0xe1//清除TXFIFO寄存器
#define  FLUSH_RX        0xe2//清除RXFIFO寄存器
#define  REUSE_TX_PL     0xe3//重新使用上一包有效数据
#define  NOP             0xff//空操作
/******************寄存器地址****************************/
#define  CONFIG          0x00//配置寄存器
#define  EN_AA           0x01//使能自动应答
#define  EN_RXADDR       0x02//接收通道使能0-5个通道
#define  SETUP_AW        0x03//设置数据通道地址宽度3-5
#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//P0通道数据宽度设置
#define  RX_PW_P1        0x12//P1通道数据宽度设置
#define  RX_PW_P2        0x13//P2通道数据宽度设置
#define  RX_PW_P3        0x14//P3通道数据宽度设置
#define  RX_PW_P4        0x15//P4通道数据宽度设置
#define  RX_PW_P5        0x16//P5通道数据宽度设置
#define  FIFO_STATUS     0x17//FIFO状态寄存器
/*******************相关函数声明**************************/
unchar NRFACK();
unchar NRFSPI(unchar date);
unchar NRFReadReg(unchar RegAddr);
unchar NRFWriteReg(unchar RegAddr,unchar date);
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen);
unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen);
unchar NRFRevDate(unchar *RevDate);
void NRFSetTxMode(unchar *TxDate);
void NRF24L01Int();
void NRFSetRXMode();
unchar CheckACK();
extern  unchar bdata sta;
/*********************************************************/
#endif

public.h

#ifndef _PUBLIC_H_
#define _PUBLIC_H_
/****************************************/
#define unchar unsigned char
#define unint unsigned int
/*****************************************/
#endif

send.c

#include"reg52.h"
#include"Allhead.h"
/*********************主函数***************************/
sbit Key=P1^0;
void main()
{unint ReadTempDate;//读取温度char TxDate[4];NRF24L01Int();while(1){ReadTempDate=169;TxDate[0]=ReadTempDate/100+'0';TxDate[1]=ReadTempDate%100/10+'0';TxDate[2]='.';TxDate[3]=ReadTempDate%100%10+'0';  NRFSetTxMode(TxDate);//发送温度while(CheckACK());   //检测是否发送完毕}}


NRF24L01接收模块:

Allhead.h

#ifndef _ALLHEAD_H_
#define _ALLHEAD_H_
/*************************************************/
#include"pubile.h"
#include"DELAY.h"
//#include"LCD1602.h"
#include"NRF24L01.h"
#include"MAX232.h"
#include"LCD12864.h"
/*************************************************/
#endif

CODE.h

// ------------------  汉字字模的数据结构定义 ------------------------ //
typedef struct typFNT_GB12                 // 汉字字模数据结构
{signed char Index[2];               // 汉字内码索引char Msk[24];                       // 点阵码数据
};/
// 汉字字模表                                                          //
// 汉字库: 宋体12.dot 纵向取模下高位,数据排列:从左到右从上到下         //
/
struct typFNT_GB12 code GB_12[] =          // 数据表
{
"当", 0x00,0x20,0xA4,0xA8,0xA0,0xBF,0xA0,0xB0,0xA8,0xA6,0xF0,0x20,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0F,0x00,"前", 0x04,0xF4,0x54,0x55,0x56,0xF4,0x04,0xF6,0x05,0x04,0xF6,0x04,0x00,0x0F,0x01,0x01,0x09,0x0F,0x00,0x03,0x04,0x08,0x07,0x00,"温", 0x88,0xD1,0x22,0x80,0xBF,0x95,0x95,0x95,0x95,0xBF,0x80,0x00,0x00,0x0F,0x08,0x0F,0x08,0x0F,0x08,0x08,0x0F,0x08,0x0F,0x08,"度", 0x00,0x00,0xFE,0x0A,0x8A,0xBE,0xAB,0xAA,0xBE,0x0A,0x0A,0x00,0x0C,0x02,0x09,0x08,0x04,0x05,0x02,0x05,0x04,0x08,0x08,0x08
};// 汉字表:
// 当前温度:
// ------------------  ASCII字模的数据表 ------------------------ //
// 码表从0x20~0x7e                                                //
// 字库: E:\单片机专用\lcd汉字取模软件\Asc8X16E.dat 纵向取模下高位//
// -------------------------------------------------------------- //
unsigned char code nAsciiDot816[][16]=              // ASCII
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // - -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xFC,0xFC,0x38,0x00,0x00,  // -!-0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00,0x00,0x0E,0x1E,0x00,0x00,0x1E,0x0E,0x00,  // -"-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xF8,0xF8,0x20,0xF8,0xF8,0x20,0x00,  // -#-0x02,0x0F,0x0F,0x02,0x0F,0x0F,0x02,0x00,0x38,0x7C,0x44,0x47,0x47,0xCC,0x98,0x00,  // -$-0x03,0x06,0x04,0x1C,0x1C,0x07,0x03,0x00,0x30,0x30,0x00,0x80,0xC0,0x60,0x30,0x00,  // -%-0x0C,0x06,0x03,0x01,0x00,0x0C,0x0C,0x00,0x80,0xD8,0x7C,0xE4,0xBC,0xD8,0x40,0x00,  // -&-0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,0x00,0x10,0x1E,0x0E,0x00,0x00,0x00,0x00,  // -'-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0x0C,0x04,0x00,0x00,  // -(-0x00,0x00,0x03,0x07,0x0C,0x08,0x00,0x00,0x00,0x00,0x04,0x0C,0xF8,0xF0,0x00,0x00,  // -)-0x00,0x00,0x08,0x0C,0x07,0x03,0x00,0x00,0x80,0xA0,0xE0,0xC0,0xC0,0xE0,0xA0,0x80,  // -*-0x00,0x02,0x03,0x01,0x01,0x03,0x02,0x00,0x00,0x80,0x80,0xE0,0xE0,0x80,0x80,0x00,  // -+-0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -,-0x00,0x00,0x10,0x1E,0x0E,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,  // ---0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -.-0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x00,  // -/-0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00,  // -0-0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,  // -1-0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00,  // -2-0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00,  // -3-0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00,  // -4-0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00,  // -5-0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00,  // -6-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00,  // -7-0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00,  // -8-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00,  // -9-0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,  // -:-0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,  // -;-0x00,0x00,0x08,0x0E,0x06,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x18,0x08,0x00,  // -<-0x00,0x00,0x01,0x03,0x06,0x0C,0x08,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,  // -=-0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x08,0x18,0x30,0x60,0xC0,0x80,0x00,  // ->-0x00,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x18,0x1C,0x04,0xC4,0xE4,0x3C,0x18,0x00,  // -?-0x00,0x00,0x00,0x0D,0x0D,0x00,0x00,0x00,0xF0,0xF8,0x08,0xC8,0xC8,0xF8,0xF0,0x00,  // -@-0x07,0x0F,0x08,0x0B,0x0B,0x0B,0x01,0x00,0xE0,0xF0,0x98,0x8C,0x98,0xF0,0xE0,0x00,  // -A-0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,0x04,0xFC,0xFC,0x44,0x44,0xFC,0xB8,0x00,  // -B-0x08,0x0F,0x0F,0x08,0x08,0x0F,0x07,0x00,0xF0,0xF8,0x0C,0x04,0x04,0x0C,0x18,0x00,  // -C-0x03,0x07,0x0C,0x08,0x08,0x0C,0x06,0x00,0x04,0xFC,0xFC,0x04,0x0C,0xF8,0xF0,0x00,  // -D-0x08,0x0F,0x0F,0x08,0x0C,0x07,0x03,0x00,0x04,0xFC,0xFC,0x44,0xE4,0x0C,0x1C,0x00,  // -E-0x08,0x0F,0x0F,0x08,0x08,0x0C,0x0E,0x00,0x04,0xFC,0xFC,0x44,0xE4,0x0C,0x1C,0x00,  // -F-0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,0xF0,0xF8,0x0C,0x84,0x84,0x8C,0x98,0x00,  // -G-0x03,0x07,0x0C,0x08,0x08,0x07,0x0F,0x00,0xFC,0xFC,0x40,0x40,0x40,0xFC,0xFC,0x00,  // -H-0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x04,0xFC,0xFC,0x04,0x00,0x00,  // -I-0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFC,0x04,0x00,  // -J-0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,0x00,0x04,0xFC,0xFC,0xC0,0xF0,0x3C,0x0C,0x00,  // -K-0x08,0x0F,0x0F,0x00,0x01,0x0F,0x0E,0x00,0x04,0xFC,0xFC,0x04,0x00,0x00,0x00,0x00,  // -L-0x08,0x0F,0x0F,0x08,0x08,0x0C,0x0E,0x00,0xFC,0xFC,0x38,0x70,0x38,0xFC,0xFC,0x00,  // -M-0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,0xFC,0xFC,0x38,0x70,0xE0,0xFC,0xFC,0x00,  // -N-0x0F,0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,0xF0,0xF8,0x0C,0x04,0x0C,0xF8,0xF0,0x00,  // -O-0x03,0x07,0x0C,0x08,0x0C,0x07,0x03,0x00,0x04,0xFC,0xFC,0x44,0x44,0x7C,0x38,0x00,  // -P-0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,0xF8,0xFC,0x04,0x04,0x04,0xFC,0xF8,0x00,  // -Q-0x07,0x0F,0x08,0x0E,0x3C,0x3F,0x27,0x00,0x04,0xFC,0xFC,0x44,0xC4,0xFC,0x38,0x00,  // -R-0x08,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,0x18,0x3C,0x64,0x44,0xC4,0x9C,0x18,0x00,  // -S-0x06,0x0E,0x08,0x08,0x08,0x0F,0x07,0x00,0x00,0x1C,0x0C,0xFC,0xFC,0x0C,0x1C,0x00,  // -T-0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0xFC,0xFC,0x00,0x00,0x00,0xFC,0xFC,0x00,  // -U-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0xFC,0xFC,0x00,0x00,0x00,0xFC,0xFC,0x00,  // -V-0x01,0x03,0x06,0x0C,0x06,0x03,0x01,0x00,0xFC,0xFC,0x00,0x80,0x00,0xFC,0xFC,0x00,  // -W-0x03,0x0F,0x0E,0x03,0x0E,0x0F,0x03,0x00,0x0C,0x3C,0xF0,0xC0,0xF0,0x3C,0x0C,0x00,  // -X-0x0C,0x0F,0x03,0x00,0x03,0x0F,0x0C,0x00,0x00,0x3C,0x7C,0xC0,0xC0,0x7C,0x3C,0x00,  // -Y-0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x1C,0x0C,0x84,0xC4,0x64,0x3C,0x1C,0x00,  // -Z-0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0E,0x00,0x00,0x00,0xFC,0xFC,0x04,0x04,0x00,0x00,  // -[-0x00,0x00,0x0F,0x0F,0x08,0x08,0x00,0x00,0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,  // -\-0x00,0x00,0x00,0x01,0x03,0x07,0x0E,0x00,0x00,0x00,0x04,0x04,0xFC,0xFC,0x00,0x00,  // -]-0x00,0x00,0x08,0x08,0x0F,0x0F,0x00,0x00,0x08,0x0C,0x06,0x03,0x06,0x0C,0x08,0x00,  // -^-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -_-0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x03,0x07,0x04,0x00,0x00,0x00,  // -`-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0xA0,0xE0,0xC0,0x00,0x00,  // -a-0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,0x04,0xFC,0xFC,0x20,0x60,0xC0,0x80,0x00,  // -b-0x08,0x0F,0x07,0x08,0x08,0x0F,0x07,0x00,0xC0,0xE0,0x20,0x20,0x20,0x60,0x40,0x00,  // -c-0x07,0x0F,0x08,0x08,0x08,0x0C,0x04,0x00,0x80,0xC0,0x60,0x24,0xFC,0xFC,0x00,0x00,  // -d-0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,0xC0,0xE0,0xA0,0xA0,0xA0,0xE0,0xC0,0x00,  // -e-0x07,0x0F,0x08,0x08,0x08,0x0C,0x04,0x00,0x40,0xF8,0xFC,0x44,0x0C,0x18,0x00,0x00,  // -f-0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,0xC0,0xE0,0x20,0x20,0xC0,0xE0,0x20,0x00,  // -g-0x27,0x6F,0x48,0x48,0x7F,0x3F,0x00,0x00,0x04,0xFC,0xFC,0x40,0x20,0xE0,0xC0,0x00,  // -h-0x08,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x20,0xEC,0xEC,0x00,0x00,0x00,  // -i-0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xEC,0xEC,0x00,  // -j-0x00,0x30,0x70,0x40,0x40,0x7F,0x3F,0x00,0x04,0xFC,0xFC,0x80,0xC0,0x60,0x20,0x00,  // -k-0x08,0x0F,0x0F,0x01,0x03,0x0E,0x0C,0x00,0x00,0x00,0x04,0xFC,0xFC,0x00,0x00,0x00,  // -l-0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0xE0,0xE0,0x60,0xC0,0x60,0xE0,0xC0,0x00,  // -m-0x0F,0x0F,0x00,0x0F,0x00,0x0F,0x0F,0x00,0x20,0xE0,0xC0,0x20,0x20,0xE0,0xC0,0x00,  // -n-0x00,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,0xC0,0xE0,0x20,0x20,0x20,0xE0,0xC0,0x00,  // -o-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x20,0xE0,0xC0,0x20,0x20,0xE0,0xC0,0x00,  // -p-0x40,0x7F,0x7F,0x48,0x08,0x0F,0x07,0x00,0xC0,0xE0,0x20,0x20,0xC0,0xE0,0x20,0x00,  // -q-0x07,0x0F,0x08,0x48,0x7F,0x7F,0x40,0x00,0x20,0xE0,0xC0,0x60,0x20,0x60,0xC0,0x00,  // -r-0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,0x00,0x40,0xE0,0xA0,0x20,0x20,0x60,0x40,0x00,  // -s-0x04,0x0C,0x09,0x09,0x0B,0x0E,0x04,0x00,0x20,0x20,0xF8,0xFC,0x20,0x20,0x00,0x00,  // -t-0x00,0x00,0x07,0x0F,0x08,0x0C,0x04,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,  // -u-0x07,0x0F,0x08,0x08,0x07,0x0F,0x08,0x00,0x00,0xE0,0xE0,0x00,0x00,0xE0,0xE0,0x00,  // -v-0x00,0x03,0x07,0x0C,0x0C,0x07,0x03,0x00,0xE0,0xE0,0x00,0x00,0x00,0xE0,0xE0,0x00,  // -w-0x07,0x0F,0x0C,0x07,0x0C,0x0F,0x07,0x00,0x20,0x60,0xC0,0x80,0xC0,0x60,0x20,0x00,  // -x-0x08,0x0C,0x07,0x03,0x07,0x0C,0x08,0x00,0xE0,0xE0,0x00,0x00,0x00,0xE0,0xE0,0x00,  // -y-0x47,0x4F,0x48,0x48,0x68,0x3F,0x1F,0x00,0x60,0x60,0x20,0xA0,0xE0,0x60,0x20,0x00,  // -z-0x0C,0x0E,0x0B,0x09,0x08,0x0C,0x0C,0x00,0x00,0x40,0x40,0xF8,0xBC,0x04,0x04,0x00,  // -{-0x00,0x00,0x00,0x07,0x0F,0x08,0x08,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x00,0x00,  // -|-0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0x04,0x04,0xBC,0xF8,0x40,0x40,0x00,  // -}-0x00,0x08,0x08,0x0F,0x07,0x00,0x00,0x00,0x08,0x0C,0x04,0x0C,0x08,0x0C,0x04,0x00,  // -~-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x60,0xC0,0x80,0x00,  // --0x07,0x07,0x04,0x04,0x04,0x07,0x07,0x00,
};

DELAY.c

#include"reg52.h"
#include"Allhead.h"
/***************************延时函数*********************/
void LCDDelay(unchar t)
{unchar x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);
}
/**********************延时函数**************************/
void NRFDelay(unint t)
{unint x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);
}

DELAY.h

#ifndef _DELAY_H_
#define _DELAY_H_
/*******************************************/
extern void LCDDelay(unchar t);
extern void NRFDelay(unint t);
/*******************************************/
#endif

LCD1602.c

#include"reg52.h"
#include"Allhead.h"
sbit RS=P0^0;
sbit RW=P0^1;
sbit EN=P0^2;
#define DBPort P2
/***************************LCD写命令函数********************/
void LCDWriteCmd(unchar cmd)
{DBPort=cmd;RS=0;RW=0;LCDDelay(5);EN=1;EN=0;
}
/************************LCD写数据函数**************************/
void LCDWriteDate(unchar date)
{DBPort=date;RS=1;RW=0;LCDDelay(5);EN=1;EN=0;
}
/***************************定位函数************************/
void SetXY(unchar x,unchar y)
{if(x==0)LCDWriteCmd(0x80+y);        //第一行elseLCDWriteCmd(0x80+0x40+y); //第二行
}
/***********************显示函数****************************/
void LcdShow(unchar x,unchar y,unchar *str)
{SetXY(x,y);while(*str!='\0'){LCDWriteDate(*str);str++;}
}
/**********************LCD初始化函数***********************/
void LCDInt()
{ LCDWriteCmd(0x38);//设置模式LCDWriteCmd(0x0c);//不显示光标LCDWriteCmd(0x06);//设置指针自加LCDWriteCmd(0x01);//清屏
}

LCD1602.h

#ifndef _LCD1602_H_
#define _LCD1602_H_
/*********************************************/
extern void LCDWriteCmd(unchar cmd);
void LCDWriteDate(unchar date);
void LcdShow(unchar x,unchar y,unchar *str);
void SetXY(unchar x,unchar y);
extern void LCDInt();
/********************************************/
#endif

LCD12864.c

#include"reg52.h"
#include"code.h"
#include"Allhead.h"
#include"math.h"
#define DPOT P2
sbit RS=P0^0;
sbit RW=P0^1;
sbit EN=P0^2;
sbit CS1=P0^3;
sbit CS2=P0^4;
sbit RES=P0^5;
/*************LCD片选函数**************************************/
void LcdCS(unchar num)
{switch(num){case 0:CS1=1;CS2=1;break;//全屏case 1:CS1=1;CS2=0;break;//左屏case 2:CS1=0;CS2=1;break;//右屏case 3:CS1=0;CS2=0;break;//关屏default:break;}
}
/********LCD写命令函数*****************************************/
void LcdWriteCmd(unchar num,unchar cmd)
{RS=0;RW=0;LcdCS(num);    //选屏写入命令EN=1;DPOT=cmd;EN=0;
}
/*********LCD写数据函数****************************************/
void LcdWriteDate(unchar num,unchar date)
{RS=1;RW=0;LcdCS(num);//选择屏幕写入数据 EN=1;DPOT=date;EN=0;
}
/**********LCD读屏幕函数****************************************/
unchar LcdReadDate(unchar num)
{unchar date;DPOT=0xff;   //让数据口置1后才能读端口RS=1;RW=1;LcdCS(num);//选择屏幕读入数据EN=1;  date=DPOT;  EN=0;return(date);
}
/**********X设置函数*************************************************/
void PageSet(unchar num,unchar page)
{LcdWriteCmd(num,page|0xb8);
}
/**********Y设置函数************************************************/
void YSet(unchar num,unchar y)
{LcdWriteCmd(num,y|0x40);
}
/************指定的位置写入数据***********************************/
void LcdWriteToSet(unchar x,unchar y,unchar date)
{if(y<64){PageSet(1,x);YSet(1,y);LcdWriteDate(1,date);}else{PageSet(2,x);YSet(2,y-64);LcdWriteDate(2,date);}
}
/************指定位置读出数据****************************************/
unchar LcdReadFromSet(unchar x,unchar y)
{unchar date;if(y<64){PageSet(1,x);YSet(1,y);date=LcdReadDate(1);     date=LcdReadDate(1);return(date);}else{PageSet(2,x);YSet(2,y-64);date=LcdReadDate(2);date=LcdReadDate(2);return(date);}
}
/************画点基本函数********************************************/
void LcdWriteDot(unchar x,unchar y,unchar attr)
{   unchar yaddr,tempdate1,tempdate2;yaddr=6-(y>>3);  //计算出所在页tempdate1=LcdReadFromSet(yaddr,x);//在指定的x,y读出一个字节的数据      tempdate2=0x80>>((y&0x07)-1);     //计算出页中点   if(attr)                tempdate1|=tempdate2;   //画点elsetempdate1&=~tempdate2;  //消点LcdWriteToSet(yaddr,x,tempdate1);//指定位置画点
}
/*******指定位置写入12点阵汉字*******************************************/
void LcdWriteCh12(unchar x,unchar y,unchar *string)
{unchar i;for(i=0;i<12;i++)LcdWriteToSet(x,y++,string[i]);y-=12;for(i=12;i<24;i++)LcdWriteToSet(x+1,y++,string[i]);
}
/**********指定位置写入一个5*8ASCII字模*******************/
/*void LcdWriteAsc58(unchar x,unchar y,unchar string)
{unchar i;for(i=0;i<5;i++)  //ASCII码上部分LcdWriteToSet(x,y++,nAsciiDot58[string-32][i]);
}  */
/**********指定位置写入一个8*16ASCII字模*******************/
void LcdWriteAsc816(unchar x,unchar y,unchar string)
{unchar i;for(i=0;i<8;i++)  //ASCII码上部分LcdWriteToSet(x,y++,nAsciiDot816[string-32][i]);y-=8;//返回初始的y地址for(i=8;i<16;i++)  //ASCII码下部分LcdWriteToSet(x+1,y++,nAsciiDot816[string-32][i]);}
/*********指定位置写入一串汉字或者ASCII码********************************/
//采用内码搜索
void LcdWriteChStr(unchar x,unchar y,unchar *string)
{unchar ch1,ch2,i,j=0,length;for(length=0;string[length]!=0;length++);do{ch1=string[j];ch2=string[j+1];if(ch1<0x80)//小于0x80为ASCII码{LcdWriteAsc816(x,y,ch1); j++;y+=8;  //看字体来设置}else{for(i=0;i<sizeof(GB_12)/sizeof(GB_12[0]);i++)    //汉字内码搜索{if((ch1==GB_12[i].Index[0])&&(ch2==GB_12[i].Index[1]))break;}LcdWriteCh12(x,y,GB_12[i].Msk);j+=2;y+=12;//看字体来设置}}while(j<length);
}
/************指定位置图片显示函数*******************************************/
/*void LcdShowPicture(unchar x,unchar y,unchar high,unchar wide,unchar *img)
{  //页/Y地址/图片高/图片宽/图片编码//在显示图片时要特别小心,注意图片长宽时多少!//设置的Y和page参数不要超过能显示这副图片的最高参数! unchar i,j;for(i=0;i<(high>>3);i++)   //判断这幅画多少个页,竖向8个像素为一页for(j=0;j<(wide-y);j++)   //设置Y地址时要减掉前面空格,就是设置Y后第一页还可以显示多少个字节!                  LcdWriteToSet(x+i,y+j,img[i*wide+j]);}
/*********************LCD清屏******************************************/
void LcdClear()
{unchar x,y;for(x=0;x<8;x++){for(y=0;y<128;y++)LcdWriteToSet(x,y,0x00);}
}
/************LCD初始化函数*********************************************/
void LcdInt()
{RES=0;RES=1;RW=0;RS=0;EN=0;LcdCS(3);LcdWriteCmd(1,0x3f); LcdWriteCmd(1,0xc0);LcdCS(3);LcdWriteCmd(2,0x3f);LcdWriteCmd(2,0xc0);
}

LCD12864.h

/********************************************************************
创建人:陈志强
时间:2010.5.17
功能:LCD12864头文件
******************************************************************/
#ifndef _LCD12864_H_
#define _LCD12864_H_
/***************************************************/
void LcdCS(unchar num);
void LcdWriteCmd(unchar num,unchar cmd);
void LcdWriteDate(unchar num,unchar date);
unchar LcdReadDate(unchar num);
void PageSet(unchar num,unchar page);
void YSet(unchar num,unchar y);
void LcdWriteToSet(unchar x,unchar y,unchar date);
unchar LcdReadFromSet(unchar x,unchar y);
void LcdWriteDot(unchar x,unchar y,unchar attr);
void LcdWriteCh12(unchar x,unchar y,unchar *string);
void LcdWriteAsc58(unchar x,unchar y,unchar string);
void LcdWriteAsc816(unchar x,unchar y,unchar string);
extern void LcdWriteChStr(unchar x,unchar y,unchar *string);
extern void LcdClear();
extern void LcdInt();
/***************************************************/
#endif

MAX232.c

#include"reg52.h"
#include"allhead.h"
unchar RevFlags;
/*************************串口初始化函数**************/
void Max232Int()
{PCON=0x00;   //SMOD=0TMOD=0x20;  //设置T1为工作方式2TH1=0xfd;  //9600TL1=0xfd;SM0=0;SM1=1;//方式1,8位EA=1;ES=1;TR1=1;//定时器1允许REN=1;//允许接收
}
/*************************串口发送一个字节函数********************/
void Max232SendChar(unchar date)
{ES=0;SBUF=date;while(!TI);TI=0;ES=1;
}
/**********************发送一个字符串******************************/
void Max232SendAChar(unchar *string)
{while(*string!='\0'){Max232SendChar(*string);string++;}
}
/**********************串口中断接收函数****************************/
void ExInt() interrupt 4
{ES=0;if(RI){RI=0;RevFlags=SBUF;}ES=1;
}
/*********************发送NRF24L01采集到的数据********************/
void MAX232SendDate()
{if(RevFlags=='S'){RevFlags=0;Max232SendAChar(RevTempDate);Max232SendAChar("12.3");Max232SendAChar("32.6");Max232SendAChar("56.7");Max232SendAChar("36.9");Max232SendAChar("89.4");}//Max232SendChar('E');//发送结束标志
}

MAX232.h

#ifndef _MAX232_H_
#define _MAX232_H_
/*********************************************/
void Max232Int();
void Max232SendChar(unchar date);
void Max232SendAChar(unchar *string);
extern void MAX232SendDate();
/********************************************/
#endif

NRF24L01.c

#include"reg52.h"
#include"Allhead.h"
sbit CE=P1^2;  //RX/TX模式选择端
sbit IRQ=P1^3; //可屏蔽中断端
sbit CSN=P1^4; //SPI片选端//就是SS
sbit MOSI=P1^5;    //SPI主机输出从机输入端
sbit MISO=P1^6;    //SPI主机输出从机输出端
sbit SCLK=P1^7;    //SPI时钟端
unchar RevTempDate[5];//最后一位用来存放结束标志
unchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址
/*****************状态标志*****************************************/
unchar  bdata sta;   //状态标志
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;
/*****************SPI时序函数******************************************/
unchar NRFSPI(unchar date)
{unchar i;for(i=0;i<8;i++)          // 循环8次{if(date&0x80)MOSI=1;elseMOSI=0;   // byte最高位输出到MOSIdate<<=1;             // 低一位移位到最高位SCLK=1; if(MISO)               // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01;        // 读MISO到byte最低位SCLK=0;                // SCK置低}return(date);              // 返回读出的一字节
}
/**********************NRF24L01初始化函数*******************************/
void NRF24L01Int()
{NRFDelay(2);//让系统什么都不干CE=0;CSN=1;  SCLK=0;IRQ=1;
}
/*****************SPI读寄存器一字节函数*********************************/
unchar NRFReadReg(unchar RegAddr)
{unchar BackDate;CSN=0;//启动时序NRFSPI(RegAddr);//写寄存器地址BackDate=NRFSPI(0x00);//写入读寄存器指令  CSN=1;return(BackDate); //返回状态
}
/*****************SPI写寄存器一字节函数*********************************/
unchar NRFWriteReg(unchar RegAddr,unchar date)
{unchar BackDate;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入地址NRFSPI(date);//写入值CSN=1;  return(BackDate);
}
/*****************SPI读取RXFIFO寄存器的值********************************/
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen)
{  //寄存器地址//读取数据存放变量//读取数据长度//用于接收unchar BackDate,i;CSN=0;//启动时序BackDate=NRFSPI(RegAddr);//写入要读取的寄存器地址for(i=0;i<DateLen;i++) //读取数据{RxDate[i]=NRFSPI(0);} CSN=1;return(BackDate);
}
/*****************SPI写入TXFIFO寄存器的值**********************************/
unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen)
{ //寄存器地址//写入数据存放变量//读取数据长度//用于发送unchar BackDate,i;CSN=0;BackDate=NRFSPI(RegAddr);//写入要写入寄存器的地址for(i=0;i<DateLen;i++)//写入数据{NRFSPI(*TxDate++);}   CSN=1;return(BackDate);
}
/*****************NRF设置为发送模式并发送数据******************************/
void NRFSetTxMode(unchar *TxDate)
{  //发送模式 CE=0;   NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);//写寄存器指令+P0地址使能指令+发送地址+地址宽度NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);//为了应答接收设备,接收通道0地址和发送地址相同NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);//写入数据 /******下面有关寄存器配置**************/NRFWriteReg(W_REGISTER+EN_AA,0x01);       // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);   // 使能接收通道0NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);  // 自动重发延时等待250us+86us,自动重发10次NRFWriteReg(W_REGISTER+RF_CH,0x40);         // 选择射频通道0x40NRFWriteReg(W_REGISTER+RF_SETUP,0x07);    // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益NRFWriteReg(W_REGISTER+CONFIG,0x0e);      // CRC使能,16位CRC校验,上电 CE=1;  NRFDelay(5);//保持10us秒以上
}
/*****************NRF设置为接收模式并接收数据******************************/
//接收模式
void NRFSetRXMode()
{CE=0;NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);  // 接收设备接收通道0使用和发送设备相同的发送地址NRFWriteReg(W_REGISTER+EN_AA,0x01);               // 使能接收通道0自动应答NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);           // 使能接收通道0NRFWriteReg(W_REGISTER+RF_CH,0x40);                 // 选择射频通道0x40NRFWriteReg(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; NRFDelay(5);
}
/****************************检测是否有接收到数据******************************/
void CheckACK()
{  //用于发射模式接收应答信号sta=NRFReadReg(R_REGISTER+STATUS);                    // 返回状态寄存器if(TX_DS)NRFWriteReg(W_REGISTER+STATUS,0xff);  // 清除TX_DS或MAX_RT中断标志
}
/*************************接收数据*********************************************/
void GetDate()
{sta=NRFReadReg(R_REGISTER+STATUS);//发送数据后读取状态寄存器if(RX_DR)                // 判断是否接收到数据{CE=0;//待机NRFReadRxDate(R_RX_PAYLOAD,RevTempDate,RX_DATA_WITDH);// 从RXFIFO读取数据 接收4位即可,后一位位结束位LcdWriteChStr(2,65,RevTempDate);//LCD12864液晶显示MAX232SendDate();//发送数据到上位机   NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标CSN=0;NRFSPI(FLUSH_RX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!! CSN=1;        }//NRFWriteReg(W_REGISTER+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标
} 

NRF24L01.h

#ifndef _NRF24L01_H_
#define _NRF24L01_H_
/*******************************************************/
#define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节
#define TX_DATA_WITDH 4//发送数据宽度1个字节
#define RX_DATA_WITDH 4//接收数据宽度1个字节
/*******************命令寄存器***************************/
#define  R_REGISTER      0x00//读取配置寄存器
#define  W_REGISTER      0x20//写配置寄存器
#define  R_RX_PAYLOAD    0x61//读取RX有效数据
#define  W_TX_PAYLOAD    0xa0//写TX有效数据
#define  FLUSH_TX        0xe1//清除TXFIFO寄存器
#define  FLUSH_RX        0xe2//清除RXFIFO寄存器
#define  REUSE_TX_PL     0xe3//重新使用上一包有效数据
#define  NOP             0xff//空操作
/******************寄存器地址****************************/
#define  CONFIG          0x00//配置寄存器
#define  EN_AA           0x01//使能自动应答
#define  EN_RXADDR       0x02//接收通道使能0-5个通道
#define  SETUP_AW        0x03//设置数据通道地址宽度3-5
#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//P0通道数据宽度设置
#define  RX_PW_P1        0x12//P1通道数据宽度设置
#define  RX_PW_P2        0x13//P2通道数据宽度设置
#define  RX_PW_P3        0x14//P3通道数据宽度设置
#define  RX_PW_P4        0x15//P4通道数据宽度设置
#define  RX_PW_P5        0x16//P5通道数据宽度设置
#define  FIFO_STATUS     0x17//FIFO状态寄存器
/*******************相关函数声明**************************/
unchar NRFACK();
unchar NRFSPI(unchar date);
unchar NRFReadReg(unchar RegAddr);
unchar NRFWriteReg(unchar RegAddr,unchar date);
unchar NRFReadRxDate(unchar RegAddr,unchar *RxDate,unchar DateLen);
unchar NRFWriteTxDate(unchar RegAddr,unchar *TxDate,unchar DateLen);
void NRFSetTxMode(unchar *TxDate);
void NRF24L01Int();
void NRFSetRXMode();
void CheckACK();
extern void GetDate();
extern unchar bdata sta;
extern unchar RevTempDate[5];
/*********************************************************/
#endif

public.h

#ifndef _PUBILE_H_
#define _PUBILE_H_
/****************************************/
#define unchar unsigned char
#define unint unsigned int
/*****************************************/
#endif

receive.c

#include"reg52.h"
#include"Allhead.h"
/************************主函数********************/
void main()
{//LCD1602Int();*(RevTempDate+4)='\0';LcdInt(); //12864液晶初始化LcdClear(); //12864液晶清屏 Max232Int();//串口初始化NRF24L01Int();LcdWriteChStr(2,10,"当前温度:");while(1){NRFSetRXMode();//设置为接收模式GetDate();//开始接受数}
}


无线广告屏]无线模块相关推荐

  1. 四轴笔记----无线透传模块|无线图传|遥控和接收机|无线数传

    一.无线透传模块 所谓透传就是透明传输,透明传输就是在数据传输过程中,发送方和接收方数据的长度和内容完全一致,不需对数据做任何处理,相当于一条数据线或者串口线,只不过把有线变成无线. 二.无线图传模块 ...

  2. 流量计专用无线物联模块介绍

    流量计广泛应用于工业供给水等系统.随着物联网的发展,离散式分布式安装的流量计需要把数据远程传输到物联网平台上去,因此,传统流量计需要加上一个无线物联网模块,才能实现数据的远程传输. 流量计一般采用RS ...

  3. ap模式和sta模式共存_无线Wifi图传模块AP和STA工作模式详解

    无线Wifi图传模块包括两种工作模式AP和STA,在这两模式的支持下,无线Wifi图传模块产品可以实现一发多收的功能.下面我们就从AP和STA的基本概念开始了解它们. 一.AP和STA的基本概念 AP ...

  4. 关于无线遥控315模块的发射与接收

    最近为了开发无线数据传输项目,看了不少无线数据发送与接收的资料,其中无线遥控315模块比较便宜和应用比较广泛,以下是单片机模拟2272软件解码: 在无线遥控领域,PT2262/2272是目前最常用的芯 ...

  5. ZigBee无线气压测量模块的实现

    在集装箱运输中,对冷藏集装箱可靠性要求很高,除进行强度实验外,还需按要求完成热工性能实验.热工性能实验中需要测量集装箱的气密性,漏热性,制冷性等. 为提高测量的自动化程度,控制测量过程的人为因素,需要 ...

  6. 蜂鸟无线LR43B无线射频接收模块调试记录

    目录 1.设计目的 2.设计难点 3.初步方案 4.成功方案 5.代码实现 1.设计目的 采用蜂鸟无线LR43B无线射频接收模块,对遥控器发送的无线信号解码.按下按键1,继电器打开:按下按键2,继电器 ...

  7. xp系统的无线配置服务器,xp系统下使用无线提示无线自动配置服务没有运行如何解决...

    越来越多的用户都喜欢使用无线方式来上网,然而有xp系统用户在使用无线的时候,却提示无线自动配置服务没有运行,要怎么解决这样的问题呢,现在为大家带来xp系统下使用无线提示无线自动配置服务没有运行的详细解 ...

  8. FS68001 全新原装 SOP8 无线充电供电IC 无线充电芯片 无线输电芯片5W方案

    FS68001 全新原装 SOP8 无线充电供电IC 无线充电芯片 无线输电芯片5W方案 有SOP8 5W SOP14  5W SOP16  10W TSSOP20 10W-15W

  9. aruba无线ap认证服务器,【图片】Aruba家用无线控制器无线AP+AC方案分析选择【aruba吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Aruba家用无线控制器无线AP+AC方案分析选择!近期很多网友都在家里玩起了AC+AP的漫游方案,也有很多网友咨询了很多问题,我现在就集中给写一写,希望 ...

最新文章

  1. pta 整型关键字的平方探测法散列
  2. Linux笔记1- 6 --文件
  3. AOP之PostSharp2-OnMethodBoundaryAspect
  4. oo0ooo0ooo0oo_OoO的完整形式是什么?
  5. RuntimeError: [enforce fail at inline_container.cc:145] . PytorchStreamReader failed reading zip arc
  6. 针对业务系统的开发,如何做需求分析和设计1
  7. linux逻辑卷管理(LVM)
  8. java调用matlab的jar包
  9. 领英宣布开源数据挖掘软件WhereHows
  10. [MySQL]学习笔记目录(尚硅谷宋红康MySQL数据库教程)
  11. 一种可信万兆加密分流认证装置研究
  12. 算法训练 递归输出数字三角形
  13. RabbitMQ使用手册中文
  14. matlab details
  15. 用python中的turtle库绘制一些有趣的图
  16. Day_06 传智健康项目-移动端开发-体检预约
  17. 【Python】用Python制作一个名片管理系统
  18. 孔子最得意的弟子颜回不幸英年早逝
  19. 先有java后有天_Java基础第十四天总结——面向对象(下)
  20. fastjson解析接口json格式数据

热门文章

  1. 为什么使用use strict可以节约你的时间
  2. 极路由X(C526A)刷Openwrt 18.06固件
  3. 安卓点击图片跳转界面_详解拳头注册 + 安卓LOL试玩教程
  4. TP5——workerman在线客服
  5. Android弹性滑动在自定义View中的高级应用
  6. xp系统打印机没有服务器属性设置,xp系统打印机纸张设置的方法
  7. 系统性能优化策略 -- 持续优化更新
  8. 分页LIMIT和OFFSET关键字
  9. vue 页面增加url前缀
  10. Teach repeat replan 安装中遇到的问题记录