哈尔滨理工大学论坛|23度空间

 找回密码
 快速注册
搜索
查看: 6598|回复: 0
打印 上一主题 下一主题

[电子通信] 低价促销

[复制链接]
跳转到指定楼层
1#
发表于 2010-12-20 17:43:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超低价(55元)NRF24LE1 无线通讯模块/语音模块/24L01/905
NRF24LE1==NRF24L01+MCU 内带MCU  体积更小

NORDIC最新推出nRF24LE1= 2.4GHz + Flash 51+ADC +DAC + I2C + PWM+UART+SPI..

  nRF24LE1采用了Nordic最新的无线和超低功耗技术,在一个极小封装中集成了包括2.4GHz无线传输,增强型51 Flask高速单片机,丰富外设及接口等的单片Flash芯片,是一个综合了性能及成本的完美结合,很适合应用于各种2.4GHz的产品设计。

本模块提供测试程序

    接口图

   

发送程序

/*********************************************************************
功能:
RFID TARGET发射程序
说明:
本程序采用定时2秒发射ID一次,发射完毕进入低功耗模式,低功耗电流3uA
ID长度为6 byte
**********************************************************************/


#include
#include
#include "API.h"

//#define PIN24
#define PIN32
//#define PIN48

#ifdef  PIN24
sbit S3  = P0^6;                                // 1/0=未按/按下
sbit S2  = P0^4;                                // 1/0=未按/按下
sbit S1  = P0^3;                                // 1/0=未按/按下

sbit LED3 = P0^2;                           // 1/0=灭/亮
sbit LED2 = P0^1;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir 0xd8
#define p1dir 0xff
#endif

#ifdef  PIN32
sbit S3  = P1^4;                                // 1/0=未按/按下
sbit S2  = P1^3;                                // 1/0=未按/按下
sbit S1  = P1^2;                                // 1/0=未按/按下

sbit LED3 = P0^1;                               // 1/0=灭/亮
sbit LED2 = P0^2;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir 0xf0
#define p1dir 0xff
#endif

#ifdef  PIN48
sbit S3  = P0^7;                                // 1/0=未按/按下
sbit S2  = P0^6;                                // 1/0=未按/按下
sbit S1  = P0^5;                                // 1/0=未按/按下

sbit LED3 = P0^2;                               // 1/0=灭/亮
sbit LED2 = P0^1;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir 0xf0
#define p1dir 0x02
#endif

#define INTERRUPT_RFIRQ 9
#define INTERRUPT_TICK  13  

#define TX_ADR_WIDTH    5        // RF收发地址共5 bytes
#define TX_PLOAD_WIDTH  20       // 数据包长度为20 bytes

uint8_t const TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x56,0x78,0x90,0x12}; // 定义RF收发地址

uint8_t data id_buf[TX_PLOAD_WIDTH]={0xff, 0x01, 0x02, 0x03, 0x04, 0x05};

uint8_t bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;

