久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

nRF24L01+無線溫度(DS18B20)測控系統(tǒng)

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月10日   【字體:





 

//****************無線溫度發(fā)射部分*******************
api.h
#ifndef _API_H_
#define _API_H_
#define uchar unsigned char
#define uint unsigned int
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH    5    // 5 uints TX address width
#define RX_ADR_WIDTH    5    // 5 uints RX address width
#define TX_PLOAD_WIDTH  20   // 20 uints TX payload
#define RX_PLOAD_WIDTH  20   // 20 uints TX payload
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x35,0x43,0x10,0x10,0x03};  //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x35,0x43,0x10,0x10,0x03}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG        0x00   // 讀寄存器指令
#define WRITE_REG       0x20  // 寫寄存器指令
#define RD_RX_PLOAD     0x61   // 讀取接收數(shù)據(jù)指令
#define WR_TX_PLOAD     0xA0   // 寫待發(fā)數(shù)據(jù)指令
#define FLUSH_TX        0xE1  // 沖洗發(fā)送 FIFO指令
#define FLUSH_RX        0xE2   // 沖洗接收 FIFO指令
#define REUSE_TX_PL     0xE3   // 定義重復(fù)裝載數(shù)據(jù)指令
#define NOP             0xFF   // 保留
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG          0x00  // 配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式
#define EN_AA           0x01  // 自動(dòng)應(yīng)答功能設(shè)置
#define EN_RXADDR       0x02  // 可用信道設(shè)置
#define SETUP_AW        0x03  // 收發(fā)地址寬度設(shè)置
#define SETUP_RETR      0x04  // 自動(dòng)重發(fā)功能設(shè)置
#define RF_CH           0x05  // 工作頻率設(shè)置
#define RF_SETUP        0x06  // 發(fā)射速率、功耗功能設(shè)置
#define STATUS          0x07  // 狀態(tài)寄存器
#define OBSERVE_TX      0x08  // 發(fā)送監(jiān)測功能
#define CD              0x09  // 地址檢測          
#define RX_ADDR_P0      0x0A  // 頻道0接收數(shù)據(jù)地址
#define RX_ADDR_P1      0x0B  // 頻道1接收數(shù)據(jù)地址
#define RX_ADDR_P2      0x0C  // 頻道2接收數(shù)據(jù)地址
#define RX_ADDR_P3      0x0D  // 頻道3接收數(shù)據(jù)地址
#define RX_ADDR_P4      0x0E  // 頻道4接收數(shù)據(jù)地址
#define RX_ADDR_P5      0x0F  // 頻道5接收數(shù)據(jù)地址
#define TX_ADDR         0x10  // 發(fā)送地址寄存器
#define RX_PW_P0        0x11  // 接收頻道0接收數(shù)據(jù)長度
#define RX_PW_P1        0x12  // 接收頻道1接收數(shù)據(jù)長度
#define RX_PW_P2        0x13  // 接收頻道2接收數(shù)據(jù)長度
#define RX_PW_P3        0x14  // 接收頻道3接收數(shù)據(jù)長度
#define RX_PW_P4        0x15  // 接收頻道4接收數(shù)據(jù)長度
#define RX_PW_P5        0x16  // 接收頻道5接收數(shù)據(jù)長度
#define FIFO_STATUS     0x17  // FIFO棧入棧出狀態(tài)寄存器設(shè)置
#endif

