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

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

        NRF24l01無線溫度收發程序

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

        //發送:
        #include <reg52.h>
        #include <intrins.h>
        typedef unsigned char uchar;
        typedef unsigned char uint;
        //****************************************IO端口定義*********************************************
        sbit MISO =P1^2;
        sbit MOSI =P3^2;
        sbit SCK =P1^6;
        sbit CE =P1^5;
        sbit CSN =P1^7;
        sbit IRQ =P1^3;
        //*****************************************DS1820端口設置****************************************
        sbit DQ=P2^5 ;
        //*******************************************按鍵*************************************************
        sbit KEY1=P3^6;
        sbit KEY2=P3^7;
        //************************************數碼管位選**************************************************
        sbit led3=P2^3;
        sbit led2=P2^2;
        sbit led1=P2^1;
        sbit led0=P2^0;
        //***********************************數碼管0-9編碼***********************************************
        uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段碼
        uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
        uchar data temp_data[2]={0x00,0x00}; //溫度采集數據緩沖區
        uchar dispaly[7]; //顯示緩沖區
        //******************************************************************************************
        uint bdata sta; //NRF24L01狀態標志
        sbit RX_DR =sta^6;
        sbit TX_DS =sta^5;
        sbit MAX_RT =sta^4;
        //*************************************NRF24L01**************************************************
        #define TX_ADR_WIDTH 5 // 本機地址寬度設置
        #define RX_ADR_WIDTH 5 // 接收方地址寬度設置
        #define TX_PLOAD_WIDTH 20 // 4 字節數據長度
        #define RX_PLOAD_WIDTH 20 // 4 字節數據長度
        uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
        uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
        //*****************************NRF24L01寄存器指令,詳細請對照,Page18******************************
        #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)寄存器地址,詳細請對照,Page18-24**********************
        #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棧入棧出狀態寄存器設置
        //************************************NRF24L01函數申明**********************************************
        void Delay(unsigned int s);
        void inerDelay_us(unsigned char n);
        void init_NRF24L01(void);
        uint SPI_RW(uint uchar);
        uchar SPI_Read(uchar reg);
        void SetRX_Mode(void);
        uint SPI_RW_Reg(uchar reg, uchar value);
        uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
        uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
        unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
        void nRF24L01_TxPacket(unsigned char * tx_buf);
        //************************************DS18B20函數申明**********************************************
        void delay1(uint i);
        void ds_reset(void);
        void write_byte(uchar value);
        uchar read_byte(void);
        void read_temp();
        void work_temp();
        //*****************************************長延時*****************************************
        void Delay(unsigned int s)
        {
        unsigned int i;
        for(i=0; i<s; i++);
        for(i=0; i<s; i++);
        }
        /******************************************************************************************
        /*延時函數
        /******************************************************************************************/
        void inerDelay_us(unsigned char 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 clock line init high
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
        SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設置信道工作為2.4GHZ,收發必須一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為4字節
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1Mkbps,發射功率為最大值0dB
        }
        /****************************************************************************************************
        /*函數:uint SPI_RW(uint uchar)
        /*功能:NRF24L01的SPI寫時序,詳細看時序圖,Page19
        /****************************************************************************************************/
        uint SPI_RW(uint uchar)
        {
        uint bit_ctr;
        for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
        {
        MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
        uchar = (uchar << 1); // shift next bit into MSB..
        SCK = 1; // Set SCK high..
        uchar |= MISO; // capture current MISO bit
        SCK = 0; // ..then set SCK low again
        }
        return(uchar); // return read uchar
        }
        /****************************************************************************************************
        /*函數:uchar SPI_Read(uchar reg)
        /*功能:NRF24L01的SPI時序,詳細看時序圖,Page19
        /****************************************************************************************************/
        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讀寫寄存器函數,
        /****************************************************************************************************/
        uint SPI_RW_Reg(uchar reg, uchar value)
        {
        uint 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:讀出數據的個數
        /****************************************************************************************************/
        uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
        {
        uint 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:寫入數據的個數
        /*********************************************************************************************************/
        uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
        {
        uint 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接收緩沖區中
        /******************************************************************************************************
        unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
        {
        unsigned char revale=0;
        sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
        if(RX_DR) // 判斷是否接收到數據
        {
        CE = 0; //SPI使能
        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_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(unsigned char * tx_buf)
        {
        CE=0; //StandBy I模式
        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, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
        CE=1; //置高CE,激發數據發送
        inerDelay_us(10);
        }
        /***********************************************************************************************************
        /*以下是DS18B20溫度傳感相關函數
        /**********************************************************************************************************/
        void delay1(uint i)
        {
        for(;i>0;i--);
        }
        //****************************************************DS1820復位函數***************************************
        void ds_reset(void)
        {
        char temp=1;
        while(temp)
        {
        while(temp)
        {
        DQ=1;_nop_();_nop_();
        DQ=0;
        delay1(80);
        DQ=1;
        delay1(9);
        temp=DQ;
        }
        delay1(64);
        temp=~DQ;
        }
        DQ=1;
        }
        //***********************************************DS1820寫函數*********************************************
        void write_byte(uchar value)
        {
        uchar i;
        for(i=8;i>0;i--)
        {
        DQ=1;_nop_();_nop_();
        DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
        DQ=value&0x01;
        delay1(9);
        value>>=1;
        }
        DQ=1;
        delay1(1);
        }
        //****************************************************DS1820讀函數*****************************************
        uchar read_byte(void)
        {
        uchar i;
        uchar value1=0;
        for(i=8;i>0;i--)
        {
        DQ=1;_nop_();_nop_();
        value1>>=1;
        DQ=0;
        _nop_();_nop_();_nop_();_nop_();
        DQ=1;
        _nop_();_nop_();_nop_();_nop_();
        if(DQ)
        value1|=0x80;
        delay1(9);
        }
        DQ=1;
        return(value1);
        }
        //****************************************************讀取溫度**********************************************
        void read_temp()
        {
        ds_reset();
        write_byte(0xcc);
        write_byte(0xbe);
        temp_data[0]=read_byte();
        temp_data[1]=read_byte();
        ds_reset();
        write_byte(0xcc);
        write_byte(0x44);
        }
        //****************************************************溫度處理*********************************************
        void work_temp()
        {
        uchar n=0;
        if(temp_data[1]>127)
        {
        temp_data[1]=(256-temp_data[1]); //負值
        temp_data[0]=(256-temp_data[0]);
        n=1;
        }
        dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
        dispaly[5]=dispaly[6]/100; //百位
        dispaly[4]=dispaly[6]%100; //
        dispaly[2]=dispaly[4]/10; //十位
        dispaly[1]=dispaly[4]%10; //個位
        switch (temp_data[0]&0x0f) //小數位
        {
        case 0x0f:dispaly[0]=9;break;
        case 0x0e:dispaly[0]=9;break;
        case 0x0d:dispaly[0]=8;break;
        case 0x0c:dispaly[0]=8;break;
        case 0x0b:dispaly[0]=7;break;
        case 0x0a:dispaly[0]=6;break;
        case 0x09:dispaly[0]=6;break;
        case 0x08:dispaly[0]=5;break;
        case 0x07:dispaly[0]=4;break;
        case 0x06:dispaly[0]=4;break;
        case 0x05:dispaly[0]=3;break;
        case 0x04:dispaly[0]=3;break;
        case 0x03:dispaly[0]=2;break;
        case 0x02:dispaly[0]=1;break;
        case 0x01:dispaly[0]=1;break;
        case 0x00:dispaly[0]=1;break;
        default:break;
        }
        if(n) //負值時顯示aa,正直顯示dd
        {
        dispaly[3]=0x11; //
        }
        else dispaly[3]=0x22;
        }
        //****************************************************溫度顯示****************************************************
        void disdignit()
        {
        P0=0xC6;
        led0=0;
        delay1(40);
        led0=1;
        P0=seg[dispaly[0]];
        led1=0;
        delay1(40);
        led1=1;
        P0=seg1 [dispaly[1]];
        led2=0;
        delay1(40);
        led2=1;
        P0=seg[ dispaly[2]];
        led3=0;
        delay1(40);
        led3=1;

        }
        //************************************主函數************************************************************
        void main(void)
        {
        uchar i=0;
        // uchar TxBuf[4]={0}; //4字節發送數據緩沖區
        init_NRF24L01() ; //NRF24L01初始化配置
        ds_reset();
        write_byte(0xcc);
        write_byte(0x44);
        Delay(6000);
        while(1)
        {
        if(i==3)
        {
        i=0;
        read_temp();
        work_temp();
        delay1(500);
        }
        i++;
        disdignit();
        nRF24L01_TxPacket(dispaly); // Transmit Tx buffer data
        SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
        }

        }

         

         


        //接受

        #include <reg52.h>
        #include <intrins.h>
        typedef unsigned char uchar;
        typedef unsigned char uint;
        //****************************************IO端口定義***************************************
        sbit MISO =P1^2;
        sbit MOSI =P3^2;
        sbit SCK =P1^6;
        sbit CE =P1^5;
        sbit CSN =P1^7;
        sbit IRQ =P1^3; //未用
        //************************************繼電器**********************************************
        sbit JDQ=P2^6;
        //************************************按鍵**********************************************
        sbit KEY1=P3^6;
        sbit KEY2=P3^7;
        //***********************************數碼管位選**************************************************
        sbit led1=P2^1;
        sbit led0=P2^0;
        sbit led2=P2^2;
        sbit led3=P2^3;
        //***********************************數碼管0-9編碼*******************************************
        uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段碼
        uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //0~~9段碼
        char temp[6];
        uchar RxBuf[20]={0};
        //*********************************************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
        uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
        uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
        //***************************************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 Delay(unsigned int s);
        void inerDelay_us(unsigned char n);
        void init_NRF24L01(void);
        uint SPI_RW(uint uchar);
        uchar SPI_Read(uchar reg);
        void SetRX_Mode(void);
        uint SPI_RW_Reg(uchar reg, uchar value);
        uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
        uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
        unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
        void nRF24L01_TxPacket(unsigned char * tx_buf);
        //*****************************************長延時*****************************************
        void Delay(unsigned int s)
        {
        unsigned int i;
        for(i=0; i<s; i++);
        for(i=0; i<s; i++);
        }
        //******************************************************************************************
        uint bdata sta; //狀態標志
        sbit RX_DR =sta^6;
        sbit TX_DS =sta^5;
        sbit MAX_RT =sta^4;
        /******************************************************************************************
        /*延時函數
        /******************************************************************************************/
        void inerDelay_us(unsigned char 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 clock line init high
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應答允許
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道,可以參考Page21
        SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設置信道工作為2.4GHZ,收發必須一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32紙?
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1MHZ,發射功率為最大值0dB
        }
        /****************************************************************************************************
        /*函數:uint SPI_RW(uint uchar)
        /*功能:NRF24L01的SPI寫時序
        /*詳細請參考Page19
        /****************************************************************************************************/
        uint SPI_RW(uint uchar)
        {
        uint bit_ctr;
        for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
        {
        MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI
        uchar = (uchar << 1); // shift next bit into MSB..
        SCK = 1; // Set SCK high..
        uchar |= MISO; // capture current MISO bit
        SCK = 0; // ..then set SCK low again
        }
        return(uchar); // return read uchar
        }
        /****************************************************************************************************
        /*函數:uchar SPI_Read(uchar reg)
        /*功能:NRF24L01的SPI時序
        /*詳細請參考Page19
        /****************************************************************************************************/
        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讀寫寄存器函數
        /****************************************************************************************************/
        uint SPI_RW_Reg(uchar reg, uchar value)
        {
        uint 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:讀出數據的個數
        /****************************************************************************************************/
        uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
        {
        uint 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:寫入數據的個數
        /*********************************************************************************************************/
        uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
        {
        uint 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接收緩沖區中
        /******************************************************************************************************/
        unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
        {
        unsigned char revale=0;
        sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
        if(RX_DR) // 判斷是否接收到數據
        {
        CE = 0;
        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_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(unsigned char * tx_buf)
        {
        CE=0; //StandBy I模式
        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, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
        CE=1; //置高CE,激發數據發送
        inerDelay_us(10);
        }
        //***********************************************串口初始化***********************************************
        void StartUART( void )
        {
        SCON = 0x50;
        TMOD = 0x20;
        TH1 = 0xFA;
        TL1 = 0xFA; //波特率4800
        PCON = 0x00;
        TR1 = 1;
        }
        //***********************************************通過串口向PC發送***********************************************
        void R_S_Byte(uchar R_Byte)
        {
        SBUF = R_Byte;
        while( TI == 0 ); //查詢法
        TI = 0;
        }
        //***********************************************數碼動態掃描顯示***********************************************
        void disdignit()
        {
        P0=0xC6; //C
        led0=0;
        Delay(80);
        led0=1;
        P0=seg[temp[1]]; //小數位
        led1=0;
        Delay(80);
        led1=1;
        P0=seg1[temp[5]]; //十位
        led2=0;
        Delay(80);
        led2=1;
        P0=seg[temp[4]]; //個位
        led3=0;
        Delay(80);
        led3=1;
        }
        //************************************主函數************************************************************
        void main(void)
        {
        uchar i=0;
        init_NRF24L01() ; //NRF24L01初始化
        StartUART();
        Delay(6000);
        while(1)
        {
        //***********************************************************************************************
        SetRX_Mode();
        if(nRF24L01_RxPacket(RxBuf))
        {
        temp[0]=RxBuf[3]; //符號位
        temp[2]=((RxBuf[2]<<4)|RxBuf[1]); //整數位
        temp[1]=RxBuf[0]; //小數位
        temp[4]=RxBuf[2]; //十位
        temp[5]=RxBuf[1]; //個位
        for(i=0;i<3;i++)
        {
        R_S_Byte(temp[2-i]); //串口顯示溫度
        Delay(60);
        }
        if(temp[2]>=50) //大于32度時報警,0x30轉換成10進制為48
        {
        JDQ=0; //打開繼電器?梢赃M行相關電器開關操作
        }
        else
        {
        JDQ=1; //關閉繼電器
        }
        disdignit(); //數碼管顯示溫度
        }
        }
        }
         

        關閉窗口

        相關文章

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