搜索
bottom↓
回复: 2

做了一个NRF905的无线射频,为大家提供一个收发一体的程序。

[复制链接]

出0入0汤圆

发表于 2011-5-20 18:38:33 | 显示全部楼层 |阅读模式
最近帮老师做了一个NRF905的东东,调试了一下,还OK,把程序弄上来给大家看看啦!
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
//----------------------------------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80
//----------------------------------------------------------------------------------------------------------------
bdata unsigned  char DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
#define TxRxBuf_Len 4
unsigned char TxRxBuf[TxRxBuf_Len]=
{
0x29,0x30,0x31,0x32,
};
//---------------------------------------------------配置口定义---------------------------------------------------
//配置口定义//
sbit        TXEN=P2^1;
sbit        PWR=P2^2;
sbit        CD=P2^3;
sbit        DR=P2^4;
sbit        MOSI=P2^5;
sbit        CSN=P2^6;
sbit        TRX_CE=P3^3;
sbit        AM=P3^5;
sbit        MISO=P3^6;
sbit        SCK=P3^7;
//----------------------------------------------------按键--------------------------------------------------

sbit    KEY0    =P3^2;
sbit    KEY1    =P3^1;
//----------------------------------------------------数码管位控制-------------------------------------------------------
sbit    led0    =P1^7;
sbit    led1    =P1^6;
//-----------------------------------------------------------------------------------------------------------------
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC                0x00
#define RC                0x10
#define WTP                0x20
#define RTP                0x21
#define WTA                0x22
#define RTA                0x23
#define RRP                0x24
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned char idata RFConf[11]=
{
  0x00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在430MHZ
  0x0c,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x04,0x04,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
char tf;
//------------------------------------------------延时------------------------------------------------------------
static void Delay(uchar n)
{
        uint i;
        while(n--)
        for(i=0;i<80;i++);
}
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
        unsigned char j;
        for (j=0;j<8;j++)
        {
        DATA_BUF=DATA_BUF<<1;
                SCK=1;
                if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                SCK=0;
         }
         return DATA_BUF;
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                SCK=1;
                DATA_BUF=DATA_BUF<<1;
                SCK=0;
        }
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
    CSN=1;                                                // Spi         disable
        SCK=0;                                                // Spi clock line init low
        DR=0;                                                // Init DR for input
        AM=0;                                                // Init AM for input
        CD=0;                                                // Init CD for input
        PWR=1;                                        // nRF905 power on
        TRX_CE=0;                                        // Set nRF905 in standby mode
        TXEN=0;                                        // set radio in Rx mode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
        uchar i;
        CSN=0;                                                // Spi enable for write a spi command
        //SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words  写放配置字
        {
           SpiWrite(RFConf);
        }
        CSN=1;                                        // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
        uchar i;
        //Config905();
        CSN=0;
        SpiWrite(WTP);                                // Write payload command
        for (i=0;i<4;i++)
        {
                SpiWrite(TxRxBuf);                // Write 32 bytes Tx data
        }// Spi enable for write a spi command
        CSN=1;
        Delay(1);                                                // Spi disable
        CSN=0;                                                // Spi enable for write a spi command
        SpiWrite(WTA);                                // Write address command
        for (i=0;i<4;i++)                        // Write 4 bytes address
        {
                SpiWrite(TxAddress);
        }
        CSN=1;                                                // Spi disable
        TRX_CE=1;                                        // Set TRX_CE high,start Tx data transmission
        Delay(1);                                        // while (DR!=1);
        TRX_CE=0;                                        // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
        TRX_CE=0;
        TXEN=1;
        Delay(1);                                         // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
        TXEN=0;
        TRX_CE=1;
        Delay(1);                                         // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
{
        if (DR=1&&TRX_CE==1 && TXEN==0)
        {
       // Delay(50)  ;
                return 1;
        }
        else
        {
                return 0;
        }
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)                                               
{
        uchar i;
    Delay(1);
//        TRX_CE=0;                                        // Set nRF905 in standby mode
    Delay(100);
    TRX_CE=0;
        CSN=0;                                                // Spi enable for write a spi command
    Delay(1);
        SpiWrite(RRP);
        for (i = 0 ;i < 4 ;i++)
        {
                TxRxBuf=SpiRead();                // Read data and save to buffer      
        }
        CSN=1;
    Delay(10);
        TRX_CE=1;                                                       
}
//--------------------------------------------------------数据接收------------------------------------------------
void  RX(void)
{
          SetRxMode();                        // Set nRF905 in Rx mode
          while (CheckDR()==0);
                  Delay(10);
                    RxPacket();
                  if(TxRxBuf[0]==0x29)
                  {
                                P1=0x0f;
                       
                  }
                  if(TxRxBuf[1]==0x29)
                  {
                       
                                P1=0xf0;
                       
                  }
}
void delay_10ms(void)   //误差 -0.000000000002us
{
    unsigned char a,b;
    for(b=249;b>0;b--)
        for(a=17;a>0;a--);
}
//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
        nRF905Init();
             Config905();
                led0=0;
                led1=0;
               
        while(1)
                {
                        RX();
                        if(KEY0 ==0)
                        {
                                delay_10ms();
                            if(KEY0 ==0 )
                                {       
                                        tf = 1 ;
                                        TxRxBuf[0]=0x29;
                                        TxRxBuf[1]=0x30;
                                        P1=0x0f;
                                        while(!KEY0);
                                        delay_10ms();
                                        while(!KEY0);
                                }
                        }
                        if(KEY1 ==0)
                        {
                                delay_10ms();
                            if(KEY1 ==0 )
                                {       
                                        tf = 1 ;
                                        TxRxBuf[0]=0x30;
                                        TxRxBuf[1]=0x29;
                                        P1=0xf0;
                                        while(!KEY1);
                                        delay_10ms();
                                        while(!KEY1);
                                 }
                        }
               if (tf==1)
                        {
                SetTxMode();// Set nRF905 in Tx mode
                            TxPacket(TxRxBuf);// Send data by nRF905
                                tf = 0;       
                                Delay(100);
                        }
                Delay(100);
                P1=0xff;
                Delay(100);
        }
}

出0入0汤圆

 楼主| 发表于 2011-5-21 23:12:10 | 显示全部楼层
呵呵,小弟才大二啊,还是学的自动化专业,不是信息啦!

出0入0汤圆

发表于 2011-7-28 08:33:30 | 显示全部楼层
好厉害,顶一下~!学习了~!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 04:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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