LCD1602display.h 
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//************************LCD引腳定義
sbit LCM_RS=P3^4;
sbit LCM_RW=P3^6;
sbit LCM_E=P3^7;
//**************************延時(shí)
void delay();
//**************************初始化
void InitLCM();
//****************************讀狀態(tài)
uchar ReadStatusLCM();
//******************************讀數(shù)據(jù)
uchar ResdDataLCM();
//***************************寫指令
void WriteCommandLCM(uchar WCLCM, Busy);
//***************************寫數(shù)據(jù)
void WriteDataLCM(uchar WDLCM);
//******************************顯示1個(gè)字符
void DisplayOneChar(uchar X,uchar Y,uchar DData);
//******************************顯示字符串
void DisplayListChar(uchar X,uchar Y,uchar code  *DData);
//********************延時(shí)
void delay(uchar z)
{
 uchar i,j;
 for(i=z;i>0;i--)
  for(j=110;j>0;j--);
}
//**********************LCM初始化
void InitLCM()
{
 WriteCommandLCM(0x38,0);  //三次顯示模式設(shè)置,不檢測忙信號(hào)
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);
 WriteCommandLCM(0x38,0);
 delay(1);
 WriteCommandLCM(0x38,1);  //顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口
 WriteCommandLCM(0x0c,1);  //顯示模式設(shè)置:顯示開,無光標(biāo)
 WriteCommandLCM(0x06,1);  //顯示模式設(shè)置:光標(biāo)右移,字符不移
 WriteCommandLCM(0x01,1);  //清屏幕指令,將以前的顯示內(nèi)容清除
}
//*********************讀狀態(tài)
uchar ReadStatusLCM()
{
 P0 = 0x80;
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 1;
 while (P0 & 0x80); //檢測忙信號(hào)
 return(0);
}
//***********************讀數(shù)據(jù)
/*uchar ResdDataLCM()
{
 LCM_RS=1;
 LCM_RW=1;
 LCM_E=1;
} */
//**********************寫指令
void WriteCommandLCM(uchar WCLCM, Busy)
{
 if(Busy) ReadStatusLCM();
 P0=WCLCM;
 LCM_RS=0;
 LCM_RW=0;
 LCM_E=0;
 LCM_E=1;
}
//***********************寫數(shù)據(jù)
void WriteDataLCM(uchar WDLCM)
{
 ReadStatusLCM();
 P0=WDLCM;
 LCM_RS=1;
 LCM_RW=0;
 LCM_E=0;
 LCM_E=1;
}
//*************************顯示字符
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
 if(Y) X|=0X40;   //Y=1顯示第二行,Y=0顯示第一行
 X|=0X80;
 WriteCommandLCM(X,1); //X用來選擇哪一位,1是用來忙檢測
 WriteDataLCM(DData); //DData用來寫數(shù)據(jù)
}
//**************************顯示字符串
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
 uchar ListLength;
 ListLength=0;
 while(DData[ListLength]!='\0')
 {
  if(X<=15)
  {
   DisplayOneChar( X,Y,DData[ListLength]);
   ListLength++;
   X++;
  }
 }
}

nrf24l01+1.h
#define uchar unsigned char
#define uint unsigned int
//********************************************************
sbit  MISO =P1^4;
sbit  MOSI =P1^3;
sbit SCK     =P1^2;
sbit CE     =P1^0;
sbit CSN  =P1^1;
sbit IRQ  =P1^5;
//****************************************************函數(shù)聲明
void inerDelay_us(uchar n);
void init_NRF24L01(void);
uchar SPI_RW(uchar byte);
uchar SPI_Read(uchar reg);
//void SetRX_Mode(void);
uchar SPI_RW_Reg(uchar reg, uchar value);
//uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
//uchar nRF24L01_RxPacket(uchar* rx_buf);
void nRF24L01_TxPacket(uchar * tx_buf);
//******************************************************************************************
uchar  bdata sta;   //狀態(tài)標(biāo)志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延時(shí)函數(shù)
/******************************************************************************************/
void inerDelay_us(uchar n)
{
 for(;n>0;n--)
  _nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
    inerDelay_us(100);
  CE=0;    // chip enable
  CSN=1;   // Spi  disable
  SCK=0;  
 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫發(fā)射端地址 
 SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
 SPI_RW_Reg(WRITE_REG + EN_AA, 0x03);      //  頻道1自動(dòng) ACK應(yīng)答允許 
 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03);  //  允許接收地址只有頻道1,如果需要多頻道可以參考Page21 
 SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   設(shè)置信道工作為2.4GHZ,收發(fā)必須一致
 SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)
 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB
}

 

 

 


