欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: nrf241l01收發(fā)程序 [打印本頁]

作者: 婁航奇    時間: 2017-10-13 10:23
標(biāo)題: nrf241l01收發(fā)程序
#include <STC15W204S.h>
#include <Intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit MISO=P3^3; //主收從發(fā)
sbit MOSI=P3^6; //主發(fā)從收
sbit SCK=P3^7; //串行時鐘信號
sbit CE=P1^1; //芯片使能
sbit CSN=P1^0; //片選信號
sbit IRQ=P3^2; //中斷查詢
sbit ss=P1^2;
sbit xx=P1^3;
sbit cc=P1^4;
//sbit a=P1^4;
//sbit b=P1^5;
/*************************************************************/
//uchar seg[10]={~0x3f,~0x06,~0x5b,~0x4f,~0x66};
bit TxBufEndFlg = 1; //數(shù)據(jù)發(fā)送完成標(biāo)志
uchar checkack();
uchar TxBuf[20]={0};
uchar RxBuf[20]={0};
uchar SPI_RW(uchar uchars);
uchar SPI_Read(uchar reg);
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 KeyScanPrg();
uchar KeyState;
/************************************************************/
#define TX_ADR_WIDTH    5   //發(fā)送地址長度為5個字節(jié)
#define RX_ADR_WIDTH    5   //接收地址長度為5個字節(jié)
#define TX_PLOAD_WIDTH  20  //發(fā)送數(shù)據(jù)長度為20個字節(jié)
#define RX_PLOAD_WIDTH  20  //接收數(shù)據(jù)長度為20個字節(jié)
uchar code TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uchar code RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//SPI命令
#define READ_REG        0x00  //讀第0個寄存器
#define WRITE_REG       0x20  //寫第0個寄存器
#define RD_RX_PLOAD     0x61  //在接收模式下使用,讀有效數(shù)據(jù)
#define WR_TX_PLOAD     0xA0  //在發(fā)送模式下使用,寫有效數(shù)據(jù)
#define FLUSH_TX        0xE1  //在發(fā)送模式下使用,清TX FIFO寄存器
#define FLUSH_RX        0xE2  //在接收模式下使用,清RX FIFO寄存器
#define REUSE_TX_PL     0xE3  //發(fā)送方使用,重復(fù)發(fā)送最后的數(shù)據(jù)
#define NOP             0xFF  //空操作,用于讀狀態(tài)寄存器STATUS的值
//NRF24L01寄存器地址
#define CONFIG          0x00  //配置寄存器,8bit
#define EN_AA           0x01  //自動應(yīng)答設(shè)置寄存器,8bit
#define EN_RXADDR       0x02  //接收地址設(shè)置寄存器,8bit
#define SETUP_AW        0x03   //地址寬度設(shè)置寄存器,8bit
#define SETUP_RETR      0x04   //自動重復(fù)發(fā)送設(shè)置寄存器,8bit
#define RF_CH           0x05   // RF通道寄存器,8bit(工作頻率設(shè)置)
#define RF_SETUP        0x06   //RF設(shè)置寄存器,8bit(發(fā)射速率、功耗功能設(shè)置)
#define STATUS          0x07   //狀態(tài)寄存器,8bit
#define OBSERVE_TX      0x08   //發(fā)送檢測寄存器,8bit
#define CD              0x09   //載波檢測寄存器,8bit         
#define RX_ADDR_P0      0x0A   //接收地址數(shù)據(jù)通道0,40bit
#define RX_ADDR_P1      0x0B
#define RX_ADDR_P2      0x0C
#define RX_ADDR_P3      0x0D
#define RX_ADDR_P4      0x0E
#define RX_ADDR_P5      0x0F            
#define TX_ADDR         0x10   //發(fā)送地址,發(fā)送方使用,40bit
#define RX_PW_P0        0x11   //通道0接收的有效數(shù)據(jù)字節(jié)長度(1-32字節(jié)),8bit
#define RX_PW_P1        0x12
#define RX_PW_P2        0x13
#define RX_PW_P3        0x14
#define RX_PW_P4        0x15
#define RX_PW_P5        0x16
#define FIFO_STATUS     0x17   //FIFO棧入棧出狀態(tài)寄存器,8bit
//*********************************************************************************
void Delay(uint s);
void delayms(uchar z);
void inerDelay_us(uchar n);
void init_NRF24L01();
void nRF24L01_TxPacket(uchar * tx_buf);
void KeyDealPrg(uchar KeyState);
//**********************************************************************************
void inerDelay_us(uchar n)
{
for(;n>0;n--)
  _nop_();
}
//************************************************************************************
uchar  bdata sta;   //狀態(tài)標(biāo)志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
//***************************checkack函數(shù)********************************************
uchar checkack()
{
sta=SPI_Read(STATUS);   // 返回狀態(tài)寄存器
if(TX_DS || MAX_RT)   // 發(fā)送完畢中斷
{
if(MAX_RT)
init_NRF24L01();
TxBufEndFlg = 1;                                                  //接收完成
   SPI_RW_Reg(WRITE_REG+STATUS,0xff);   // 清除TX_DS或MAX_RT中斷標(biāo)志
  CSN=0;
        SPI_RW(FLUSH_TX); //在接收模式下,清空RX FIFO寄存器。在傳輸應(yīng)答信號時不應(yīng)執(zhí)行此操作,否則不能傳輸完整的應(yīng)答信號
     CSN=1;  
    return(1);
}
else
    return(0);
}
//***************************NRF24L01初始化********************************************
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0;    //芯片啟動
CSN=1;   //終止SPI讀寫
SCK=0;   //低電平為空閑時刻  
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 + SETUP_RETR, 0x4a); //自動延時1250us,自動重發(fā)10次
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //ENAA_P0=1,數(shù)據(jù)通道0自動應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // EN_RXADDR=1,接收地址允許
SPI_RW_Reg(WRITE_REG + RF_CH, 00);        //設(shè)置信道工作為2.4GHZ,收發(fā)必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為20字節(jié)
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x06);     //設(shè)置發(fā)射速率為250kbps,發(fā)射功率為0dBm,低噪聲放大器增益
}
//***************************************SPI操作***********************************************