/**************************************************
功能:延时
**************************************************/
void delay(uint16_t x)
{
    uint16_t i,j;
    i=0;
    for(i=0;i    {
       j=108;
           ;
       while(j--);
    }
}
/**************************************************
功能:硬件SPI读写
**************************************************/
uint8_t SPI_RW(uint8_t value)
{
  SPIRDAT = value;
                    
  while(!(SPIRSTAT & 0x02));       // 等待SPI传输完成

  return SPIRDAT;                  // 返回读出值
}
/**************************************************
功能:写RF寄存器,读RF状态值
**************************************************/
uint8_t SPI_RW_Reg(uint8_t reg, uint8_t value)
{
uint8_t status;

   RFCSN = 0;                    
   status = SPI_RW(reg);           // 选择RF寄存器
   SPI_RW(value);                  // 写入数据
   RFCSN = 1;                    

   return(status);                 // 返回RF状态值
}
/**************************************************
功能:读RF寄存器
**************************************************/
uint8_t SPI_Read(uint8_t reg)
{
uint8_t reg_val;

   RFCSN = 0;                  
   SPI_RW(reg);                 // 选择RF寄存器
   reg_val = SPI_RW(0);         // 读出数据
   RFCSN = 1;                  

   return(reg_val);             // 返回RF状态值
}
/**************************************************
功能:把缓冲区的多字节数据写到RF寄存器
**************************************************/
uint8_t SPI_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
{
uint8_t status,byte_ctr;

   RFCSN = 0;                     
   status = SPI_RW(reg);         // 选择RF寄存器
   for(byte_ctr=0; byte_ctr     SPI_RW(*pBuf++);
   RFCSN = 1;                    
   return(status);               // 返回RF状态值
}
/**************************************************
功能:设置为掉电模式
**************************************************/
void PD_Mode(void)
{
RFCE=0;
   SPI_RW_Reg(WRITE_REG + CONFIG, 0x0c);    // PWR_UP=0
}
/**************************************************
功能:设置为发射模式
**************************************************/
void TX_Mode(void)
{
   SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);        // 上电, CRC为2 bytes,接收模式,允许RX_DR产生中断
   SPI_Write_Buf(WR_TX_PLOAD, id_buf, TX_PLOAD_WIDTH); // 写数据到FIFO
RFCE=1;            // 启动发射
delay(10);           // 发射脉冲
RFCE=0;            
}
/**************************************************
功能:RF初始化
**************************************************/
void rf_init(void)
{
   RFCE = 0;                                     // RF关闭
   RFCKEN = 1;                                   // 启动RF时钟
   RF = 1;                                       // 允许RF中断

delay(1000);

   SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 设置发射地址长度
   SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 设置接收地址长度

   SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);         // 启动自动应答功能
   SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);     // PIPE0接收数据
   SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);    // 自动重传10次
   SPI_RW_Reg(WRITE_REG + RF_CH, 40);           // RF频率2440MHz
   SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);      // 发射功率0dBm, 传输速率2Mbps,
   SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // PIPE0 接收数据包长度   
}
/**************************************************
功能:RF中断服务程序
**************************************************/
void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
{
sta=SPI_Read(STATUS);        // 读出状态值
SPI_RW_Reg(WRITE_REG+STATUS,0x70);     // 清除所有中断标志
}

/**************************************************
功能:RTC2初始化
**************************************************/
void rtc2_init(void)
{
CLKLFCTRL=0x01;             // 使用RC 32KHz时钟
RTC2CMP0=0xff;          // 定时2秒
RTC2CMP1=0xff;
RTC2CON=0x06;          // 比较模式
WUIRQ=1;           // 允许TICK中断
}
/**************************************************
功能:启动RTC2
**************************************************/
void rtc2_on(void)
{
RTC2CON |=0x01;         
}
/**************************************************
功能:关闭RTC2
**************************************************/
void rtc2_off(void)
{               
RTC2CON &=~0x01;            
}
/**************************************************
功能:RTC2中断服务程序
**************************************************/
void RTC2_IRQ(void) interrupt INTERRUPT_TICK
{
LED2=!LED2;              
}                  
/**************************************************
功能:I/O口初始化
**************************************************/
void io_init(void)
{
   P0DIR = p0dir;           // 设定I/O口输入输出
   P1DIR = p1dir;     

LED1=LED2=LED3=0;       // 灯全亮
delay(1000);
LED1=LED2=LED3=1;       // 灯全灭                  
}  
/**************************************************
功能:主程序
**************************************************/
void main(void)
{
io_init();         // I/O口初始化
rf_init();         // RF初始化                           
   EA=1;                                       // 允许中断  
rtc2_init();
            // RTC2初始化
while(1)
{
  rtc2_off();           // 关RTC2
  TX_Mode();        // 发射数据
  while (!(TX_DS|MAX_RT));    // 等待发射结束
  sta = 0;
  PD_Mode();        // 关RF
  rtc2_on();        // 开RTC2
  PWRDWN = 0x04;       // 进入低功耗模式,等待RTC2唤醒
  delay(10);
}
}                  


 

接收程序

/*********************************************************************
功能:
RFID READER接收程序
说明:
收到数据显示灯闪烁一下,并通过串口上显示ID值
**********************************************************************/

#include
#include
#include "API.h"

//#define PIN24
#define PIN32
//#define PIN48

#ifdef  PIN24
sbit S3  = P0^6;                                // 1/0=未按/按下
sbit S2  = P0^4;                                // 1/0=未按/按下
sbit S1  = P0^3;                                // 1/0=未按/按下