/****************************************************************************************************
/*函數(shù):uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時(shí)序
/****************************************************************************************************/
uchar SPI_RW(uchar byte)
{
 uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
    {
  MOSI = (byte & 0x80);         // output 'uchar', MSB to MOSI
  byte = (byte << 1);           // shift next bit into MSB..
  SCK = 1;                      // Set SCK high..
  byte |= MISO;           // capture current MISO bit
  SCK = 0;                // ..then set SCK low again
    }
    return(byte);               // return read uchar
}
/****************************************************************************************************
/*函數(shù):uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時(shí)序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
 uchar reg_val;
 
 CSN = 0;                // CSN low, initialize SPI communication...
 SPI_RW(reg);            // Select register to read from..
 reg_val = SPI_RW(0);    // ..then read registervalue
 CSN = 1;                // CSN high, terminate SPI communication
 
 return(reg_val);        // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數(shù)
/****************************************************************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
 uchar status;
 
 CSN = 0;                   // CSN low, init SPI transaction
 status = SPI_RW(reg);      // select register
 SPI_RW(value);             // ..and write value to it..
 CSN = 1;                   // CSN high again
 
 return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函數(shù):uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于讀數(shù)據(jù),reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchars:讀出數(shù)據(jù)的個(gè)數(shù)
/****************************************************************************************************/
/*uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
 uchar status,uchar_ctr;
 
 CSN = 0;                      // Set CSN low, init SPI tranaction
 status = SPI_RW(reg);         // Select register to write to and read status uchar
 
 for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  pBuf[uchar_ctr] = SPI_RW(0);    //
 
 CSN = 1;                          
 
 return(status);                    // return nRF24L01 status uchar
}*/
/*********************************************************************************************************
/*函數(shù):uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于寫數(shù)據(jù):為寄存器地址,pBuf:為待寫入數(shù)據(jù)地址,uchars:寫入數(shù)據(jù)的個(gè)數(shù)
/*********************************************************************************************************/
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
 uchar status,uchar_ctr;
 
 CSN = 0;            //SPI使能      
 status = SPI_RW(reg);  
 for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  SPI_RW(*pBuf++);
 CSN = 1;           //關(guān)閉SPI
 return(status);    //
}
/****************************************************************************************************/
/*函數(shù):void SetRX_Mode(void)
/*功能:數(shù)據(jù)接收配置
/****************************************************************************************************/
/*void SetRX_Mode(void)
{
 CE=0;
 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // IRQ收發(fā)完成中斷響應(yīng),16位CRC ,主接收
 CE = 1;
 inerDelay_us(130);
} */
/******************************************************************************************************/
/*函數(shù):unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:數(shù)據(jù)讀取后放如rx_buf接收緩沖區(qū)中
/******************************************************************************************************/
/*uchar nRF24L01_RxPacket(uchar *rx_buf)

    uchar revale=0;
 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,RX_ADDRESS, RX_ADR_WIDTH);
 CE=0;
 SPI_RW_Reg(WRITE_REG + CONFIG, 0x1f);     // IRQ收發(fā)完成中斷響應(yīng),16位CRC ,主接收
 CE = 1;
 inerDelay_us(130);
 sta=SPI_Read(STATUS); // 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況
 if(RX_DR)    // 判斷是否接收到數(shù)據(jù)
 {
     CE = 0;    //SPI使能
  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  revale =1;   //讀取數(shù)據(jù)完成標(biāo)志
  
 }
 SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標(biāo)志
 return revale;
}*/
/***********************************************************************************************************
/*函數(shù):void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:發(fā)送 tx_buf中數(shù)據(jù)
/**********************************************************************************************************/
void nRF24L01_TxPacket(uchar *tx_buf)
{
 CE=0;   //StandBy I模式 
 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 發(fā)射端地址
 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 裝載數(shù)據(jù) 
 SPI_RW_Reg(WRITE_REG + CONFIG, 0x1e);      // IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送
 CE=1;   //置高CE,激發(fā)數(shù)據(jù)發(fā)送
 inerDelay_us(20); 
}

