打印

nrf2401a程序

[复制链接]
3909|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
131452099|  楼主 | 2007-12-6 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#include  <at892051.h>
#include  <intrins.h>
#include  <absacc.h>
#include  <string.h>

#define uchar unsigned char
#define uint  unsigned int

#define NOP   _nop_()        
#define FALSE 0
#define TRUE  1
/************************************************
//端口定义
*************************************************/
sbit KEY_start=P3^3;        //按键statr
sbit KEY_stop=P3^7;        //按键stop
sbit RF_DR1=P1^1;        //数据1准备好
sbit RF_CLK1=P3^2;        //时钟输出
sbit RF_DAT=P1^0;        //数据输出
sbit RF_CS=P1^2;        //片选控制
sbit RF_PM=P1^7;        //电源管理控制
sbit RF_CE=P1^6;        //使能控制
sbit LED_RX=P3^5;        //LED指示灯
sbit LED_TX=P3^4;    //LED指示灯控制方向

void DelayX10ms(int count);                                   //延迟时间
void chuankou_int();
void LED_RXRX(uchar ss);
void LED_TXTX(uchar sss);

////////////////////////////////////////////////////////////////////////////
//nrf2401a模块程序
////////////////////////////////////////////////////////////////////////////
    void delay(uchar h);
    unsigned char ReadData(void);
    void WriteData();
    void Init2401A(void);
    void RX_Mode(void);
    void TX_Mode(void);
    void PowOffMode(void);
    void SleepMode(void);
    void ConfigMode(void);
    void RunMode(void);
    unsigned char ReadData(void);
    void WriteByte2401A(uchar data1);
//    uchar RF_TX_Buff[10]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
    uchar RF_TX_Buff[10];
    uchar RF_RX_Buff[10];

    uchar j=0;
/******************************************
2401A单字节数据传输写入函数WriteByte2401A()
  作用:向2401A写入单字节数据
  入口:待写入的一字节数据
  出口:无
*******************************************/
    void WriteByte2401A(uchar data1)
    {
     uchar cnt1;
//     RF_DAT_T=0;    //数据端口方向设置
     for(cnt1=8;cnt1>0;cnt1--)
        {
         if(data1&0x80)
            {RF_DAT=1;}
         else
            {RF_DAT=0;}
         NOP;
         RF_CLK1=1;
         NOP;
         RF_CLK1=0;
         data1<<=1;
        }
    }

/******************************************
2401A单字节数据读取函数ReadByte2401A()
  作用:从2401A中读取单字节数据
  入口:无
  出口:读取的单字节数据
*******************************************/
    unsigned char ReadByte2401A(void)
    {
     uchar cnt,data1;
//     RF_DAT_T=1;    //数据端口方向设置
     data1=0;
     for(cnt=8;cnt>0;cnt--)
        {
         data1<<=1;
         if(RF_DAT)
            {data1|=0x01;}
         else
            {data1&=0xfe;}
         NOP;
         RF_CLK1=1;
         NOP;
         RF_CLK1=0;
        }
     return(data1);
    }


/******************************************
2401A运行模式设置函数RunMode()
  作用:设置芯片为工作(接收/发射)模式
  入口:无
  出口:无
*******************************************/
    void RunMode(void)
    {
     RF_PM=1;
     RF_CS=0;
     RF_CE=1;
    }

/******************************************
2401A配置模式设置函数ConfigMode()
  作用:设置芯片为配置模式
  入口:无
  出口:无
*******************************************/
    void ConfigMode(void)
    {
     RF_PM=1;
     RF_CE=0;
     RF_CS=1;     
    }

/******************************************
2401A睡眠模式设置函数SleepMode()
  作用:设置芯片为睡眠模式
  入口:无
  出口:无
*******************************************/
    void SleepMode(void)
    {
     RF_PM=1;
     RF_CE=0;
     RF_CS=0;     
    }

/******************************************
2401A关机模式设置函数PowOffMode()
  作用:设置芯片为关机模式
  入口:无
  出口:无
*******************************************/
    void PowOffMode(void)
    {
     RF_PM=0;
     RF_CE=0;
     RF_CS=0;     
    }

/******************************************
2401A发送模式设置函数TX_Mode()
  作用:设置芯片为发送模式
  入口:无
  出口:无
*******************************************/
    void TX_Mode(void)
    {
    //进入配置模式
     ConfigMode();
    //配置参数
     WriteByte2401A(0X64);
    //进入收发模式
     RunMode();     
    }

/******************************************
2401A接收模式设置函数RX_Mode()
  作用:设置芯片为发送模式
  入口:无
  出口:无
*******************************************/
    void RX_Mode(void)
    {
    //进入配置模式
     ConfigMode();
    //配置参数
     WriteByte2401A(0X65);
    //进入收发模式
     RunMode();          
    }

