找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5947|回復: 10
打印 上一主題 下一主題
收起左側(cè)

NRF24L01無線模塊接收-AVR程序代碼

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:51024 發(fā)表于 2014-7-12 01:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
                        以前學AVR時候?qū)懙囊恍┏绦,分享一?br />
#include
#include   
#include "lcd12864.h"
#define uint unsigned int
#define uchar unsigned char
#define MISO PINB.6
#define SCK PORTB.7
#define MOSI PORTB.5
#define CSN PORTC.0
#define CE PORTC.1
#define IRQ PORTC.2  
#define CONFIG          0x00  // 配置收發(fā)狀態(tài),CRC校驗模式以及收發(fā)狀態(tài)響應方式
#define EN_AA 0x01//自動應答使能
#define EN_RXADDR 0x02   //接收地址允許
#define SETUP_AW 0x03  //設(shè)置地址寬度
#define SETUP_RETR 0x04  //建立自動重發(fā)
#define RF_CH 0x05  //射頻通道
#define RF_SETUP 0x06  //射頻寄存器
#define STATUS 0x07  //狀態(tài)寄存器
#define OBSTERVE_TX 0x08  //發(fā)送檢測寄存器
#define CD 0x09  //載波檢測
#define RX_ADDR_P0 0x0a  //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P1 0x0b  //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P2 0x0c  //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P3 0x0d  //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P4 0x0e  //數(shù)據(jù)通道0接收地址
#define RX_ADDR_P5 0x0f  //數(shù)據(jù)通道0接收地址
#define TX_ADDR 0x10  //發(fā)送地址
#define RX_PW_P0 0x11  //  
#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)寄存器  
#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      // 定義重復裝載數(shù)據(jù)指令
#define NOP             0xFF      // 保留      
#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 status;
uchar  sta;
uchar str[30];
uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0x05,0x04,0x03,0x02,0x01};    //本地地址
uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0x05,0x04,0x03,0x02,0x01};    //接收地址
uchar TxBuf[5]={0x65,0x98,0xf3,0x02,0x08};
uchar SPI_RW(uchar uuchar)//SPI寫時序
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
  {
  MOSI=(uuchar&0x80);
  uuchar=(uuchar<<1);
  SCK=1;
  uuchar|=MISO;
  SCK=0;
  }
return (uuchar);
}   
uchar SPI_Read(uchar reg)//SPI讀取一個字節(jié)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
delay_ms(1);
reg_val=SPI_RW(0);
delay_ms(1);
CSN=1;
return (reg_val);
}
uchar SPI_RW_Reg(uchar reg,uchar value)//寫一個自接到寄存器函數(shù)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
delay_ms(1);
SPI_RW(value);
delay_ms(1);
CSN=1;
return (status);
}
uchar  *ucharostr(uchar num)
{
uchar x00,xx,x0,x,n;
x00=num/100;
xx=num0;
x0=xx/10;
x=xx;
n=0;
if(x00!=0)
  {
  str[n]=x00+48;
  n++;
  }
if(!(x00==0&x0==0))
  {
  str[n]=x0+48;
  n++;
  }
str[n]=x+48;
n++;
str[n]='\0';
return str;
}
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar uchars)//用于讀數(shù)據(jù),reg:寄存器地址,pBuf:帶度數(shù)數(shù)據(jù)地址,uchars數(shù)據(jù)個數(shù)
{
uchar status,uchar_ctr;
CSN=0;
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr
  {
  pBuf[uchar_ctr]=SPI_RW(0);
  }
  CSN=1;
    return (status);
}  
   
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
        SPI_RW(*pBuf++);
    CSN = 1;           //關(guān)閉SPI
    return(status);    //
}
void init_NRF24L01(void)
{
delay_us(100);
CE=0; //射頻停止工作
CSN=1;
SCK=0;
IRQ=1;//中斷復位
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,0x00);//頻道0自動,ACK應答禁止
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//允許接收地址只有頻道0
SPI_RW_Reg(WRITE_REG+RF_CH,1);//設(shè)置信道工作2.4GHZ,收發(fā)必須一致
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//設(shè)置接收數(shù)據(jù)長度,32字節(jié)
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//發(fā)射速率2MHZ,發(fā)射功率最大為0dB
}
void SetRX_Mode(void)//設(shè)置數(shù)據(jù)接收模式
{
CE=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ中斷響應,16CRC,接收模式
CE=1;
delay_us(130);
}  
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
uchar revale=0;
sta=SPI_Read(STATUS);
if(sta&0x40)//判斷是否接受到數(shù)據(jù)RX_DR
   {
   CE=0;
   SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//讀取接收數(shù)據(jù)  
   revale=1;
   SPI_RW_Reg(WRITE_REG+STATUS,0xff);//1清楚中斷標志
   }