ds18b20.h
#include <reg52.h>
#include <intrins.h>
#include "LCD1602display.h"
uchar code range[]="===TEMPERTURE===";
uchar code ASCII[]="0123456789.";
uchar code table0[]="ROME TEMP:00.0C ";
uchar code table1[]="    ERRO !!!    "; 
uchar temp[3]={0,0,0};
sbit DQ=P2^0;    //ds18b20
uint wendu=0;
uchar num,num1;
uint temperature=0;
//********************延時(shí)
void delay1ms(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=114;y>0;y--);
}
//*************************初始化
bit init_DS18B20()
{
 uchar num;
 bit flag;
 DQ=1;
 for(num=0;num<2;num++);  //先拉高
 DQ=0;
 for(num=0;num<200;num++);  // 480-960us powerup
 DQ=1;
 for(num=0;num<20;num++); //  >60us   wait
 flag=DQ;     // 響應(yīng)
 for(num=0;num<150;num++); //  60-240us ds18b20存在信號(hào)
 DQ=1;
 return flag;
}
//*******************************寫溫度數(shù)據(jù)
void DS18B20_WR_CHAR(uchar byte) // 先寫低位
{
 for(num1=0;num1<8;num1++)
 {   
  DQ=0;  //拉低
  _nop_(); //下拉1us
  _nop_();
  DQ=byte&0x01;
  for(num=0;num<20;num++); //  >60us   wait
  byte>>=1; 
  DQ=1;   //拉高 
  _nop_();
  _nop_();
 }  
}
//**********************************讀出溫度數(shù)據(jù)
uchar DS18B20_RD_CHAR() //先讀低位
{
 uchar byte=0;
 for(num1=0;num1<8;num1++)
 {
  DQ=0;   //拉低
  _nop_();
  DQ=1;
  for(num=0;num<1;num++);  // <10us  
  byte>>=1;
  if(DQ==1)
   byte|=0x80;
  else
   byte|=0x00;
  DQ=1; //拉高
  _nop_();
  _nop_();
  for(num=0;num<20;num++);  //  >60us
  
 }
 return byte;
}
//*********************************溫度計(jì)算
void DS18B20_WENDU()
{
 uchar temperaturel=0,temperatureh=0;
 if(init_DS18B20()==0)
 {
  DS18B20_WR_CHAR(0xcc);
  DS18B20_WR_CHAR(0x44);
    delay1ms(1000);
    if(init_DS18B20()==0)
    {
      DS18B20_WR_CHAR(0xcc);
      DS18B20_WR_CHAR(0xBE);
      _nop_();
      temperaturel=DS18B20_RD_CHAR();
      temperatureh=DS18B20_RD_CHAR();
      wendu=(temperatureh*256+temperaturel)*0.625;
      init_DS18B20();
   }
  //return (temperature);   
 }
}
//******************************溫度顯示
void display_DS18B20()  
{
 temp[2]=wendu/100%10;
 temp[1]=wendu%100/10;
 temp[0]=wendu%10;
 
 DisplayListChar(0, 1, table0);
 DisplayOneChar(10, 1, ASCII[ temp[2] ] );
 DisplayOneChar(11, 1, ASCII[ temp[1] ]  );
 DisplayOneChar(12, 1, ASCII[10] );
 DisplayOneChar(13, 1, ASCII[ temp[0] ] );


fa.c 

#include <reg52.h>
#include <intrins.h>
#include "api.h"
#include "nrf24l01+1.h"
#include "ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
sbit BELL=P1^6;
//*******************************主函數(shù)
main()
{
 uchar TxBuf[20]={0};
 //wendu=0;
 InitLCM();
 DisplayListChar(0,0,range);
 DisplayListChar(0,1,table0);
 init_NRF24L01();
 delay1ms(1000);
 while(1)
 {
  if( init_DS18B20()==0)   
      {  
   DS18B20_WENDU();
   display_DS18B20();
   TxBuf[1] = wendu/256;
   TxBuf[2] = wendu%256;
   BELL=0;
   delay1ms(1);
   BELL=1;        
  }
  nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
  TxBuf[1] = 0x00;
  TxBuf[2] = 0x00;    
  delay1ms(1000);
  sta=SPI_Read(STATUS);
  SPI_RW_Reg(WRITE_REG+STATUS,sta);
 }

//****************無線溫度接收部分************

 直接調(diào)用api.hLCD1602display.h
nrf24l01+2.h 

#define uchar unsigned char
#define uint unsigned int

uchar temp[3]={0,0,0};

//********************************************************
sbit  MISO =P1^4;
sbit  MOSI =P1^3;
sbit SCK     =P1^2;
sbit CE     =P1^0;
sbit CSN  =P1^1;
sbit IRQ  =P1^5;

//****************************************************函數(shù)聲明
void inerDelay_us(uchar n);
void init_NRF24L01(void);
uchar SPI_RW(uchar byte);
uchar SPI_Read(uchar reg);
//void SetRX_Mode(void);
uchar SPI_RW_Reg(uchar reg, uchar value);
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
uchar nRF24L01_RxPacket(uchar* rx_buf);
//void nRF24L01_TxPacket(uchar * tx_buf);

//******************************************************************************************
uchar  bdata sta;   //狀態(tài)標(biāo)志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/******************************************************************************************
/*延時(shí)函數(shù)
/******************************************************************************************/
void inerDelay_us(uchar n)
{
 for(;n>0;n--)
  _nop_();
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
    inerDelay_us(100);
  CE=0;    // chip enable
  CSN=1;   // Spi  disable
  SCK=0;   
 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫發(fā)射端地址 
 SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
 SPI_RW_Reg(WRITE_REG + EN_AA, 0x03);      //  頻道1自動(dòng) ACK應(yīng)答允許 
 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03); //允許頻道1,2 
 SPI_RW_Reg(WRITE_REG + RF_CH, 0);  //設(shè)置信道工作為2.4GHZ,收發(fā)必須一致
 SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)
 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);      //設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB
}

 