sbit LED3 = P0^2;                           // 1/0=灭/亮
sbit LED2 = P0^1;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir 0xd8
#define p1dir 0xff
#endif

#ifdef  PIN32
sbit S3  = P1^4;                                // 1/0=未按/按下
sbit S2  = P1^3;                                // 1/0=未按/按下
sbit S1  = P1^2;                                // 1/0=未按/按下

sbit LED3 = P0^1;                               // 1/0=灭/亮
sbit LED2 = P0^2;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir 0xf0
#define p1dir 0xff
#endif

#ifdef  PIN48
sbit S3  = P0^7;                                // 1/0=未按/按下
sbit S2  = P0^6;                                // 1/0=未按/按下
sbit S1  = P0^5;                                // 1/0=未按/按下

sbit LED3 = P0^2;                               // 1/0=灭/亮
sbit LED2 = P0^1;                               // 1/0=灭/亮
sbit LED1 = P0^0;                               // 1/0=灭/亮

#define p0dir 0xf0
#define p1dir 0x02
#endif

#define INTERRUPT_RFIRQ 9

#define TX_ADR_WIDTH    5        // RF收发地址共5 bytes
#define TX_PLOAD_WIDTH  20       // 数据包长度为20 bytes

uint8_t const TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x56,0x78,0x90,0x12}; // 定义RF收发地址

uint8_t data rx_buf[TX_PLOAD_WIDTH];

uint8_t bdata sta;
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
/**************************************************
功能:延时
**************************************************/
void delay(uint16_t x)
{
    uint16_t i,j;
    i=0;
    for(i=0;i    {
       j=108;
           ;
       while(j--);
    }
}
/**************************************************
功能:硬件SPI读写
**************************************************/
uint8_t SPI_RW(uint8_t value)
{
  SPIRDAT = value;
                    
  while(!(SPIRSTAT & 0x02));       // 等待SPI传输完成

  return SPIRDAT;                  // 返回读出值
}
/**************************************************
功能:写RF寄存器,读RF状态值
**************************************************/
uint8_t SPI_RW_Reg(uint8_t reg, uint8_t value)
{
uint8_t status;

   RFCSN = 0;                    
   status = SPI_RW(reg);           // 选择RF寄存器
   SPI_RW(value);                  // 写入数据
   RFCSN = 1;                    

   return(status);                 // 返回RF状态值
}
/**************************************************
功能:读RF寄存器
**************************************************/
uint8_t SPI_Read(uint8_t reg)
{
uint8_t reg_val;

   RFCSN = 0;                  
   SPI_RW(reg);                 // 选择RF寄存器
   reg_val = SPI_RW(0);         // 读出数据
   RFCSN = 1;                  

   return(reg_val);             // 返回RF状态值
}
/**************************************************
功能:读RF寄存器多字节数据到缓冲区
**************************************************/
uint8_t SPI_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
{
uint8_t status,byte_ctr;

   RFCSN = 0;                     
   status = SPI_RW(reg);           // 选择RF寄存器

   for(byte_ctr=0;byte_ctr     pBuf[byte_ctr] = SPI_RW(0);       // 连接读出数据

   RFCSN = 1;                          

   return(status);                       // 返回RF状态值
}
/**************************************************
功能:把缓冲区的多字节数据写到RF寄存器
**************************************************/
uint8_t SPI_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
{
uint8_t status,byte_ctr;

   RFCSN = 0;                     
   status = SPI_RW(reg);         // 选择RF寄存器
   for(byte_ctr=0; byte_ctr     SPI_RW(*pBuf++);
   RFCSN = 1;                    
   return(status);               // 返回RF状态值
}

/**************************************************
功能:设置为接收模式
**************************************************/
void RX_Mode(void)
{
RFCE=0;
   SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);    // 上电, CRC为2 bytes,接收模式,允许RX_DR产生中断
   RFCE = 1;          // 启动接收模式
}
/**************************************************
功能:RF初始化
**************************************************/
void rf_init(void)
{
   RFCE = 0;                                     // RF关闭
   RFCKEN = 1;                                   // 启动RF时钟
   RF = 1;                                       // 允许RF中断
delay(1000);
   SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 设置发射地址长度
   SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 设置接收地址长度
   SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);         // 启动自动应答功能
   SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);     // PIPE0接收数据
   SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);    // 自动重传10次
   SPI_RW_Reg(WRITE_REG + RF_CH, 40);           // RF频率2440MHz
   SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);      // 发射功率0dBm, 传输速率2Mbps,
   SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // PIPE0 接收数据包长度
}
/**************************************************
功能:RF中断服务程序
**************************************************/
void RF_IRQ(void) interrupt INTERRUPT_RFIRQ
{
sta=SPI_Read(STATUS);        // 读出状态值

if(RX_DR)         
{
  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// 读出FIFO的数据
  SPI_RW_Reg(FLUSH_RX,0);       // 清除RX的FIFO
}

SPI_RW_Reg(WRITE_REG+STATUS,0x70);     // 清除所有中断标志
}
/**************************************************
功能:串口初始化子程序
说明:波特率19.2K,使用内部波特率发生器
**************************************************/
void uart_init(void)
{
    ES0 = 0;                          // 关UART0中断
    REN0 = 1;                         // 允许接收
    SM0 = 0;                          // 串口模式1,8bit可变波特率
    SM1 = 1;                  
    PCON |= 0x80;                     // SMOD = 1
    ADCON |= 0x80;                    // 选择内部波特率发生器

    S0RELL = 0xe6;                    // 波特率19.2K(十进制998=十六进制0x03e6)
    S0RELH = 0x03;
    TI0 = 0;           // 清发送完成标志
S0BUF=0x99;           // 送初值
}
/**************************************************
功能:向串口发送1 byte数据
**************************************************/
void uart_putchar(uint8_t x)
{
while (!TI0);        // 等待发送完成
TI0=0;          // 清发送完成标志
S0BUF=x;         // 发送数据
}
/**************************************************
功能:I/O口初始化
**************************************************/
void io_init(void)
{
   P0DIR = p0dir;           // 设定I/O口输入输出
   P1DIR = p1dir;     

LED1=LED2=LED3=0;       // 灯全亮
delay(1000);
LED1=LED2=LED3=1;       // 灯全灭                  
}  
/**************************************************
功能:主程序
**************************************************/
void main(void)
{
io_init();         // I/O口初始化
uart_init();                             // 串口初始化
rf_init();         // RF初始化                           
   EA=1;                                       // 允许中断

RX_Mode();         //进入接收模式

while(1)
{
  if(RX_DR)        // 数据已收到
  {
   sta=0;

   LED2=0;

   uart_putchar(rx_buf[0]);   // 显示所有ID值
   uart_putchar(rx_buf[1]);
   uart_putchar(rx_buf[2]);
   uart_putchar(rx_buf[3]);
   uart_putchar(rx_buf[4]);
   uart_putchar(rx_buf[5]);

   delay(1000);

   LED1=LED2=LED3=1;     // 灯全灭
  }
}
}                  