return revale;
}
void main(void)
{
uchar i;
uchar RxBuf[32];
uchar Buf0[5]={0,0,0,0,0};
i=0;
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xB0;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0xff;
DDRC=0xff;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
lcd12864_init();
delay_ms(10);
init_NRF24L01();  
IRQ=1;
SPI_Read_Buf(RX_ADDR_P0,Buf0,5);//讀取0通道接收地址
delay_ms(100);
lcd12864_puts(ucharostr(Buf0[0]));
lcd12864_puts(ucharostr(Buf0[1]));
lcd12864_puts(ucharostr(Buf0[2]));
lcd12864_puts(ucharostr(Buf0[3]));
lcd12864_puts(ucharostr(Buf0[4]));
delay_ms(20);
SetRX_Mode();
delay_ms(50);
while (1)
      {
      SetRX_Mode();
      delay_ms(20);
      i=SPI_Read(CD);
      if(i)//如果檢測到中斷產(chǎn)生
      { nRF24L01_RxPacket(RxBuf);
        delay_ms(10);
        lcd12864_gotoxy(0,0);
        for(i=0;i<5;i++)
        {
        lcd12864_putchar(RxBuf);
        delay_ms(2); }
     
        for(i=5;i<10;i++)
        {
        lcd12864_putchar(RxBuf);
        delay_ms(2);
        }     
         
         for(i=10;i<16;i++)
        {
        lcd12864_putchar(RxBuf);
        delay_ms(2);
        }
        
        
        i=0;
        }
};
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:23978 發(fā)表于 2014-7-25 08:41 | 只看該作者
還不錯哦。。
回復

使用道具 舉報

板凳
ID:66000 發(fā)表于 2014-9-13 10:17 | 只看該作者
謝謝分享
回復

使用道具 舉報

地板
ID:66061 發(fā)表于 2014-9-18 10:13 | 只看該作者
樓主好厲害,,,
回復

使用道具 舉報

5#
ID:29972 發(fā)表于 2014-11-20 17:43 | 只看該作者
感覺這個模塊有點難!
回復

使用道具 舉報

6#
ID:69421 發(fā)表于 2014-11-25 19:04 | 只看該作者
學習一下哈
回復

使用道具 舉報

7#
ID:72611 發(fā)表于 2015-3-29 21:18 | 只看該作者
謝謝分享
回復

使用道具 舉報

8#
ID:72073 發(fā)表于 2015-4-1 13:49 | 只看該作者
謝謝分享
回復

使用道具 舉報

9#
ID:72611 發(fā)表于 2015-4-4 17:35 | 只看該作者
學習了謝謝分享
回復

使用道具 舉報

10#
ID:83083 發(fā)表于 2015-8-10 01:35 | 只看該作者
在里面沒找到我想要的東西。學姐可以教教嗎
回復

使用道具 舉報

11#
ID:83422 發(fā)表于 2015-8-19 14:14 | 只看該作者
程序?qū)懙牟诲e
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表