无线广告屏]无线模块

来源:互联网 发布:万代mg知乎 编辑:程序博客网 时间:2024/04/29 14:34

无线广告屏——无线模块

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片选端//就是SSsbit 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;  else    MOSI=0;   // byte最高位输出到MOSI     date<<=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);   // 使能接收通道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;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);           // 使能接收通道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;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);}else   return(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);//第一行   else      LCDWriteCmd(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 P2sbit 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;   //画点else   tempdate1&=~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片选端//就是SSsbit 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;  else    MOSI=0;   // byte最高位输出到MOSI     date<<=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);   // 使能接收通道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;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);           // 使能接收通道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; 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 0