在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<s id="cmphk"><label id="cmphk"></label></s>
    <span id="cmphk"><var id="cmphk"></var></span>
    <dfn id="cmphk"><var id="cmphk"></var></dfn>
    <menu id="cmphk"><thead id="cmphk"></thead></menu>

    <address id="cmphk"></address>

      <dfn id="cmphk"></dfn>
      
      
      <span id="cmphk"></span>

      <object id="cmphk"><tt id="cmphk"></tt></object>
      1. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > NRF24L01發(fā)送程序(單片機是STC89C52)

        NRF24L01發(fā)送程序(單片機是STC89C52)

        作者: 時間:2016-11-27 來源:網絡 收藏
        #include

        #include
        typedef unsigned int uint;
        typedef unsigned char uchar;

        本文引用地址:http://www.biyoush.com/article/201611/322559.htm

        #define TX_ADDR_WITDH 5//發(fā)送地址寬度設置為5個字節(jié)
        #define RX_ADDR_WITDH 5//接收地址寬度設置為5個字節(jié)
        #define TX_DATA_WITDH 8//
        #define RX_DATA_WITDH 8

        #define R_REGISTER0x00// 讀寄存器
        #define W_REGISTER0x20// 寫寄存器
        #define R_RX_PLOAD0x61// 讀RX FIFO有效數據,1-32字節(jié),當讀數據完成后,數據被清除,應用于接收模式
        #define W_TX_PLOAD0xA0// 寫TX FIFO有效數據,1-32字節(jié),寫操作從字節(jié)0開始,應用于發(fā)射模式
        #define FLUSH_TX0xE1// 清除TX FIFO寄存器,應用于發(fā)射模式
        #define FLUSH_RX0xE2// 清除RX FIFO寄存器,應用于接收模式
        #define REUSE_TX_PL 0xE3// 重新使用上一包有效數據,當CE為高過程中,數據包被不斷的重新發(fā)射
        #define NOP0xFF// 空操作,可以用來讀狀態(tài)寄存器

        #define CONFIG0x00// 配置寄存器
        #define EN_AA0x01// “自動應答”功能寄存
        #define EN_RX_ADDR0x02// 接收通道使能寄存器
        #define SETUP_AW0x03// 地址寬度設置寄存器
        #define SETUP_RETR0x04// 自動重發(fā)設置寄存器
        #define RF_CH0x05// 射頻通道頻率設置寄存器
        #define RF_SETUP0x06// 射頻設置寄存器
        #define STATUS0x07// 狀態(tài)寄存器
        #define OBSERVE_TX0x08// 發(fā)送檢測寄存器
        #define CD0x09// 載波檢測寄存器
        #define RX_ADDR_P00x0A// 數據通道0接收地址寄存器
        #define RX_ADDR_P10x0B// 數據通道1接收地址寄存器
        #define RX_ADDR_P20x0C// 數據通道2接收地址寄存器
        #define RX_ADDR_P30x0D// 數據通道3接收地址寄存器
        #define RX_ADDR_P40x0E// 數據通道4接收地址寄存器
        #define RX_ADDR_P50x0F// 數據通道5接收地址寄存器
        #define TX_ADDR0x10// 發(fā)送地址寄存器
        #define RX_PW_P00x11// 數據通道0有效數據寬度設置寄存器
        #define RX_PW_P10x12// 數據通道1有效數據寬度設置寄存器
        #define RX_PW_P20x13// 數據通道2有效數據寬度設置寄存器
        #define RX_PW_P30x14// 數據通道3有效數據寬度設置寄存器
        #define RX_PW_P40x15// 數據通道4有效數據寬度設置寄存器
        #define RX_PW_P50x16// 數據通道5有效數據寬度設置寄存器
        #define FIFO_STATUS 0x17// FIFO狀態(tài)寄存器
        //*********************************************************************************
        uchar sta;// 狀態(tài)變量
        #define RX_DR(sta & 0x40)// 接收成功中斷標志
        #define TX_DS(sta & 0x20)// 發(fā)射成功中斷標志
        #define MAX_RT (sta & 0x10)// 重發(fā)溢出中斷標志
        sbit CE=P1^5;
        sbit IRQ=P1^0;
        sbit CSN=P1^4;
        sbit MOSI=P1^2;
        sbit MISO=P1^1;
        sbit SCK=P1^3;
        sbit LED=P0^0;

        uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
        uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
        uchar RX_Buffer[RX_DATA_WITDH];

        void _delay_us(uint x)
        {
        uint i,j;
        for (j=0;jfor (i=0;i<12;i++);
        }
        void _delay_ms(uint x)
        {
        uint i,j;
        for (j=0;jfor (i=0;i<120;i++);
        }
        //nRF24L01初始化
        void nRF24L01_Init(void)
        {
        CE=0;//待機模式Ⅰ
        CSN=1;
        SCK=0;
        IRQ=1;
        }
        //SPI時序函數
        uchar SPI_RW(uchar byte)
        {
        uchar i;
        for(i=0;i<8;i++)//一字節(jié)8位循環(huán)8次寫入
        {
        if(byte&0x80)//如果數據最高位是1
        MOSI=1;//向NRF24L01寫1
        else //否則寫0
        MOSI=0;
        byte<<=1;//低一位移到最高位
        SCK=1;//SCK拉高,寫入一位數據,同時讀取一位數據
        if(MISO)
        byte|=0x01;
        SCK=0;//SCK拉低
        }
        return byte;//返回讀取一字節(jié)
        }
        //SPI寫寄存器一字節(jié)函數
        //reg:寄存器地址
        //value:一字節(jié)(值)
        uchar SPI_W_Reg(uchar reg,uchar value)
        {
        uchar status;//返回狀態(tài)
        CSN=0;//SPI片選
        status=SPI_RW(reg);//寫入寄存器地址,同時讀取狀態(tài)
        SPI_RW(value);//寫入一字節(jié)
        CSN=1;//
        return status;//返回狀態(tài)
        }
        //SPI讀一字節(jié)
        uchar SPI_R_byte(uchar reg)
        {
        uchar reg_value;
        CSN=0;//SPI片選
        SPI_RW(reg);//寫入地址
        reg_value=SPI_RW(0);//讀取寄存器的值
        CSN=1;
        return reg_value;//返回讀取的值
        }
        //SPI讀取RXFIFO寄存器數據
        //reg:寄存器地址
        //Dat_Buffer:用來存讀取的數據
        //DLen:數據長度
        uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
        {
        uchar status,i;
        CSN=0;//SPI片選
        status=SPI_RW(reg);//寫入寄存器地址,同時狀態(tài)
        for(i=0;i{
        Dat_Buffer[i]=SPI_RW(0);//存儲數據
        }
        CSN=1;
        return status;
        }
        //SPI向TXFIFO寄存器寫入數據
        //reg:寫入寄存器地址
        //TX_Dat_Buffer:存放需要發(fā)送的數據
        //Dlen:數據長度
        uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
        {
        uchar status,i;
        CSN=0;//SPI片選,啟動時序
        status=SPI_RW(reg);
        for(i=0;i{
        SPI_RW(TX_Dat_Buffer[i]);//發(fā)送數據
        }
        CSN=1;
        return status;
        }
        //設置發(fā)送模式
        void nRF24L01_Set_TX_Mode(uchar *TX_Data)
        {
        CE=0;//待機(寫寄存器之前一定要進入待機模式或掉電模式)
        SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//寫寄存器指令+接收節(jié)點地址+地址寬度
        SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);//為了接收設備應答信號,接收通道0地址與發(fā)送地址相同
        SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);//寫有效數據地址+有效數據+有效數據寬度
        SPI_W_Reg(W_REGISTER+EN_AA,0x01);//接收通道0自動應答
        SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//使能接收通道0
        SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);//自動重發(fā)延時250US+86US,重發(fā)10次
        SPI_W_Reg(W_REGISTER+RF_CH,0);//2.4GHZ
        SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//1Mbps速率,發(fā)射功率:0DBM,低噪聲放大器增益
        SPI_W_Reg(W_REGISTER+CONFIG,0x0e);//發(fā)送模式,上電,16位CRC校驗,CRC使能
        CE=1;//啟動發(fā)射
        _delay_ms(5);//CE高電平持續(xù)時間最少10US以上
        }
        //檢測應答信號
        uchar Check_Ack(void)
        {
        sta=SPI_R_byte(R_REGISTER+STATUS);//讀取寄存狀態(tài)
        if(TX_DS||MAX_RT)//如果TX_DS或MAX_RT為1,則清除中斷和清除TX_FIFO寄存器的值
        {
        SPI_W_Reg(W_REGISTER+STATUS,0xff);
        CSN=0;
        SPI_RW(FLUSH_TX);//如果沒有這一句只能發(fā)一次數據,大家要注意
        CSN=1;
        return 0;
        }
        else
        return 1;
        }

        void main(void)
        {
        uchar i;
        P0=0xff;//初始化IO口
        P1=0xff;
        P2=0xff;
        P3=0xff;
        _delay_us(100);
        nRF24L01_Init();//NRF24L01初始化
        while(1)
        {
        for(i=0;i{
        nRF24L01_Set_TX_Mode(&TX_Buffer[i]);//發(fā)送數據
        while(Check_Ack());//等待發(fā)送完成
        LED=~LED;
        }
        }
        }



        評論


        技術專區(qū)

        關閉