/******************************************
2401A初始化函数Init2401A()
  作用:初始化2401A
  入口:无
  出口:无
*******************************************/
    void Init2401A(void)
    {
     uint cnt;
    //设置端口
     RF_CLK1=0;
     RF_DAT=0;
     SleepMode();
//     for(cnt=320;cnt>0;cnt--);    //延时等待上电    4mhz
    for(cnt=2;cnt>0;cnt--);        //32khz
     ConfigMode();    //进入配置模式
    for(cnt=2;cnt>0;cnt--);            //32khz
//     for(cnt=320;cnt>0;cnt--);    //延时等待上电    4mhz
     WriteByte2401A(0X50);
     WriteByte2401A(0X50);
     WriteByte2401A(0XAA);
     WriteByte2401A(0XBB);
     WriteByte2401A(0XCC);
     WriteByte2401A(0XDD);
     WriteByte2401A(0XEE);
     WriteByte2401A(0XAA);
     WriteByte2401A(0XBB);
     WriteByte2401A(0XCC);
     WriteByte2401A(0XDD);
     WriteByte2401A(0XEE);
     WriteByte2401A(0XA3);
     WriteByte2401A(0X6F);
     WriteByte2401A(0X64);
     SleepMode();
    }

/******************************************
2401A 数据写入函数WriteData()
  作用:向2401A写入发射数据
  入口:无
  出口:无
*******************************************/
    void WriteData()
    {
     uchar cnt;
     TX_Mode();
     RF_CE=1;
    //发送地址
        WriteByte2401A(0XAA);
        WriteByte2401A(0XBB);
        WriteByte2401A(0XCC);
        WriteByte2401A(0XDD);
        WriteByte2401A(0XEE);        
     //发送数据
     for(cnt=0;cnt<10;cnt++)
        {WriteByte2401A(RF_TX_Buff[cnt]);}
     //启动发送
     RF_CE=0;
     DelayX10ms(1);
     SleepMode();
    }

/******************************************
2401A 数据读入读取函数ReadData()
  作用:从2401A中读出接收数据
  入口:无
  出口:1.接收的数据存放于接收缓冲区
        2.返回非0接收正常,0接收错误
*******************************************/
    unsigned char ReadData(void)
    {
     uchar cnt;
     if(RF_DR1)
        {
         for(cnt=0;cnt<10;cnt++)
            {RF_RX_Buff[cnt]=ReadByte2401A();}
         return(1);
        }
     else
        return(0);
    }


////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

//初始化串行口
void chuankou_int()
{
    SCON = 0x50;                                      // Mode 1, 1 star bit, 8 data bit, 1,stop bit UART, enable receive
    TMOD = 0x20;                                      // Timer 1, mode 2, 8-bit auto reload,  
    PCON=0x80;                                        //SMOD位清0, 波特率不加倍
    TH1=0x0FD;                                        //串口波特率赋值
    TL1=0X0FD;
    ET1=0;                                            //定时器记数器中断益出允许标志
    ES=1;                                             //串口中断允许位
    TR1=1;                                            //使能定时器1
    EA=1;                                             //开总中断
}

void intrr() interrupt 4
{
    uchar i;
    ES=0; 
    RF_TX_Buff[j]=SBUF;
    j++;                                             //关串口中断允许位
    while(!RI);
    RI=0;
    if(j==10)
    {        
        WriteData();
        for(i=0;i<10;i++)
        {
            SBUF=RF_TX_Buff;
            while(!TI);
            TI=0;
        }
        LED_TX=0;
        DelayX10ms(2);        
        LED_TX=1;
        DelayX10ms(2);
        j=0;
    }
    ES=1;                                              //串口中断允许位
    RI=0;
}

void DelayX10ms(int count)                                   //延迟时间
{
int i,j,k;
for(i=0;i<count;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++)
{;}
}

void LED_RXRX(uchar ss)
{
    while(ss--)
    {
        LED_RX=0;
        DelayX10ms(10);        
        LED_RX=1;
        DelayX10ms(10);
    }
}

void LED_TXTX(uchar sss)
{
    while(sss--)
    {
        LED_TX=0;
        DelayX10ms(10);        
        LED_TX=1;
        DelayX10ms(10);
    }    
}
void main(void)
{
    uchar i;
    LED_RXRX(3);
    LED_TXTX(3);
    Init2401A();
    chuankou_int();
    TX_Mode();
//    RX_Mode();
    while(1)
    {
        ;
/*
        TX_Mode();
        DelayX10ms(1);
        WriteData();
         LED_TXTX(1);
        PowOffMode();
        DelayX10ms(300);
/*    
        if(ReadData())
        {        
            for(i=0;i<10;i++)
            {            
                if(RF_TX_Buff==RF_RX_Buff)
                {
                    SBUF=RF_RX_Buff;
                    RF_RX_Buff=0;
                    LED_RX=0;
                    DelayX10ms(2);        
                    LED_RX=1;
                    DelayX10ms(2);
                }
            }            
        }
*/
    }
}

 
qq:174231959欢迎感兴趣的朋友一起讨论

相关帖子

沙发
doob| | 2007-12-6 08:57 | 只看该作者

2401A和2401有什么区别?

你的程序是ok的吗?想讨论什么?

使用特权

评论回复
板凳
131452099|  楼主 | 2007-12-7 13:15 | 只看该作者

呵呵

程序,是OK了,但是在这其中,费了不少周折。随便帖帖的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

23

帖子

1

粉丝