应用

  无线鼠标,无线键盘,无线摇杆

  玩具,RFID,无线遥控,医学参数监测

  无线语音,工业控制及无线数据采集

  主要特性

  ■内嵌2.4Ghz低功耗无线收发内核nRF24L01P,250 kbps, 1 Mbps,2 Mbps空中速率

  ■高性能51内核(12倍工业标准51速度),16 kbytes Flash, 1 kbyte data RAM, 1 kbyte NV data RAM

  ■具有丰富的外设资源,内置128 bit AES硬件加密,32位硬件乘除协处理器,,6-12位ADC,两路PWM,I2C,UART,硬件随机数产生器件,WDT,RTC,模拟比较器…

  ■提供QFN24,QFN32,QFN48多种封装,提供灵活应用选择

  ■灵活高效的开发手段,支持Keil C,ISP下载,是开发无线外设,RFID,无线数传等有力工具及平台
QQ:990170860(隐身也再线)
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机访问本页请
扫描左边二维码
         本网站声明
本网站所有内容为网友上传,若存在版权问题或是相关责任请联系站长!
站长联系QQ:7123767   myubbs.com
         站长微信:7123767
请扫描右边二维码
www.myubbs.com

小黑屋|手机版|Archiver|23度空间 ( 12002442号-27 )

GMT+8, 2024-4-26 07:08 , Processed in 0.058655 second(s), 15 queries .

Powered by 高考信息网 X3.3

© 2001-2013 大学排名

快速回复 返回顶部 返回列表