<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年04月10日   【字體:





         

        //****************無線溫度發射部分*******************
        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   // 讀取接收數據指令
        #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  // 接收頻道1接收數據長度
        #define RX_PW_P2        0x13  // 接收頻道2接收數據長度
        #define RX_PW_P3        0x14  // 接收頻道3接收數據長度
        #define RX_PW_P4        0x15  // 接收頻道4接收數據長度
        #define RX_PW_P5        0x16  // 接收頻道5接收數據長度
        #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態寄存器設置
        #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;
        //**************************延時
        void delay();
        //**************************初始化
        void InitLCM();
        //****************************讀狀態
        uchar ReadStatusLCM();
        //******************************讀數據
        uchar ResdDataLCM();
        //***************************寫指令
        void WriteCommandLCM(uchar WCLCM, Busy);
        //***************************寫數據
        void WriteDataLCM(uchar WDLCM);
        //******************************顯示1個字符
        void DisplayOneChar(uchar X,uchar Y,uchar DData);
        //******************************顯示字符串
        void DisplayListChar(uchar X,uchar Y,uchar code  *DData);
        //********************延時
        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);  //三次顯示模式設置,不檢測忙信號
         delay(1);
         WriteCommandLCM(0x38,0);
         delay(1);
         WriteCommandLCM(0x38,0);
         delay(1);
         WriteCommandLCM(0x38,1);  //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
         WriteCommandLCM(0x0c,1);  //顯示模式設置:顯示開,無光標
         WriteCommandLCM(0x06,1);  //顯示模式設置:光標右移,字符不移
         WriteCommandLCM(0x01,1);  //清屏幕指令,將以前的顯示內容清除
        }
        //*********************讀狀態
        uchar ReadStatusLCM()
        {
         P0 = 0x80;
         LCM_RS = 0;
         LCM_RW = 1;
         LCM_E = 1;
         while (P0 & 0x80); //檢測忙信號
         return(0);
        }
        //***********************讀數據
        /*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;
        }
        //***********************寫數據
        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用來寫數據
        }
        //**************************顯示字符串
        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;
        //****************************************************函數聲明
        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;   //狀態標志
        sbit RX_DR =sta^6;
        sbit TX_DS =sta^5;
        sbit MAX_RT =sta^4;
        /******************************************************************************************
        /*延時函數
        /******************************************************************************************/
        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);    // 寫發射端地址 
         SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
         SPI_RW_Reg(WRITE_REG + EN_AA, 0x03);      //  頻道1自動 ACK應答允許 
         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03);  //  允許接收地址只有頻道1,如果需要多頻道可以參考Page21 
         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   設置信道工作為2.4GHZ,收發必須一致
         SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32字節
         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //設置發射速率為1MHZ,發射功率為最大值0dB
        }

         

         

         


        /****************************************************************************************************
        /*函數:uint SPI_RW(uint uchar)
        /*功能:NRF24L01的SPI寫時序
        /****************************************************************************************************/
        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
        }
        /****************************************************************************************************
        /*函數:uchar SPI_Read(uchar reg)
        /*功能:NRF24L01的SPI時序
        /****************************************************************************************************/
        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讀寫寄存器函數
        /****************************************************************************************************/
        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
        }
        /****************************************************************************************************/
        /*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
        /*功能: 用于讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
        /****************************************************************************************************/
        /*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
        }*/
        /*********************************************************************************************************
        /*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
        /*功能: 用于寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
        /*********************************************************************************************************/
        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;           //關閉SPI
         return(status);    //
        }
        /****************************************************************************************************/
        /*函數:void SetRX_Mode(void)
        /*功能:數據接收配置
        /****************************************************************************************************/
        /*void SetRX_Mode(void)
        {
         CE=0;
         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // IRQ收發完成中斷響應,16位CRC ,主接收
         CE = 1;
         inerDelay_us(130);
        } */
        /******************************************************************************************************/
        /*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
        /*功能:數據讀取后放如rx_buf接收緩沖區中
        /******************************************************************************************************/
        /*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收發完成中斷響應,16位CRC ,主接收
         CE = 1;
         inerDelay_us(130);
         sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
         if(RX_DR)    // 判斷是否接收到數據
         {
             CE = 0;    //SPI使能
          SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
          revale =1;   //讀取數據完成標志
          
         }
         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
         return revale;
        }*/
        /***********************************************************************************************************
        /*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
        /*功能:發送 tx_buf中數據
        /**********************************************************************************************************/
        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); // 發射端地址
         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 裝載數據 
         SPI_RW_Reg(WRITE_REG + CONFIG, 0x1e);      // IRQ收發完成中斷響應,16位CRC,主發送
         CE=1;   //置高CE,激發數據發送
         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;
        //********************延時
        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;     // 響應
         for(num=0;num<150;num++); //  60-240us ds18b20存在信號
         DQ=1;
         return flag;
        }
        //*******************************寫溫度數據
        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_();
         }  
        }
        //**********************************讀出溫度數據
        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;
        }
        //*********************************溫度計算
        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;
        //*******************************主函數
        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);
         }

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

         直接調用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;

        //****************************************************函數聲明
        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;   //狀態標志
        sbit RX_DR =sta^6;
        sbit TX_DS =sta^5;
        sbit MAX_RT =sta^4;
        /******************************************************************************************
        /*延時函數
        /******************************************************************************************/
        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);    // 寫發射端地址 
         SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
         SPI_RW_Reg(WRITE_REG + EN_AA, 0x03);      //  頻道1自動 ACK應答允許 
         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03); //允許頻道1,2 
         SPI_RW_Reg(WRITE_REG + RF_CH, 0);  //設置信道工作為2.4GHZ,收發必須一致
         SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32字節
         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);      //設置發射速率為1MHZ,發射功率為最大值0dB
        }

         


        /****************************************************************************************************
        /*函數:uint SPI_RW(uint uchar)
        /*功能:NRF24L01的SPI寫時序
        /****************************************************************************************************/
        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
        }
        /****************************************************************************************************
        /*函數:uchar SPI_Read(uchar reg)
        /*功能:NRF24L01的SPI時序
        /****************************************************************************************************/
        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讀寫寄存器函數
        /****************************************************************************************************/
        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
        }
        /****************************************************************************************************/
        /*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
        /*功能: 用于讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
        /****************************************************************************************************/
        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
        }
        /*********************************************************************************************************
        /*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
        /*功能: 用于寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
        /*********************************************************************************************************/
        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;           //關閉SPI
         return(status);    
        }
        /****************************************************************************************************/
        /*函數:void SetRX_Mode(void)
        /*功能:數據接收配置
        /****************************************************************************************************/
        /*void SetRX_Mode(void)
        {
         CE=0;
         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // IRQ收發完成中斷響應,16位CRC ,主接收
         CE = 1;
         inerDelay_us(130);
        } */
        /******************************************************************************************************/
        /*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
        /*功能:數據讀取后放如rx_buf接收緩沖區中
        /******************************************************************************************************/
        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收發完成中斷響應,16位CRC,主接收
         CE = 1;
         inerDelay_us(130);
         sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
         if(RX_DR)    // 判斷是否接收到數據
         {
             CE = 0;    //SPI使能
          SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
          revale =1;   //讀取數據完成標志
          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);   //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清除中斷標志
         return revale;
        }
        /***********************************************************************************************************
        /*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
        /*功能:發送 tx_buf中數據
        /**********************************************************************************************************/
        /*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); // 發射端地址
         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 裝載數據 
         SPI_RW_Reg(WRITE_REG + CONFIG, 0x1e);      // IRQ收發完成中斷響應,16位CRC,主發送
         CE=1;   //置高CE,激發數據發送
         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] ] );
        }

        //*********************************主函數
        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;
         }

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