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

#include <reg52.h>
#include <intrins.h>
#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<x;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_ctr<bytes;byte_ctr++)
pBuf[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_ctr<bytes; byte_ctr++)
SPI_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);
}
}

本文发布于:2024-09-22 23:31:01,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/352783.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:接收数据   频道   设置   接收   温度   地址   状态   指令
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议