/****************************************************************************************************
/*函數(shù):uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時(shí)序
/****************************************************************************************************/
uchar SPI_RW(uchar byte)
{
 uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++)// output 8-bit
    {
  MOSI = (byte & 0x80);         // output 'uchar', MSB to MOSI
  byte = (byte << 1);           // shift next bit into MSB..
  SCK = 1;                      // Set SCK high..
  byte |= MISO;           // capture current MISO bit
  SCK = 0;                // ..then set SCK low again
    }
    return(byte);               // return read uchar
}
/****************************************************************************************************
/*函數(shù):uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時(shí)序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
 uchar reg_val;
 
 CSN = 0;                // CSN low, initialize SPI communication...
 SPI_RW(reg);            // Select register to read from..
 reg_val = SPI_RW(0);    // ..then read registervalue
 CSN = 1;                // CSN high, terminate SPI communication
 
 return(reg_val);        // return register value
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數(shù)
/****************************************************************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
 uchar status;
 
 CSN = 0;                   // CSN low, init SPI transaction
 status = SPI_RW(reg);      // select register
 SPI_RW(value);             // ..and write value to it..
 CSN = 1;                   // CSN high again
 
 return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************/
/*函數(shù):uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于讀數(shù)據(jù),reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchars:讀出數(shù)據(jù)的個(gè)數(shù)
/****************************************************************************************************/
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
 uchar status,uchar_ctr;
 
 CSN = 0;                      // Set CSN low, init SPI tranaction
 status = SPI_RW(reg);         // Select register to write to and read status uchar
 
 for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  pBuf[uchar_ctr] = SPI_RW(0);   
 
 CSN = 1;                          
 
 return(status);                    // return nRF24L01 status uchar
}
/*********************************************************************************************************
/*函數(shù):uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于寫數(shù)據(jù):為寄存器地址,pBuf:為待寫入數(shù)據(jù)地址,uchars:寫入數(shù)據(jù)的個(gè)數(shù)
/*********************************************************************************************************/
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
 uchar status,uchar_ctr;
 
 CSN = 0;            //SPI使能      
 status = SPI_RW(reg);  
 for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  SPI_RW(*pBuf++);
 CSN = 1;           //關(guān)閉SPI
 return(status);    
}
/****************************************************************************************************/
/*函數(shù):void SetRX_Mode(void)
/*功能:數(shù)據(jù)接收配置
/****************************************************************************************************/
/*void SetRX_Mode(void)
{
 CE=0;
 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // IRQ收發(fā)完成中斷響應(yīng),16位CRC ,主接收
 CE = 1;
 inerDelay_us(130);
} */
/******************************************************************************************************/
/*函數(shù):unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:數(shù)據(jù)讀取后放如rx_buf接收緩沖區(qū)中
/******************************************************************************************************/
uchar nRF24L01_RxPacket(uchar *rx_buf)

    uchar revale=0;
 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,RX_ADDRESS, RX_ADR_WIDTH);
 CE=0;
 SPI_RW_Reg(WRITE_REG + CONFIG, 0x1f);// IRQ收發(fā)完成中斷響應(yīng),16位CRC,主接收
 CE = 1;
 inerDelay_us(130);
 sta=SPI_Read(STATUS); // 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況
 if(RX_DR)    // 判斷是否接收到數(shù)據(jù)
 {
     CE = 0;    //SPI使能
  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  revale =1;   //讀取數(shù)據(jù)完成標(biāo)志
  temp[2]=(rx_buf[1]*256+rx_buf[2])/100%10;
  temp[1]=(rx_buf[1]*256+rx_buf[2])%100/10;
  temp[0]=(rx_buf[1]*256+rx_buf[2])%10;
 }
 SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清除中斷標(biāo)志
 return revale;
}
/***********************************************************************************************************
/*函數(shù):void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:發(fā)送 tx_buf中數(shù)據(jù)
/**********************************************************************************************************/
/*void nRF24L01_TxPacket(uchar *tx_buf)
{
 CE=0;   //StandBy I模式 
 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 發(fā)射端地址
 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 裝載數(shù)據(jù) 
 SPI_RW_Reg(WRITE_REG + CONFIG, 0x1e);      // IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送
 CE=1;   //置高CE,激發(fā)數(shù)據(jù)發(fā)送
 inerDelay_us(20); 
}*/
shou.c
#include <reg52.h>
#include <intrins.h>
#include "api.h"
#include "nrf24l01+2.h"
#include "LCD1602display.h"

