当前位置:文档之家› NRF24L01+无线温度传输接收终版

NRF24L01+无线温度传输接收终版

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^0; //定义LCD引脚
sbit lcdrw=P2^1;
sbit lcden=P2^2;
uint value=0;
uchar code str[]={"Tempe:"};
uchar code str1[]={"No signal"};
uchar code str2[]={"Please Check"};
uchar tflag; // 是否正负
uchar data disdat[6];
uchar data setdat[4];
void writelcdcmd(uchar);
void writelcddat(uchar);
//******************************************************************************************
uchar tm[2];
#define TX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 2
uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x55,0x10,0x10,0x01};
uchar rx_buf[TX_PLOAD_WIDTH];
uchar tx_buf[TX_PLOAD_WIDTH];
uchar flag;//标志

int cout;
sbit CE=P1^0; //发射高电平大于10MS 接收高电平
sbit CSN=P1^1; //低电平ISP使能
sbit SCK=P1^2; //下降沿
sbit MOSI=P1^3; //MCU出
sbit MISO=P1^4; //MCU入
sbit IRQ=P1^5; //中断
uchar bdata sta;
sbit RX_DR =sta^6; //接收数据准备就绪
sbit TX_DS =sta^5; //已发送数据
sbit MAX_RT =sta^4;

sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG 0x00 // 读寄存器指令
#define WRITE_REG 0x20 // 写寄存器指令
#define RD_RX_PLOAD 0x61 // 读取接收数据指令
#define WR_TX_PLOAD 0xA0 // 写待发数据指令
#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令
#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令
#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令
#define NOP 0xFF // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA 0x01 // 自动应答功能设置
#define EN_RXADDR 0x02 // 可用信道设置
#define SETUP_AW 0x03 // 收发地址宽度设置
#define SETUP_RETR 0x04 // 自动重发功能设置
#define RF_CH 0x05 // 工作频率设置
#define RF_SETUP 0x06 // 发射速率、功耗功能设置
#define STATUS 0x07 // 状态寄存器
#define OBSERVE_TX 0x08 // 发送监测功能
#define CD 0x09 // 地址检测
#define RX_ADDR_P0 0x0A // 频道0接收数据地址
#define RX_ADDR_P1 0x0B // 频道1接收数据地址
#define RX_ADDR_P2 0x0C // 频道2接收数据地址
#define RX_ADDR_P3 0x0D // 频道3接收数据地址
#define RX_ADDR_P4 0x0E // 频道4接收数据地址
#define

RX_ADDR_P5 0x0F // 频道5接收数据地址
#define TX_ADDR 0x10 // 发送地址寄存器
#define RX_PW_P0 0x11 // 接收频道0接收数据长度
#define RX_PW_P1 0x12 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
//**************************************************************************************


void init_io(void)
{
CE=0;
CSN=1;
SCK=0;
}
void delay_ms(unsigned int x)
{
unsigned int i,j;
for(i=0;i{
j=108;
while(j--);
}
}
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI = (byte&0x80);
byte = (byte<<1);
SCK = 1;
byte|=MISO;
SCK=0;
}
return(byte);
}
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0;
status = SPI_RW(reg);
SPI_RW(value);
CSN = 1;
return(status);
}
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0;
SPI_RW(reg);
reg_val = SPI_RW(0);
CSN = 1;
return(reg_val);
}
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;
CSN = 0;
status = SPI_RW(reg);
for(byte_ctr=0;byte_ctrpBuf[byte_ctr] = SPI_RW(0);
CSN = 1;
return(status);
}
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
uchar status,byte_ctr;
CSN = 0;
status = SPI_RW(reg);
for(byte_ctr=0; byte_ctrSPI_RW(*pBuf++);
CSN = 1;
return(status);
}
void RX_Mode(void)
{
CE=0;
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //数据通道0应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);//接收数据通道0允许
SPI_RW_Reg(WRITE_REG + RF_CH, 40);
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);// 接收频道0 接收数据长度设置
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //数据传输率1Mbps ,发射功率0dBm
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); //配置寄存器
CE = 1;
}

