NRF24L01无线模块接收-AVR程序代码

发布者:lambda21最新更新时间:2017-11-23 来源: eefocus关键字:NRF24L01  无线模块接收  AVR 手机看文章 扫描二维码
随时随地手机看文章

#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  // 配置收发状态,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 OBSTERVE_TX 0x08  //发送检测寄存器

#define CD 0x09  //载波检测

#define RX_ADDR_P0 0x0a  //数据通道0接收地址

#define RX_ADDR_P1 0x0b  //数据通道0接收地址

#define RX_ADDR_P2 0x0c  //数据通道0接收地址

#define RX_ADDR_P3 0x0d  //数据通道0接收地址

#define RX_ADDR_P4 0x0e  //数据通道0接收地址

#define RX_ADDR_P5 0x0f  //数据通道0接收地址

#define TX_ADDR 0x10  //发送地址

#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状态寄存器  

#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      // 保留       

#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读取一个字节

{

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)//写一个自接到寄存器函数

{

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)//用于读数据,reg:寄存器地址,pBuf:带度数数据地址,uchars数据个数

{

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;           //关闭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);//设置信道工作2.4GHZ,收发必须一致

SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置接收数据长度,32字节

SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//发射速率2MHZ,发射功率最大为0dB

}

 

 

 

void SetRX_Mode(void)//设置数据接收模式

{

CE=0;

SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//IRQ中断响应,16位CRC,接收模式

CE=1;

delay_us(130);

}  

 

 

uchar nRF24L01_RxPacket(uchar *rx_buf)

{

uchar revale=0;

sta=SPI_Read(STATUS);

if(sta&0x40)//判断是否接受到数据RX_DR

   {

   CE=0;

   SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//读取接收数据  

   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)//如果检测到中断产生

      { nRF24L01_RxPacket(RxBuf);

        delay_ms(10);

        lcd12864_gotoxy(0,0);

        for(i=0;i<5;i++)

        {

        lcd12864_putchar(RxBuf[i]);

        delay_ms(2); }

     

        for(i=5;i<10;i++)

        {

        lcd12864_putchar(RxBuf[i]);

        delay_ms(2);

        }     

         

         for(i=10;i<16;i++)

        {

        lcd12864_putchar(RxBuf[i]);

        delay_ms(2);

        }

        

        

        i=0;

        }

 };

}


关键字:NRF24L01  无线模块接收  AVR 引用地址:NRF24L01无线模块接收-AVR程序代码

上一篇:NRF24L01无线模块发送-AVR程序代码
下一篇:超声波测距-AVR程序代码

推荐阅读最新更新时间:2024-03-16 15:46