#define uchar unsigned char
#define uint unsigned int

uchar code  range[]="===TEMPERTURE===";
uchar code  ASCII[]="0123456789.";
uchar code table0[]="ROME TEMP:00.0C ";
uchar code table1[]="    ERRO !!!    "; 

 

//******************************溫度顯示
void display_DS18B20()  
{
 DisplayListChar(0, 1, table0);
 DisplayOneChar(10, 1, ASCII[ temp[2] ] );
 DisplayOneChar(11, 1, ASCII[ temp[1] ]  );
 DisplayOneChar(12, 1, ASCII[10] );
 DisplayOneChar(13, 1, ASCII[ temp[0] ] );
}

//*********************************主函數(shù)
void main()
{
 uchar RxBuf[20]={0};
 InitLCM();
 DisplayListChar(0,0,range);
 DisplayListChar(0,1,table0);
 init_NRF24L01();
 while(1)
 {
  nRF24L01_RxPacket(RxBuf);
  display_DS18B20();
  RxBuf[1]=0x00;
  RxBuf[2]=0x00;
 }

關(guān)閉窗口
主站蜘蛛池模板: 天天色天天色 | 在线看一区二区三区 | 欧美区日韩区 | 老牛影视av一区二区在线观看 | 久久大陆 | 精品一区二区久久久久久久网站 | 天天色综 | 亚洲高清视频在线 | 精品国产欧美一区二区 | 久久久精品网站 | 国产日韩91 | 少妇午夜一级艳片欧美精品 | 在线免费观看毛片 | 久久久久久久综合 | 国产精品成人一区二区 | 一区二区福利视频 | 国产ts人妖一区二区三区 | 亚洲一区 | 色在线看 | 一区二区三区国产精品 | 999久久久久久久久 国产欧美在线观看 | 欧美白人做受xxxx视频 | 日韩中文一区 | 亚洲大片一区 | 91久久国产综合久久91精品网站 | 久久久久久国产 | 一级高清免费毛片 | 人人插人人 | 欧美激情久久久久久 | 欧美日韩中文字幕在线 | 一区二区在线不卡 | 精品国偷自产在线 | 五月婷婷导航 | 欧美国产91| 国内精品久久久久久久 | 亚洲a网 | 亚洲九九色 | 亚州精品天堂中文字幕 | 久久一级大片 | 欧美日韩国产精品激情在线播放 | 日本黄色大片免费 |