void checkflag()
{
sta=SPI_Read(STATUS);
if(RX_DR)
{SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
flag=1;
}
if(MAX_RT)
{SPI_RW_Reg(FLUSH_TX,0);
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);

}
//**********************************************************************************************

void delayms(uint z) //不精确延时
{
uchar x;
uint y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}

void LCD_BUSY() //LCD忙检测
{ uchar sta;
P0=0xff;
lcdrs=0;
lcdrw=1;
do{
lcden=1;
sta=P0;
lcden=0;
}while(sta & 0x80);


}

void writelcdcmd(uchar cmd) //LCD写命令
{
LCD_BUSY();
delayms(1);
lcdrs=0;
lcdrw=0;
lcden=0;
P0=cmd;

delayms(1);
lcden=1;

delayms(1);
lcden=0;
}

void writelcddat(uchar dat) //LCD写数据
{
LCD_BUSY();
delayms(1);
lcdrs=1;
lcdrw=0;
lcden=0;
P0=dat;
delayms(1);
lcden=1;
delayms(1);
lcden=0;
}

void inilcd() //LCD初始化
{ delayms(15);
writelcdcmd(0x38);
delayms(5);
writelcdcmd(0x0c);
delayms(5);
writelcdcmd(0x06);
delayms(5);
writelcdcmd(0x01);
delayms(5);
}
void play(unsigned char *p)//显示//
{
while(*p!='\0')
{
writelcddat(*p);
p++;
delayms(1);
}
}

void xianshi(void)
{

uchar TL; //储存暂存器的温度低位
uchar TH; //储存暂存器的温度高位

TH=tm[0] ;
TL=tm[1]; //这样得到的是温度小数部分的第一位数字(保留1位小数)
value=TH;
value<<=8;
value=value|TL;
if(value<0x0fff) //是否是负值
tflag=0;
else
{
value=~value+1;
tflag=1;
}
value=value*(0.625)+0.5; //扩大10倍方便读取小数
disdat[0]=value/1000+0x30;//百位数
disdat[1]=value%1000/100+0x30;//十位数
disdat[2]=value%100/10+0x30;//个位数
disdat[3]=value%10+0x30;//小数位
if(tflag==0)
disdat[4]=0x20;
else
disdat[4]=0x2d; //当最高位为0时,最高位不显示
if(disdat[0]==0x30)
{
disdat[0]=0x20;
if(disdat[1]==0x30)
disdat[1]=0x20;
}
/*显示当前温度*/
writelcdcmd(0x86);
writelcddat(disdat[4]); //符号位
writelcdcmd(0x87);
writelcddat(disdat[0]);
writelcdcmd(0x88);
writelcddat(disdat[1]);
writelcdcmd(0x89);
writelcddat(disdat[2]);
writelcdcmd(0x8a);
writelcddat(0x2e); //小数点
writelcdcmd(0x8b);
writelcddat(disdat[3]);
writelcdcmd(0x8d); //单位℃
writelcddat(0xdf);
writelcdcmd(0x8e);
writelcddat('C');


}
void main(void)
{
uchar xx;
inilcd();
init_io();
RX_Mode();
while(1)
{ flag=0;
checkflag();
if(flag!=1)
{ writelcdcmd(0x01);
writelcdcmd(0x01);
writelcdcmd(0x80);
play(str1);
writelcdcmd(0x80+0x40);
play(str2);
delayms(60000);

}
else if(flag)
{
writelcdcmd(0x01);
for(xx=0;xx<2;xx++)
{tm[xx]=rx_buf[xx];
delay_ms(1);
writelcdcmd(0x80);
play(str);
xianshi();
delayms(60000);

}

}
delayms(60000);
delayms(60000);
delayms(60000);
delayms(60000);
delayms(60000);
delayms(60000

);
delayms(60000);
delayms(60000);





}
}




相关主题
文本预览
相关文档 最新文档