uchar SPI_RW(uchar uchars)//寫一個字節(jié)到NRF24L01,并返回此時NRF24L01的狀態(tài)及數(shù)據(jù)
{
uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++)  //先寫字節(jié)的高位,再寫低位
    {
  MOSI = (uchars & 0x80);         //MOSI取uhcars最高位
  uchars = (uchars << 1);           //uchars左移一位
  SCK = 1;                      //SCK從高到低時開始寫入
  uchars |= MISO;           // 獲取MISO位,從MOSI寫命令的同時,MISO返回NRF24L01的狀態(tài)及數(shù)據(jù)
  SCK = 0;               
    }
    return(uchars);
}

uchar SPI_Read(uchar reg)//讀寄存器reg狀態(tài)字
{
uchar reg_val;
CSN = 0;                //CSN為0時,才能進行SPI讀寫
SPI_RW(reg);            //選擇寄存器reg
reg_val = SPI_RW(0);    //寫0,什么操作也不進行,僅僅為了讀寄存器狀態(tài)
CSN = 1;                //終止SPI讀寫
return(reg_val);      
}
uchar SPI_RW_Reg(uchar reg, uchar value)//將字節(jié)value寫入寄存器reg
{
uchar status;
CSN = 0;                   //CSN為0時,才能進行SPI讀寫
status = SPI_RW(reg);      //選擇寄存器reg
SPI_RW(value);             //寫字節(jié)value到該寄存器.
CSN = 1;                   //終止SPI讀寫
return(status);           
}

uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)//將數(shù)據(jù)寫入寄存器,如TX數(shù)據(jù),RX/TX地址等
{
uchar status,uchar_ctr;
CSN = 0;            // CSN為0時,才能進行SPI讀寫
    status = SPI_RW(reg);  //選擇寄存器reg并返回其狀態(tài)字
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)
SPI_RW(*pBuf++); //寫數(shù)據(jù)到寄存器
CSN = 1;           //終止SPI讀寫
return(status);    //返回狀態(tài)值
}
/***********************************************************************************************************
/*函數(shù):void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:發(fā)送 tx_buf中數(shù)據(jù)
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
   if(TxBufEndFlg)
{
CE=0;   //待機模式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);     //裝載數(shù)據(jù)
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      //CRC使能,CRC校驗值為2字節(jié),上電,設(shè)置為發(fā)射模式
CE=1;   //置高CE,激發(fā)數(shù)據(jù)發(fā)送
TxBufEndFlg = 0; //標(biāo)志位清0
inerDelay_us(1000);
}
}
/*****************************************************************************/
/*函數(shù):
/*功能:按鍵采集掃描
/*****************************************************************************/
uchar KeyScanPrg(void)
{
uchar KeyStateRAM=0x00;
KeyState=0x00;
KeyStateRAM|=ss;
KeyStateRAM<<=1;
KeyStateRAM|=xx;
KeyStateRAM<<=1;
KeyStateRAM|=cc;
KeyState=KeyStateRAM;
return(KeyState);
}
/*****************************************************************************/
/*函數(shù):
/*功能:按鍵處理
/*****************************************************************************/
void KeyDealPrg(uchar KeyStat)
{
switch(KeyStat)
  {                                   //    ss         xx          cc
  case 0x03:TxBuf[1]=0;TxBuf[2]=1;TxBuf[3]=0;TxBuf[4]=0;break;
  case 0x05:TxBuf[1]=0;TxBuf[2]=0;TxBuf[3]=1;TxBuf[4]=0;break;
  case 0x06:TxBuf[1]=0;TxBuf[2]=0;TxBuf[3]=0;TxBuf[4]=1;break;
  case 0x02:TxBuf[1]=0;TxBuf[2]=1;TxBuf[3]=0;TxBuf[4]=1;break;
  case 0x04:TxBuf[1]=0;TxBuf[2]=0;TxBuf[3]=1;TxBuf[4]=1;break;
  case 0x01:TxBuf[1]=0;TxBuf[2]=1;TxBuf[3]=1;TxBuf[4]=0;break;
  case 0x00:TxBuf[1]=0;TxBuf[2]=1;TxBuf[3]=1;TxBuf[4]=1;break;
  case 0x07:TxBuf[1]=1;TxBuf[2]=0;TxBuf[3]=0;TxBuf[4]=0;break;
  }
  nRF24L01_TxPacket(TxBuf);
  checkack();
}
/*****************************************************************************/
/*函數(shù):
/*功能:主函數(shù)
/*****************************************************************************/
void main(void)
{  ss=1;xx=1;cc=1;
   init_NRF24L01();
while(1)
{
KeyDealPrg(KeyScanPrg());
}
}


2.4G無線發(fā).rar

31.66 KB, 下載次數(shù): 14, 下載積分: 黑幣 -5

2.4G無線收.rar

28.09 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5


作者: 怪怪愛玩    時間: 2017-10-14 22:02
下載下來好好學(xué)習(xí),謝謝樓主
作者: ▓逍〓遙◆    時間: 2017-11-12 00:13

下來看看,謝謝分享!!!




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1