无线广告屏]无线模块
来源:互联网 发布:万代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"/*****************************************/#endifDelay.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
- 无线广告屏]无线模块
- [无线广告屏]16*64广告屏模块
- 无线模块
- 无线485 无线工业模块 无线收发模块 无线射频
- 无线广告解析
- 433m无线模块,无线收发模块,无线传输模块
- 无线
- 无线
- 无线
- 无线USB模块
- 无线数传模块
- 无线GSM模块
- CC1100无线收发模块
- 10mW无线模块
- 供应无线模块
- 无线数传模块
- zigbee无线模块
- SX1212 APC240无线模块
- 网络通信
- 关于文字内容溢出用点点点(…)省略号表示
- 安装zookeeper时候,状态显示报错:Error contacting service.
- Android drawable-v21文件夹下xml文件,手机版本不兼容
- Google Guice入门教程
- 无线广告屏]无线模块
- 洛谷 P2158 [SDOI2008]仪仗队
- Runtime
- javascript各种类型数据在表达式中转换成布尔型值的规则总结
- C# 文件哈希码比较
- 部署公文时要注意的问题
- XunfeiSpeek 讯飞语言合成工具类
- linux下命令
- Linux函数之间的goto 跳转