AVR单片机实践--ATmega16按键控制流水灯
一、实验目的 1.掌握AVR单片机开发平台的搭建方法。 2.掌握GPIO的编程方法。 二、实验内容及结果 1.设计程序 自行设计电路,包括流水灯和4个按键,完成“按键控制流水灯样式”的程序编写与调试。 具体要求如下: (1)初始状态下,所有LED灯点亮; (2)K1为启/停键,按下后控制LED流水灯按照当前指定样式运行或停止; (3)K2为流水灯样式选择键,分两种样式,默认为样式1。每次按下K2当前样式立即转变。 样式1:每次仅一个LED熄灭,熄灭LED从L0至L7转移,如此循环运行。 样式2:每次仅一个LED熄灭,熄灭LED从L7至L0转移,如此循环运行。 2.实验结果 (1)在下方贴出使用Proteus绘制的电
[单片机]
<font color='red'>AVR</font>单片机实践--ATmega16按键控制流水灯
AVR的I/O用法笔记
AVR的I/O有三个寄存器,DDRX,PORTX,PINX。 DDRX 方向,DDRX=1,输出;DDRX=0,输入。 例如设置PA0口为输入,即可写成DDRA&=~(1 PORTX 分两种情况 如果DDR=1,即在输出状态的话,那么通过设置PORTX的值改变IO端口的电平 如果DDR=0,即在输入状态的话,那么PORT=1则使能上拉电阻,否则不使能。 PINX 此寄存器表示了该端口的实际电平,所以读I/O口的话,应该读PINX,而不是PORTX。 每个I/O口可以输出或吸纳20mA的电流,这一点在设计上要注意。 比如连接LED,键盘等。 以LED为例,LED上的压降是2v左右,正常的工作电流应
[单片机]
利用Ultra Edit提高ICC AVR开发效率!!!
1.为什么还有这么多人选择AVR单片机? 鄙人在大学时候接触到了51单片机,作为一个初学者,C51是一款相当不错的选择,对于我来说,他从内部硬件到软件有着属于自己的一套完整的按位操作的系统。这样对于新手可以更加简单粗暴的进行定义和操作。其次新手不需要较大的运算量,太高的工作频率,但是却配有丰富的外围module。满足初学者小小的技能炫耀足矣,极佳的入门经典。 话说回来,当你入门以后,想要针对性的做出一些稳定性的小东西进行提高,你会发现C51已经不足以满足你的小野心,但是学习其他高级的MCU你又信心不足,这时候AVR单片机会是个不错的选择。相较于51,他有很多自己的优势,突出的优势比如速度更快、片上资源更丰富,IO驱动能力
[单片机]
利用Ultra Edit提高ICC <font color='red'>AVR</font>开发效率!!!
AVR芯片熔丝补救方法
并行编程,最早的编程方法,功能最强大,但需要连接较多的引脚,通常需要12V~24V的高压,以示区别,下面称为 高压并行编程。 ISP(In System Programmability) 在系统编程,简称为 串行下载 IAP(In Appl IC ation Programing) 在应用编程,BootLoader也是类似的意思 1 ISP虽然利用了SPI接口(例外:M64/M128为UASRT0接口,Tiny13等没有SPI接口)的引脚,但只在复位时起作用,而且下载完成后合格的下载器会自动断开端口的连接,对正常工作时没有影响的( 在产品应用中,下载器一定是不会一直粘在上面的)。 2 虽然高压并行下载能修复任何熔丝位,但
[单片机]
NRF24L01无线串口开发板程序详解
1.源程序开发环境建立 1.1程序编译软件 编译软件用keil C51,打开安装文件,一路点击下一步即可完成。 1.2程序下载软件 使用STC ISP下载软件。 2.源程序文件整体结构 工程中,只有一个main.c文件,所有程序都写在这个文件里面。Reg51.h是包含的头文件。是不是非常简单! 3.源程序执行流程 无线数据处理程序: 串口数据处理程序: 4.串口配置函数 void serial_open(void) { SCON = 0X50; AUXR |= 0X04; TL2 = 0Xc0; // 9600 TH2 = 0Xfd; AUXR|=0X10; } 此串口配置函数,利用单片机内部
[单片机]
<font color='red'>NRF24L01</font>无线串口开发板程序详解
嵌入式C语言编程与AVR技巧(一)——C语言环境访问MCU寄存器
单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对其访问归纳起来有两种方法。 1、采用标准C的强制类型转换和指针来实现 采用标准C的强制转换和指针的概念来实现访问MCU的寄存器,例如: #define DDRB (*(volatile unsigned char *)0x25) 分析如下: A:(unsigned char *)0x25中的0x25只是个值,前面加(unsigned char *)表示0x25是个地址,而且这个地址所存储的数据的数据类型是unsigned char,意思就是说读/写这个地址时,要写进unsigned char的值,读出也是unsigned char的值。 (
[单片机]
AVR单片机的RC5和RC6算法比较与改进
摘要:RC5及RC6是两种新型的分组密码。AVR高速嵌入式单片机功能强大,在无线数据传输应用方面很有优势。本文基于Atmega128高速嵌入式单片机,实现RC5和RC6加密及解密算法,并对算法进行汇编语言的优化及改进。根据实验结果。对两种算法的优热点进行比较和分析。 关键词:Atmega128 RC5 RC6 分组密码 混合密钥 Flash 引言 在无线局域网中,传输的介质主要是无线电波和红外线,任何具有接收能力的窍听者都有可能拦截无线信道中的数据,掌握传输的内容,造成数据泄密。因此,对于无线局域网来说,数据的加密是关键技术之一。 AVR高速嵌入式单片机是8位RISC MCU,执行大多数指令只需一个时钟周期,速度快(8M
[单片机]
基于AVR单片机与FPGA的低频数字式相位测量仪
摘要:提出了以AVR ATmega128单片机和Altera公司的Cyclone系列EP1C3T100为核心的系统设计方案。分析了数字式低频相位测量仪的测量原理和测量误差及其消除的方法。利用单片机强劲的运算、控制功能和FPGA运算速度快、资源丰富的特点。主要介绍了系统的软硬件设计。实践表明,此方案设计的相位仪对低频正弦波信号实现精确测频和测相位差,具有处理速度快、稳定可靠、精度高等优点。 关键词:数字相位仪;单片机;FPGA;误差;频率;相位差 在工业领域中经常要用到低频数字式相位仪来精确测量两信号之问的相位差,比如在电力系统、频率特性的研究、激光测距等领域均有广泛的应用,相位检测的精度直接决定系统的整体性能。这就要求测量仪
[嵌入式]
基于<font color='red'>AVR</font>单片机与FPGA的低频数字式相位测量仪
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved