搜索
bottom↓
回复: 45

具备跳号跳频和跳址的nRF905的C51演示程序

[复制链接]

出0入0汤圆

发表于 2007-10-24 15:09:13 | 显示全部楼层 |阅读模式
*----------------------------------------------------------
    具备跳号跳频和跳址的nrf905的C51演示程序
HotPower@126.com   2006.6.6  于大雁塔村队部
----------------------------------------------------------*/
//#pragma src
#include
#include
#include
#include
/*---------------------*/
#include
#include "hotins.h"
/*---------------------*/
#pragma NOAREGS

void MainInit(void);//系统初始化
void SystemInit(void);//系统初始化
void SystemSetup(void);//系统设置
void SystemIoInit(void);//系统接口初始化
void TimeInit(void);//定时器定时参数设置
void UserSetup(void);//用户运行环境设置
void ClrWdt(void);//喂狗
void BeepSetup(unsigned char mode);//蜂鸣器发声模式设置
void Beep(void);//蜂鸣器发声驱动
void KeyInit(void);//键盘初始化
void KeyCommandExec(unsigned char commgroup, unsigned char commnum);//执行键盘命令

void Key00(void);//压键事件
void Key01(void);
void Key02(void);
void Key03(void);

void Key10(void);//放键事件
void Key11(void);
void Key12(void);
void Key13(void);

void Key20(void);//长键事件
void Key21(void);
void Key22(void);
void Key23(void);

/*-----------------------------------------------
        nrf905库函数定义
------------------------------------------------*/
unsigned char SpiReadWrite(unsigned char);
void WriteTXBuffer(const unsigned char[]);
unsigned char ReadStatus(void);
void nRFPowerUP(void);
void nRFInit(void);//无线模块初始化
unsigned char VerifynRFConfig(void);//校验配置nRF905
void WritenRFConfig(unsigned char[]);//写配置nRF905
void ReadnRFConfig(unsigned char[]);//读配置nRF905
void FastWritenRFConfig(unsigned char);//快速配置nRF905
void SetTxMode(void);//设置发送模式
void SetRxMode(void);//设置接收模式
void StartTx(void);//开始发送
void nRFReadWrite(void);//无线收发模块


data SystemData SystemBuffers;//申请系统数据结构
idata SioData SioBuffers;//申请系统数据结构

/*------------------------------------------------
        SPI读写一体化函数SpiReadWrite()
入口参数:
        val  写入命令或数据
出口参数:
        R7   读出数据
------------------------------------------------*/
unsigned char SpiReadWrite(unsigned char val) using 0
{
unsigned char i;
  ACC = val;
  for (i = 8; i > 0; i --)
  {
  CY = MISO;//取数据SO
    _rlca_();//存数据ACC.0读数据ACC.7同时进行,acc循环左移,acc.7移入cy(出),cy(入)移到acc.0
MOSI = CY;//送数据SI
SCK = 1;//上升沿打入数据
    _nop_();
SCK  = 0;//下降沿读入数据(首次为假动作)
  }
  return ACC;
}

/*------------------------------------------------
        写入nRF905发送数据函数WriteTXBuffer()
入口参数:
        buffer 发送数据包
出口参数:
        无
------------------------------------------------*/
void WriteTXBuffer(const unsigned char buffer[]) using 0
{
unsigned char i;
  TRX_CE = 0;//设置nRF905为待机方式
  _nop_();
  CSN="0";//打开SPI
  SpiReadWrite(WTA);//写发送地址
  for (i = 0; i < 4; i++)
  {
SpiReadWrite(buffer);  // Write 32 bytes Tx data
  }
  CSN="1";//关闭SPI
  _nop_();
  CSN="0";      // Spi enable for write a spi command
  SpiReadWrite(WTP);    // Write payload command
  for (i = 0; i < 32; i++)
  {
SpiReadWrite(buffer);  // Write 32 bytes Tx data
  }
  CSN="1";      // Spi disable      
  TRX_CE = !TX_EN;//
}

void FastWritenRFConfig(unsigned char low_ch_no) using 0
{
  TRX_CE = 0;//设置nRF905为待机方式
  _nop_();
  CSN="0";//打开SPI
  SpiReadWrite(CC | PA_PWR_10dBm | HFREQ_PLL_433MHz | CH_NO_BIT8);
  SpiReadWrite(low_ch_no);//CH_NO
  CSN="1";      // Spi disable      
  TRX_CE = !TX_EN;//
}

void StartTx(void) using 0
{
  _nop_();
  _nop_();
  _nop_();
  TRX_CE=1;     // Set TRX_CE high,start Tx data transmission
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  TRX_CE=0;     // Set TRX_CE low
}

/*------------------------------------------------
        读入nRF905状态函数ReadStatus()
入口参数:
        无
出口参数:
        nRF905状态字
------------------------------------------------*/
unsigned char ReadStatus(void) using 0
{
unsigned char val;
  CSN = 0;//打开SPI
  val = SpiReadWrite(RC);//读状态
  CSN = 1;//关闭SPI
  return val;//返回nRF905状态字
}

void nRFPowerUP(void) using 0
{
  CSN    = 1;//关闭SPI      
  SCK    = 0;//拉低时钟
  DR     = 1;//设置DR为输入方式
  AM     = 1;//设置AM为输入方式
  PWR_UP = 1;// nRF905上电
  TRX_CE = 0;//设置nRF905为待机方式
  TX_EN  = 0;//设置接收方式
}


void main(void)
{
//  ReadnRFConfig(SystemBuffers.nRFTxBuff);

  MainInit();//系统初始化
  while (1) {//主循环
    IE   |= 0xb2;//保证中断可靠EA,ET2,ES,ET0
    TCON |= 0x55;//保证定时器开
    PCON |= SMOD_ + GF0_ + IDL_;//进入空闲状态并喂软件狗
    _nop_();
    _nop_();
  }
}

void MainInit(void) using 0//系统初始化
{
  _start_();
  ClrWdt();//清除看门狗计数器
  SystemIoInit();//系统接口初始化
  SystemInit();//系统上电初始化
  SystemSetup();//系统运行环境设置
  UserSetup();//用户运行环境设置
}

void SystemInit(void) using 0//系统初始化
{
unsigned char i;
  for (i = 0; i < 32; i ++) {
    SioBuffers.SioTxBuff = 0;
    SioBuffers.SioRxBuff = 0;
  }
  if (SystemBuffers.RamTest != 0x55aa) {//内存初始化
    for (i = 0; i < 32; i ++) {
      SystemBuffers.nRFTxBuff = 0;
      SystemBuffers.nRFRxBuff = 0;
    }
    SystemBuffers.nRFRxBuff[0] = RX_ADDRESS_0;//本机地址
    SystemBuffers.nRFRxBuff[1] = RX_ADDRESS_1;
    SystemBuffers.nRFRxBuff[2] = RX_ADDRESS_2;
    SystemBuffers.nRFRxBuff[3] = RX_ADDRESS_3;
    SystemBuffers.nRFRxBuff[8] = CH_NO_BYTE;
    SystemBuffers.nRFTxBuff[8] = CH_NO_BYTE;
    SystemBuffers.RamTest = 0x55aa;
  }
  else {
  }
}

void SystemSetup(void) using 0//系统设置
{
  TimeInit();
  IP = 0x05;//中断优先级EX0>EX1>ET0>ET1
  SystemBuffers.TestTime = 0;
  SystemBuffers.WaitTime = 0;
}

void TimeInit() using 0
{
//  TCON = 0x55;//启动定时器
/*----------------------------------
      定时器0定时参数设置
----------------------------------*/
  TL0 = 0;
  TH0 = 0;
  TR0 = 1;//启动定时器0
/*----------------------------------
      定时器1定时参数设置
----------------------------------*/
  TMOD = 0x20;    //timer1 working mode 1
  TL1 = 0xfd;     //f7=9600 for 16mhz Fosc,and ...
  TH1 = 0xfd;     //...fd=19200 for 11.0592mhz Fosc
  SCON = 0xd8;    //uart mode 3,ren==1
  PCON = 0x80;
  SioBuffers.SioTXCount = 0;//无发送数据
  SioBuffers.SioRXCount = 32;//允许接收串口数据
  TR1 = 1;//启动定时器1
/*----------------------------------
      定时器2定时参数设置
----------------------------------*/
  TIMEER2 = T2_5mS;
  RCAP    = T2_5mS;
  TR2     = 1;//启动定时器2
}

void nRFInit(void) using 0//无线模块初始化
{
  do{
    WritenRFConfig(SystemBuffers.nRFRxBuff);//配置nRF905
  }
  while(VerifynRFConfig());
  SetRxMode();//设置接收模式
  SystemBuffers.nRFTxCount = 0;//清空无线发送数据缓冲区
  SystemBuffers.nRFRxCount = 0;//清空无线接收数据缓冲区
}

void ReadnRFConfig(unsigned char rxaddr[]) using 0//读配置nRF905
{
unsigned char i;
  TRX_CE = 0;//设置nRF905为待机方式
  _nop_();
  CSN = 0;      // Spi enable for write a spi command
  SpiReadWrite(RC);    // Read config command
  for (i = 10; i < 20; i ++) rxaddr = SpiReadWrite(0xff);
  CSN = 1;      // Disable Spi
  TRX_CE = !TX_EN;//
}

void WritenRFConfig(unsigned char rxaddr[]) using 0//配置nRF905
{
  TRX_CE = 0;//设置nRF905为待机方式
  _nop_();
  CSN = 0;      // Spi enable for write a spi command
  SpiReadWrite(WC);    // Write config command
  SpiReadWrite(rxaddr[8]);                       //中心频率低8位
  SpiReadWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
  SpiReadWrite(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节
  SpiReadWrite(RX_PW_32BYTE);                    //接收数据宽度32字节
  SpiReadWrite(TX_PW_32BYTE);                    //发送数据宽度32字节
  SpiReadWrite(rxaddr[0]);                       //接收有效地址第1字节
  SpiReadWrite(rxaddr[1]);                       //接收有效地址第2字节
  SpiReadWrite(rxaddr[2]);                       //接收有效地址第3字节
  SpiReadWrite(rxaddr[3]);                       //接收有效地址第4字节
  SpiReadWrite(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz
  CSN = 1;      // Disable Spi
  TRX_CE = !TX_EN;//
}

unsigned char VerifynRFConfig(void) using 0//校验配置nRF905
{
unsigned char error = 0;
  TRX_CE = 0;//设置nRF905为待机方式
  _nop_();
  CSN = 0;      // Spi enable for write a spi command
  SpiReadWrite(RC);    // Read config command
  SpiReadWrite(0xff);                       //中心频率低8位
  if (SpiReadWrite(0xff) != (PA_PWR_10dBm | HFREQ_PLL_433MHz)) error ++; //发射+10dBm,发射频率433MHz,中心频率第9位=0
  if (SpiReadWrite(0xff) != (TX_AFW_4BYTE | RX_AFW_4BYTE)) error ++;     //接收地址宽度4字节,发送地址宽度4字节
  if (SpiReadWrite(0xff) != (RX_PW_32BYTE)) error ++;                    //接收数据宽度32字节
  if (SpiReadWrite(0xff) != (TX_PW_32BYTE)) error ++;                    //发送数据宽度32字节
  SpiReadWrite(0xff);                       //接收有效地址第1字节
  SpiReadWrite(0xff);                       //接收有效地址第2字节
  SpiReadWrite(0xff);                       //接收有效地址第3字节
  SpiReadWrite(0xff);                       //接收有效地址第4字节
  if (SpiReadWrite(0xff) != (CRC16_EN | XOF_16MHz)) error ++;            //CRC16模式使能,晶体振荡器频率16MHz
  CSN = 1;      // Disable Spi
  TRX_CE = !TX_EN;//
  return error;
}

/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void) using 0   
{
  _nop_();
  _nop_();
  _nop_();
  TX_EN=1;
  _nop_();
  TRX_CE=0;
  _nop_();
  _nop_();
  _nop_();
}   
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void) using 0
{
  _nop_();
  _nop_();
  _nop_();
  TX_EN=0;
  _nop_();
  TRX_CE=1;
//650uS
  _nop_();
  _nop_();
  _nop_();
}

void SystemIoInit(void) using 0
{
  IE = 0x00;//关闭中断
  P2 = 0x9d;//P2口初始化
  P0 = 0xff;//P0口初始化
  P1 = 0xff;//P1口初始化
  P3 = 0xff;//P3口初始化
//  nRFPowerUP();
}

void UserSetup(void) using 0//用户运行环境设置
{
  KeyInit();//键盘初始化
  nRFInit();//无线模块初始化
  SystemBuffers.TimeCount = 0;
}

void ClrWdt(void)  using 0//喂狗
{
  WDTRST = 0x1e;//89s52内狗
  WDTRST = 0xe1;//89s52内狗
}



/*------------------------------------
         定时器T0中断服务程序
------------------------------------*/
void t0proc() interrupt TF0_VECTOR using 1
{
}

/*------------------------------------
         定时器T1中断服务程序
------------------------------------*/
void t1proc() interrupt TF1_VECTOR using 1
{
}

/*------------------------------------
         定时器T2中断服务程序(5mS)
------------------------------------*/
void t2proc() interrupt TF2_VECTOR using 0
{
unsigned char key;
code unsigned char KeyPosTab[] = {0x01, 0x02, 0x04, 0x08};
  TF2 = 0;
  if (PCON & GF0_) {//中断是从主循环内跳入的才能喂狗
    ClrWdt();//清除看门狗计数器
    PCON &= ~GF0_;//清除标志
  }
  key = ~P0;//接收键盘数据每次可取多键)
  if (key & KeyPosTab[SystemBuffers.TimeCount & 0x03]) {//有键压下(每次只取1键以实现“零耗时消除键盘抖动”)
    SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] ++;//压键计数
    if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] == 2) {//短压键
      SystemBuffers.WaitTime = 0;
      KeyCommandExec(0, SystemBuffers.TimeCount & 0x03);//单击键Key00()~Key03()
}
    else if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= SysPushKeyTime) {//长压键150 * 20mS = 3。0S
      SystemBuffers.WaitTime = 0;
   KeyCommandExec(2, SystemBuffers.TimeCount & 0x03);//长压键Key20()~Key23()
   SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 3;//清除长压键计数器(躲过单击键)
    }
  }
  else {//无键压下(包括放键)
    if (SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] >= 2) {//放键事件
      SystemBuffers.WaitTime = 0;
   KeyCommandExec(1, SystemBuffers.TimeCount & 0x03);//键释放Key10()~Key13()
}
else {
   nRFReadWrite();//无线收发模块
}
    SystemBuffers.KeyCount[SystemBuffers.TimeCount & 0x03] = 0;//清除压键计数器
  }
  SystemBuffers.TimeCount++;//继续下1个5mS延时
  if ((SystemBuffers.TimeCount & ~0x80) >= 100){//5mS*100=500mS
    SystemBuffers.WaitTime ++;
    if (SystemBuffers.WaitTime >= SysWaitTime) {//0.5*20=10S
   P0 = 0xff;//关显示
      SystemBuffers.WaitTime = 0;
    }
    SystemBuffers.TimeCount &= 0x80;
SystemBuffers.TimeCount ^= 0x80;//取反闪烁位
  }
}

/*------------------------------------*/
void sioproc() interrupt SIO_VECTOR using 1
{
unsigned char i;
  if (RI) {//接收中断
    RI = 0;
if (SioBuffers.SioRXCount && (SioBuffers.SioRXCount <= 32)) {//允许串口接收数据
   SioBuffers.SioRxBuff[32 - SioBuffers.SioRXCount] = SBUF;
   SioBuffers.SioRXCount --;
   if (SioBuffers.SioRXCount == 0) {
     for (i = 0; i < 32; i ++) {
       SioBuffers.SioTxBuff = SioBuffers.SioRxBuff;//自收自发
       SystemBuffers.nRFTxBuff = SioBuffers.SioTxBuff;//更新无线发送数据
  }
/*
  switch(SystemBuffers.nRFTxBuff[9]) {
    case 0x81: LED0 = 0;break;
    case 0x82: LED1 = 0;break;
    case 0x83: LED2 = 0;break;
    case 0x84: LED3 = 0;break;
    case 0x03: LED2 = 0;break;
    case 0x04: LED3 = 0;break;
     }
*/
  SioBuffers.SioRXCount = 32;//串口接收缓冲区满
  SioBuffers.SioTXCount = 32;//串口发送缓冲区满
  TI = 1;//立即发送
     SystemBuffers.nRFTxCount = 32;//要求间接无线发送
   }
}
else SioBuffers.SioRXCount = 0;//不允许串口接收数据
  }
  if (TI) {//发送中断
    TI = 0;
    if (SioBuffers.SioTXCount && (SioBuffers.SioTXCount <= 32)) {//允许串口发送数据
   SBUF = SioBuffers.SioTxBuff[32 - SioBuffers.SioTXCount];//串口显示
   SioBuffers.SioTXCount --;
}
else SioBuffers.SioTXCount = 0;//不允许串口发送数据
  }
}


//执行键盘命令
void KeyCommandExec(unsigned char commgroup, unsigned char commnum) using 0
{
unsigned int i;
unsigned key;
code void *KeyArray[3][4] = {//二维函数数组指针阵列表(散转命令地址表)
  {(void *)Key00 + 0x5b7d, (void *)Key01 + 0xa6ea, (void *)Key02 + 0xf157, (void *)Key03 + 0x4cc4},
  {(void *)Key10 + 0x9731, (void *)Key11 + 0xe2ae, (void *)Key12 + 0x3d1b, (void *)Key13 + 0x8888},
  {(void *)Key20 + 0xd3f5, (void *)Key21 + 0x2e62, (void *)Key22 + 0x79df, (void *)Key23 + 0xc44c}
  };
  if ((commgroup < 3) && (commnum < 4)) {
    ClrWdt();//清除看门狗计数器
    key = commgroup * 4 + commnum + 1;
    i = ((key * 53 & 0xf) * 0x1000)+ ((key * 43 & 0xf) * 0x100) + ((key * 23 & 0xf) * 0x10) + (key * 13 & 0xf);
    _icall_((void *)KeyArray[commgroup][commnum] - i);//键盘命令散转
  }
}


void BeepSetup(unsigned char mode)
{
//  BeepBuffers.BeepCount = 1;
//  BeepBuffers.BeepMode  = mode;
//  BeepBuffers.BeepValue = mode;
}
/*----------------------------------
      蜂鸣器100mS发声程序
----------------------------------*/
void Beep(void)//蜂鸣器发声
{
//  BeepBuffers.BeepCount --;
//  if (BeepBuffers.BeepCount == 0){
//    BeepBuffers.BeepCount = 0;
// BeepBuffers.BeepValue = BeepBuffers.BeepMode;
// if (BeepBuffers.BeepValue >= 0x80)//单声
//      BeepBuffers.BeepMode = 0;       //单声清除
//  }
//  BeepBuffers.BeepValue <<= 1;
//  CY = ~CY;    //硬件反向
//  BeepOut = CY;//发声
}

void KeyInit(void) using 0//键盘初始化
{
unsigned char i;
  for (i = 0; i < 4; i++){
    SystemBuffers.KeyCount = 0;//清除键盘压键次数缓冲区
  }
}

//收发无线读写模块
void nRFReadWrite(void)
{
unsigned char i;
unsigned int t;
  if (!TX_EN && DR && AM) {//收到数据
    ClrWdt();
    TRX_CE = 0;//设置nRF905为待机方式
    _nop_();
CSN=0;      // Spi enable for write a spi command
SpiReadWrite(RRP);    // Read payload command
for (i = 0; i < 32; i++)
{
     SystemBuffers.nRFRxBuff=SpiReadWrite(0xff);//读入无线接收缓冲区
}
CSN=1;      // Disable spi
TRX_CE = !TX_EN;//再回到原来的无线收发模式
// TRX_CE = 1;//再回到接收模式
switch(SystemBuffers.nRFRxBuff[9]) {
   case 0x81: LED0 = 0;break;
   case 0x82: LED1 = 0;break;
   case 0x83: LED2 = 0;break;
   case 0x84: LED3 = 0;break;
   case 0x01: LED0 = 0;break;
   case 0x02: LED1 = 0;break;
   case 0x03: LED2 = 0;break;
   case 0x04: LED3 = 0;break;
}
    SystemBuffers.WaitTime = 0;
while(DR || AM);
SystemBuffers.nRFRxCount = 32;//收到32个字节数据
if (SioBuffers.SioTXCount == 0){//串口数据已发送完
   for (i = 0; i < 32; i ++)
        SioBuffers.SioTxBuff = SystemBuffers.nRFRxBuff;//串口显示
   SioBuffers.SioTXCount = 32;//发送32个字节的显示数据
   TI = 1;//立即显示
}
  }
  else if(!CD && (SystemBuffers.nRFRxCount == 32)) {//接收命令处理
SystemBuffers.nRFRxCount = 0;
    for (i = 0; i < 4; i ++)
      SystemBuffers.nRFTxBuff = SystemBuffers.nRFRxBuff[i + 4];//写入串口接收缓冲区
    for (i = 4; i < 8; i ++)
      SystemBuffers.nRFTxBuff = SystemBuffers.nRFRxBuff[i - 4];//写入串口接收缓冲区
    for (i = 8; i < 32; i ++)
      SystemBuffers.nRFTxBuff = SystemBuffers.nRFRxBuff;//写入串口接收缓冲区
    if (SystemBuffers.nRFRxBuff[9] == 0x80) {//系统消息请求
   SystemBuffers.nRFTxBuff[9]  = 0x00;//主机系统消息应答
   ReadnRFConfig(SystemBuffers.nRFTxBuff);
      SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
}
    else if (SystemBuffers.nRFRxBuff[9] == 0x81) {//子机请求
//   LED0 = 0;//主机灯亮
   SystemBuffers.nRFTxBuff[9]  = 0x01;//主机应答
      SystemBuffers.nRFTxBuff[10] = 0x20;
      SystemBuffers.nRFTxBuff[11] = 0x04;
      SystemBuffers.nRFTxBuff[12] = 0x10;
      SystemBuffers.nRFTxBuff[13] = 0x18;
      SystemBuffers.nRFTxBuff[14] = 0x11;
      SystemBuffers.nRFTxBuff[15] = 0x28;
      SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
}
    else if (SystemBuffers.nRFRxBuff[9] == 0x82) {//子机请求
//   LED1 = 0;//主机灯亮
   SystemBuffers.nRFTxBuff[9] =  0x02;//主机应答
      SystemBuffers.nRFTxBuff[10] = 0x20;
      SystemBuffers.nRFTxBuff[11] = 0x04;
      SystemBuffers.nRFTxBuff[12] = 0x10;
      SystemBuffers.nRFTxBuff[13] = 0x26;
      SystemBuffers.nRFTxBuff[14] = 0x21;
      SystemBuffers.nRFTxBuff[15] = 0x09;
      SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
}
    else if (SystemBuffers.nRFRxBuff[9] == 0x83) {//子机变址请求
//   LED2 = 0;//主机变址灯亮
   SystemBuffers.nRFTxBuff[9]  = 0x03;//主机变址应答
      SystemBuffers.nRFTxBuff[10] = TH0;//
      SystemBuffers.nRFTxBuff[11] = TL0;
      SystemBuffers.nRFTxBuff[12] = SystemBuffers.WaitTime;
      SystemBuffers.nRFTxBuff[13] = SystemBuffers.TimeCount;
      SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
}
    else if (SystemBuffers.nRFRxBuff[9] == 0x84) {//子机跳频请求
//   LED3 = 0;//主机跳频灯亮
   SystemBuffers.nRFTxBuff[9]  = 0x04;//主机跳频应答
      SystemBuffers.nRFTxBuff[10] = SystemBuffers.nRFTxBuff[8] + 1;//主机跳频
      SystemBuffers.nRFTxCount = 32;//主机要求间接无线发送
}
    else if (SystemBuffers.nRFRxBuff[9] == 0x03) {//主机变址应答
   LED2 = 0;//子机变址灯亮
      SystemBuffers.nRFRxBuff[0] = SystemBuffers.nRFRxBuff[10];//改写接收地址第1字节
      SystemBuffers.nRFRxBuff[1] = SystemBuffers.nRFRxBuff[11];//改写接收地址第2字节
      SystemBuffers.nRFRxBuff[2] = SystemBuffers.nRFRxBuff[12];//改写接收地址第3字节
      SystemBuffers.nRFRxBuff[3] = SystemBuffers.nRFRxBuff[13];//改写接收地址第4字节
      WritenRFConfig(SystemBuffers.nRFRxBuff);//子机重新配置nRF905接收地址
    }
    else if (SystemBuffers.nRFRxBuff[9] == 0x04) {//主机跳频应答
//   LED3 = 0;//子机跳频灯亮
      SystemBuffers.nRFRxBuff[8] = SystemBuffers.nRFRxBuff[10];
   FastWritenRFConfig(SystemBuffers.nRFRxBuff[8]);//快速配置nRF905,子机跳频
    }
  }
  else if (!CD && (SystemBuffers.nRFTxCount == 32)) {//要求间接无线发送(发送命令处理)
    SetTxMode();//设置发送模式
    WriteTXBuffer(SystemBuffers.nRFTxBuff);
    ClrWdt();//清除看门狗计数器
    StartTx();//开始发送
    SystemBuffers.nRFTxCount = 0;//结束发送模式
    if (SystemBuffers.nRFTxBuff[9] == 0x03) {//主机变址应答

      SystemBuffers.nRFRxBuff[4] = SystemBuffers.nRFTxBuff[10];//改写呼叫地址第1字节
      SystemBuffers.nRFRxBuff[5] = SystemBuffers.nRFTxBuff[11];//改写呼叫地址第2字节
      SystemBuffers.nRFRxBuff[6] = SystemBuffers.nRFTxBuff[12];//改写呼叫地址第3字节
      SystemBuffers.nRFRxBuff[7] = SystemBuffers.nRFTxBuff[13];//改写呼叫地址第4字节
}

else if (SystemBuffers.nRFTxBuff[9] == 0x04) {//主机跳频应答
   SystemBuffers.nRFRxBuff[8] = SystemBuffers.nRFTxBuff[10];//工作频率低8位
      for (t = 0; t < 2500; t ++);//延时,等待发送结束
   FastWritenRFConfig(SystemBuffers.nRFRxBuff[8]);//快速配置nRF905,主机跳频
    }
    SetRxMode();//设置接收模式
  }
}

//键
void Key00(void) using 0
{
unsigned char i;
  if (SystemBuffers.nRFTxCount == 0) {//无线发送缓冲区为空
    SystemBuffers.nRFTxBuff[0] = SystemBuffers.nRFRxBuff[4];//呼叫地址第1字节
    SystemBuffers.nRFTxBuff[1] = SystemBuffers.nRFRxBuff[5];//呼叫地址第2字节
    SystemBuffers.nRFTxBuff[2] = SystemBuffers.nRFRxBuff[6];//呼叫地址第3字节
    SystemBuffers.nRFTxBuff[3] = SystemBuffers.nRFRxBuff[7];//呼叫地址第4字节

    SystemBuffers.nRFTxBuff[4] = SystemBuffers.nRFRxBuff[0];//本机地址第1字节
    SystemBuffers.nRFTxBuff[5] = SystemBuffers.nRFRxBuff[1];//本机地址第2字节
    SystemBuffers.nRFTxBuff[6] = SystemBuffers.nRFRxBuff[2];//本机地址第3字节
    SystemBuffers.nRFTxBuff[7] = SystemBuffers.nRFRxBuff[3];//本机地址第4字节

    SystemBuffers.nRFTxBuff[8] = SystemBuffers.nRFRxBuff[8];//工作频率低8位

    SystemBuffers.nRFTxBuff[9] = 0x81;//请求命令
    for (i = 10; i < 32; i ++) SystemBuffers.nRFTxBuff = 0;
    SystemBuffers.nRFTxCount = 32;//要求间接无线发送
    for (i = 0; i < 32; i ++) SioBuffers.SioTxBuff = SystemBuffers.nRFTxBuff;
    SioBuffers.SioTXCount = 32;//要求间接串口发送
    TI = 1;//送串口显示
//    LED0 = 0;//压键灯亮
  }
}

//键
void Key01(void) using 0
{
unsigned char i;
  if (SystemBuffers.nRFTxCount == 0) {//无线发送缓冲区为空
    SystemBuffers.nRFTxBuff[0] = SystemBuffers.nRFRxBuff[4];//呼叫地址第1字节
    SystemBuffers.nRFTxBuff[1] = SystemBuffers.nRFRxBuff[5];//呼叫地址第2字节
    SystemBuffers.nRFTxBuff[2] = SystemBuffers.nRFRxBuff[6];//呼叫地址第3字节
    SystemBuffers.nRFTxBuff[3] = SystemBuffers.nRFRxBuff[7];//呼叫地址第4字节

    SystemBuffers.nRFTxBuff[4] = SystemBuffers.nRFRxBuff[0];//本机地址第1字节
    SystemBuffers.nRFTxBuff[5] = SystemBuffers.nRFRxBuff[1];//本机地址第2字节
    SystemBuffers.nRFTxBuff[6] = SystemBuffers.nRFRxBuff[2];//本机地址第3字节
    SystemBuffers.nRFTxBuff[7] = SystemBuffers.nRFRxBuff[3];//本机地址第4字节

    SystemBuffers.nRFTxBuff[8] = SystemBuffers.nRFRxBuff[8];//工作频率低8位

    SystemBuffers.nRFTxBuff[9] = 0x82;//请求
    for (i = 10; i < 32; i ++) SystemBuffers.nRFTxBuff = 0;
    SystemBuffers.nRFTxCount = 32;//要求间接无线发送
    for (i = 0; i < 32; i ++) SioBuffers.SioTxBuff = SystemBuffers.nRFTxBuff;
    SioBuffers.SioTXCount = 32;//要求间接串口发送
    TI = 1;//送串口显示
//  LED1 = 0;//压键灯亮
  }
}

void Key02(void) using 0
{
unsigned char i;
  if (SystemBuffers.nRFTxCount == 0) {//无线发送缓冲区为空
    SystemBuffers.nRFTxBuff[0] = SystemBuffers.nRFRxBuff[4];//呼叫地址第1字节
    SystemBuffers.nRFTxBuff[1] = SystemBuffers.nRFRxBuff[5];//呼叫地址第2字节
    SystemBuffers.nRFTxBuff[2] = SystemBuffers.nRFRxBuff[6];//呼叫地址第3字节
    SystemBuffers.nRFTxBuff[3] = SystemBuffers.nRFRxBuff[7];//呼叫地址第4字节

    SystemBuffers.nRFTxBuff[4] = SystemBuffers.nRFRxBuff[0];//本机地址第1字节
    SystemBuffers.nRFTxBuff[5] = SystemBuffers.nRFRxBuff[1];//本机地址第2字节
    SystemBuffers.nRFTxBuff[6] = SystemBuffers.nRFRxBuff[2];//本机地址第3字节
    SystemBuffers.nRFTxBuff[7] = SystemBuffers.nRFRxBuff[3];//本机地址第4字节

    SystemBuffers.nRFTxBuff[8] = SystemBuffers.nRFRxBuff[8];//工作频率低8位

    SystemBuffers.nRFTxBuff[9] = 0x83;//变址请求
    for (i = 10; i < 32; i ++) SystemBuffers.nRFTxBuff = 0;
    SystemBuffers.nRFTxCount = 32;//要求间接无线发送
    for (i = 0; i < 32; i ++) SioBuffers.SioTxBuff = SystemBuffers.nRFTxBuff;
    SioBuffers.SioTXCount = 32;//要求间接串口发送
    TI = 1;//送串口显示
//  LED2 = 0;//压键灯亮
  }
}

void Key03(void) using 0
{
unsigned char i;
  if (SystemBuffers.nRFTxCount == 0) {//无线发送缓冲区为空
    SystemBuffers.nRFTxBuff[0] = SystemBuffers.nRFRxBuff[4];//呼叫地址第1字节
    SystemBuffers.nRFTxBuff[1] = SystemBuffers.nRFRxBuff[5];//呼叫地址第2字节
    SystemBuffers.nRFTxBuff[2] = SystemBuffers.nRFRxBuff[6];//呼叫地址第3字节
    SystemBuffers.nRFTxBuff[3] = SystemBuffers.nRFRxBuff[7];//呼叫地址第4字节

    SystemBuffers.nRFTxBuff[4] = SystemBuffers.nRFRxBuff[0];//本机地址第1字节
    SystemBuffers.nRFTxBuff[5] = SystemBuffers.nRFRxBuff[1];//本机地址第2字节
    SystemBuffers.nRFTxBuff[6] = SystemBuffers.nRFRxBuff[2];//本机地址第3字节
    SystemBuffers.nRFTxBuff[7] = SystemBuffers.nRFRxBuff[3];//本机地址第4字节

    SystemBuffers.nRFTxBuff[8] = SystemBuffers.nRFRxBuff[8];//工作频率低8位

    SystemBuffers.nRFTxBuff[9] = 0x84;//跳频请求
    for (i = 10; i < 32; i ++) SystemBuffers.nRFTxBuff = 0;
    SystemBuffers.nRFTxCount = 32;//要求间接无线发送
    for (i = 0; i < 32; i ++) SioBuffers.SioTxBuff = SystemBuffers.nRFTxBuff;
    SioBuffers.SioTXCount = 32;//要求间接串口发送
    TI = 1;//送串口显示
//  LED3 = 0;//压键灯亮
  }
}

void Key10(void) using 0
{
  LED0 = 1;//放键灭灯
}

void Key11(void) using 0
{
  LED1 = 1;//放键灭灯
}

void Key12(void) using 0
{
  LED2 = 1;//放键灭灯
}

void Key13(void) using 0
{
  LED3 = 1;//放键灭灯
}

void Key20(void) using 0
{
  LED0 = 1;//长压键灭灯
  Key00();//连_发
}

void Key21(void) using 0
{
  LED0 = 1;//长压键灭灯
  Key01();//连_发
}

void Key22(void) using 0
{
  LED0 = 1;//长压键灭灯
  Key02();//连_发
}

void Key23(void) using 0
{
  LED0 = 1;//长压键灭灯
  Key03();//连_发
}
头像被屏蔽

出0入0汤圆

发表于 2007-10-24 15:11:43 | 显示全部楼层
谢谢! COOL ,注释得很详细啊。

出0入0汤圆

 楼主| 发表于 2007-10-24 15:20:30 | 显示全部楼层
*----------------------------------------------------------
    具备跳号跳频和跳址的nrf905的C51演示程序nrf905.h
HotPower@126.com   2006.6.6  于大雁塔村队部
----------------------------------------------------------*/

#define nRFMainDev //主设备

//#define SysWaitTime 20//0.5*20=10S不压键停止闪烁
#define SysWaitTime 6//0.5*20=3S不压键停止闪烁
#define SysPushKeyTime 150//长压键150 * 20mS = 3。0S

#define T2_5mS -921.6*5//5ms 12MHz
/*------------------------------------------------
AT89S5X
--------------------------------------------------*/
sfr   AUXR    = 0x8e;
sfr   WDTRST  = 0xa6;
sfr16 TIMEER2 = 0xcc;
sfr16 RCAP    = 0xca;

//全局变量定义
typedef struct Systemstruct{//系统数据结构
//  unsigned char SystemFlage;//系统标志
  unsigned char TimeCount;
  unsigned int RamTest;
  unsigned char TestTime;
  unsigned char WaitTime;
  unsigned char KeyCount[4];
  unsigned char nRFTxCount;
  unsigned char nRFRxCount;
  unsigned char nRFTxBuff[32];
  unsigned char nRFRxBuff[32];
}SystemData;

//全局变量定义
typedef struct Siostruct{//系统数据结构
  unsigned char SioTxBuff[32];
  unsigned char SioRxBuff[32];
  unsigned char SioTXCount;
  unsigned char SioRXCount;
}SioData;
/*-----------------------------------------------
        nrf905管脚定义
------------------------------------------------*/
sbit TX_EN = P2^6;//0
sbit TRX_CE = P2^5;//0
sbit PWR_UP = P2^4;//1
sbit MISO = P2^3;//1
sbit MOSI = P2^2;//1
sbit SCK  = P2^1;//0
sbit CSN  = P2^0;//1

sbit AM  = P3^2;//1
sbit DR  = P3^3;//1
sbit CD  = P3^5;//1

sbit    KEY0    = P0^0;
sbit    KEY1    = P0^1;
sbit    KEY2    = P0^2;
sbit    KEY3    = P0^3;
sbit    LED0    = P0^4;
sbit    LED1    = P0^5;
sbit    LED2    = P0^6;
sbit    LED3    = P0^7;
#define Status_AM 0x80
#define Status_DR 0x20

/*-----------------------------------------------
        nrf905命令控制字
------------------------------------------------*/
#define WC  0x00   // Write configuration register command
#define RC  0x10    // Read  configuration register command
#define WTP  0x20    // Write TX Payload  command
#define RTP  0x21   // Read  TX Payload  command
#define WTA  0x22   // Write TX Address  command
#define RTA  0x23   // Read  TX Address  command
#define RRP  0x24   // Read  RX Payload  command
#define CC      0x80            // fast config

/*-------------------------------------------------------------------------------------------
        nrf905配置寄存器(10Byte)
工作频率f=(422.4+CH_NO/10)*(1+HFREQ_PLL)MHz
-------------------------------------------------------------------------------------------*/
#ifdef  nRFMainDev
#define RX_ADDRESS           0x00000000               //接收有效地址
//#define TX_ADDRESS           0x12345678               //发送有效地址
//#define TX_ADDRESS           0x02345678               //发送有效地址
#else
//#define RX_ADDRESS           0x12345678               //接收有效地址
#define RX_ADDRESS           0x12345678               //接收有效地址
//#define TX_ADDRESS           0x00000000               //发送有效地址
#endif

#define CH_NO_FREQ_422_4MHz  0x000                     //工作频率422.4MHz(433MHz频段最低频率)
#define CH_NO_FREQ_422_5MHz  0x001                     //工作频率422.5MHz
#define CH_NO_FREQ_425_0MHz  0x01a                     //工作频率425.0MHz
#define CH_NO_FREQ_427_5MHz  0x033                     //工作频率427.5MHz

#define CH_NO_FREQ_430_0MHz  0x04c                     //工作频率430.0MHz
#define CH_NO_FREQ_433_0MHz  0x06a                     //工作频率433.0MHz(433MHz频段基准频率)
#define CH_NO_FREQ_433_1MHz  0x06b                     //工作频率433.1MHz
#define CH_NO_FREQ_433_2MHz  0x06c                     //工作频率433.2MHz
#define CH_NO_FREQ_434_7MHz  0x07b                     //工作频率434.7MHz
#define CH_NO_FREQ_473_5MHz  0x1ff                     //工作频率473.5MHz(433MHz频段最高频率)

#define CH_NO_FREQ_844_8MHz  0x000                     //工作频率844.8MHz(868MHz频段最低频率)

#define CH_NO_FREQ_862_0MHz  0x056                     //工作频率862.0MHz
#define CH_NO_FREQ_868_0MHz  0x074                     //工作频率868.0MHz(868MHz频段基准频率)
#define CH_NO_FREQ_868_2MHz  0x075                     //工作频率868.2MHz
#define CH_NO_FREQ_868_4MHz  0x076                     //工作频率868.4MHz
#define CH_NO_FREQ_869_8MHz  0x07d                     //工作频率869.8MHz
#define CH_NO_FREQ_895_8MHz  0x0ff                     //工作频率895.8MHz
#define CH_NO_FREQ_896_0MHz  0x100                     //工作频率896.0MHz
#define CH_NO_FREQ_900_0MHz  0x114                     //工作频率900.0MHz
#define CH_NO_FREQ_902_2MHz  0x11f                     //工作频率902.2MHz
#define CH_NO_FREQ_902_4MHz  0x120                     //工作频率902.4MHz
#define CH_NO_FREQ_915_0MHz  0x15f                     //工作频率915.0MHz(915MHz频段基准频率)
#define CH_NO_FREQ_927_8MHz  0x19f                     //工作频率927.8MHz

#define CH_NO_FREQ_947_0MHz  0x1ff                     //工作频率947.0MHz(915MHz频段最高频率)

#define CH_NO_FREQ           CH_NO_FREQ_433_0MHz       //工作频率433.0MHz


#define CH_NO_BYTE           CH_NO_FREQ & 0xff         //工作频率低8位       Byte0       01101100

#define AUTO_RETRAN          0x20                      //重发数据包          Byte1.5     0
#define RX_RED_PWR           0x10                      //接收低功耗模式      Byte1.4     0
#define PA_PWR__10dBm        0x00                      //输出功率-10dBm      Byte1.3~2   00
#define PA_PWR_2dBm          0x04                      //输出功率+2dBm       Byte1.3~2
#define PA_PWR_6dBm          0x08                      //输出功率+6dBm       Byte1.3~2
#define PA_PWR_10dBm         0x0c                      //输出功率+10dBm      Byte1.3~2  
#define HFREQ_PLL_433MHz     0x00                      //工作在433MHz频段    Byte1.1     0
#define HFREQ_PLL_868MHz     0x02                      //工作在868MHz频段    Byte1.1
#define HFREQ_PLL_915MHz     0x02                      //工作在915MHz频段    Byte1.1
#define CH_NO_BIT8           CH_NO_FREQ >> 8           //工作频率第9位       Byte1.0     0

#define TX_AFW_1BYTE         1 * 16                    //发送地址宽度1字节   Byte2.7~4
#define TX_AFW_2BYTE         2 * 16                    //发送地址宽度2字节   Byte2.7~4
#define TX_AFW_3BYTE         3 * 16                    //发送地址宽度3字节   Byte2.7~4
#define TX_AFW_4BYTE         4 * 16                    //发送地址宽度4字节   Byte2.7~4   100
#define RX_AFW_1BYTE         1                         //接收地址宽度1字节   Byte2.3~0
#define RX_AFW_2BYTE         2                         //接收地址宽度2字节   Byte2.3~0
#define RX_AFW_3BYTE         3                         //接收地址宽度3字节   Byte2.3~0
#define RX_AFW_4BYTE         4                         //接收地址宽度4字节   Byte2.3~0   100
#define RX_PW_1BYTE          1                         //接收数据宽度1字节   Byte3.5~0
#define RX_PW_32BYTE         32                        //接收数据宽度32字节  Byte3.5~0   00100000
#define TX_PW_1BYTE          1                         //发送数据宽度1字节   Byte4.5~0
#define TX_PW_32BYTE         32                        //发送数据宽度32字节  Byte4.5~0   00100000
#define RX_ADDRESS_0         RX_ADDRESS >> 24          //接收有效地址第1字节 Byte5       11100111
#define RX_ADDRESS_1         (RX_ADDRESS >> 16) & 0xff //接收有效地址第2字节 Byte6       11100111
#define RX_ADDRESS_2         (RX_ADDRESS >> 8) & 0xff  //接收有效地址第3字节 Byte7       11100111
#define RX_ADDRESS_3         RX_ADDRESS & 0xff         //接收有效地址第4字节 Byte8       11100111
      
#define CRC_MODE_16BIT       0x80                      //CRC16模式           Byte9.7     1
#define CRC_MODE_8BIT        0x00                      //CRC8模式            Byte9.7   
#define CRC_EN               0x40                      //CRC使能             Byte9.6     1
#define CRC16_EN             0xc0                      //CRC16模式使能       Byte9.7~6   11
#define CRC8_EN              0x40                      //CRC8模式使能        Byte9.7~6
#define XOF_20MHz            0x20                      //晶体振荡器频率20MHz Byte9.5~3
#define XOF_16MHz            0x18                      //晶体振荡器频率16MHz Byte9.5~3   100
#define XOF_12MHz            0x10                      //晶体振荡器频率12MHz Byte9.5~3
#define XOF_8MHz             0x08                      //晶体振荡器频率8MHz  Byte9.5~3
#define XOF_4MHz             0x00                      //晶体振荡器频率4MHz  Byte9.5~3
#define UP_CLK_EN            0x40                      //输出时钟使能        Byte9.2     1
#define UP_CLK_FREQ_500kHz   0x03                      //输出时钟频率500kHz  Byte9.1~0   11
#define UP_CLK_FREQ_1MHz     0x02                      //输出时钟频率1MHz    Byte9.1~0
#define UP_CLK_FREQ_2MHz     0x01                      //输出时钟频率2MHz    Byte9.1~0
#define UP_CLK_FREQ_4MHz     0x00                      //输出时钟频率4MHz    Byte9.1~0

#define UP_CLK_EN_500kHz     0x43                      //输出时钟频率500kHz  Byte9.2~0   111
#define UP_CLK_EN_1MHz       0x42                      //输出时钟频率1MHz    Byte9.2~0
#define UP_CLK_EN_2MHz       0x41                      //输出时钟频率2MHz    Byte9.2~0
#define UP_CLK_EN_4MHz       0x40                      //输出时钟频率4MHz    Byte9.2~0

//#define TX_ADDRESS_0         TX_ADDRESS >> 24          //发送接收有效地址第1字节
//#define TX_ADDRESS_1         (TX_ADDRESS >> 16) & 0xff //发送有效地址第2字节
//#define TX_ADDRESS_2         (TX_ADDRESS >> 8) & 0xff  //发送有效地址第3字节
//#define TX_ADDRESS_3         TX_ADDRESS & 0xff         //发送有效地址第4字节

/*-----------------------------------------------
        nrf905库函数定义
------------------------------------------------*/
extern unsigned char SpiReadWrite(unsigned char);
extern void WriteTXAddr(unsigned long);
extern void WriteTXBuffer(const unsigned char []);
extern unsigned char ReadStatus(void);
extern void nRF905PowerUP(void);

出0入0汤圆

 楼主| 发表于 2007-10-24 15:23:42 | 显示全部楼层
注明,此为网友Hotpower的代码,我觉得对于现在开发Nordic无线产品的朋友会有帮助,所以贴出来了.
Hotpower网友的文潭里有很多好东东,如果大家有兴趣,可以去遛遛,我想你不会太失望的.
在此感谢Hotpower的无私奉献精神.!!!!
本文的出处:http://www.ednchina.com/blog/hotpower/16298/category.aspx

出0入0汤圆

 楼主| 发表于 2007-10-24 15:31:52 | 显示全部楼层
/*-------------------------------------------------------------------------------------------
nrf905配置寄存器宏定义

        nrf905配置寄存器(10Byte)
工作频率f=(422.4+CH_NO/10)*(1+HFREQ_PLL)MHz

HotPower@126.com    2004.10.14
-------------------------------------------------------------------------------------------*/
#define RX_ADDRESS           0x00000000               //接收有效地址(本方)
#define TX_ADDRESS           0x02345678               //发送有效地址(对方)

#define CH_NO_FREQ_422_4MHz  0x000                     //工作频率422.4MHz(433MHz频段最低频率)
#define CH_NO_FREQ_422_5MHz  0x001                     //工作频率422.5MHz
#define CH_NO_FREQ_425_0MHz  0x01a                     //工作频率425.0MHz
#define CH_NO_FREQ_427_5MHz  0x033                     //工作频率427.5MHz

#define CH_NO_FREQ_430_0MHz  0x04c                     //工作频率430.0MHz
#define CH_NO_FREQ_433_0MHz  0x06a                     //工作频率433.0MHz(433MHz频段基准频率)
#define CH_NO_FREQ_433_1MHz  0x06b                     //工作频率433.1MHz
#define CH_NO_FREQ_433_2MHz  0x06c                     //工作频率433.2MHz
#define CH_NO_FREQ_434_7MHz  0x07b                     //工作频率434.7MHz
#define CH_NO_FREQ_473_5MHz  0x1ff                     //工作频率473.5MHz(433MHz频段最高频率)

#define CH_NO_FREQ_844_8MHz  0x000                     //工作频率844.8MHz(868MHz频段最低频率)

#define CH_NO_FREQ_862_0MHz  0x056                     //工作频率862.0MHz
#define CH_NO_FREQ_868_0MHz  0x074                     //工作频率868.0MHz(868MHz频段基准频率)
#define CH_NO_FREQ_868_2MHz  0x075                     //工作频率868.2MHz
#define CH_NO_FREQ_868_4MHz  0x076                     //工作频率868.4MHz
#define CH_NO_FREQ_869_8MHz  0x07d                     //工作频率869.8MHz
#define CH_NO_FREQ_895_8MHz  0x0ff                     //工作频率895.8MHz
#define CH_NO_FREQ_896_0MHz  0x100                     //工作频率896.0MHz
#define CH_NO_FREQ_900_0MHz  0x114                     //工作频率900.0MHz
#define CH_NO_FREQ_902_2MHz  0x11f                     //工作频率902.2MHz
#define CH_NO_FREQ_902_4MHz  0x120                     //工作频率902.4MHz
#define CH_NO_FREQ_915_0MHz  0x15f                     //工作频率915.0MHz(915MHz频段基准频率)
#define CH_NO_FREQ_927_8MHz  0x19f                     //工作频率927.8MHz

#define CH_NO_FREQ_947_0MHz  0x1ff                     //工作频率947.0MHz(915MHz频段最高频率)

#define CH_NO_FREQ           CH_NO_FREQ_433_0MHz       //工作频率433.0MHz


#define CH_NO_BYTE           CH_NO_FREQ & 0xff         //工作频率低8位       Byte0       01101100

#define AUTO_RETRAN          0x20                      //重发数据包          Byte1.5     0
#define RX_RED_PWR           0x10                      //接收低功耗模式      Byte1.4     0
#define PA_PWR__10dBm        0x00                      //输出功率-10dBm      Byte1.3~2   00
#define PA_PWR_2dBm          0x04                      //输出功率+2dBm       Byte1.3~2
#define PA_PWR_6dBm          0x08                      //输出功率+6dBm       Byte1.3~2
#define PA_PWR_10dBm         0x0c                      //输出功率+10dBm      Byte1.3~2  
#define HFREQ_PLL_433MHz     0x00                      //工作在433MHz频段    Byte1.1     0
#define HFREQ_PLL_868MHz     0x02                      //工作在868MHz频段    Byte1.1
#define HFREQ_PLL_915MHz     0x02                      //工作在915MHz频段    Byte1.1
#define CH_NO_BIT8           CH_NO_FREQ >> 8           //工作频率第9位       Byte1.0     0

#define TX_AFW_1BYTE         1 * 16                    //发送地址宽度1字节   Byte2.7~4
#define TX_AFW_2BYTE         2 * 16                    //发送地址宽度2字节   Byte2.7~4
#define TX_AFW_3BYTE         3 * 16                    //发送地址宽度3字节   Byte2.7~4
#define TX_AFW_4BYTE         4 * 16                    //发送地址宽度4字节   Byte2.7~4   100
#define RX_AFW_1BYTE         1                         //接收地址宽度1字节   Byte2.3~0
#define RX_AFW_2BYTE         2                         //接收地址宽度2字节   Byte2.3~0
#define RX_AFW_3BYTE         3                         //接收地址宽度3字节   Byte2.3~0
#define RX_AFW_4BYTE         4                         //接收地址宽度4字节   Byte2.3~0   100
#define RX_PW_1BYTE          1                         //接收数据宽度1字节   Byte3.5~0
#define RX_PW_32BYTE         32                        //接收数据宽度32字节  Byte3.5~0   00100000
#define TX_PW_1BYTE          1                         //发送数据宽度1字节   Byte4.5~0
#define TX_PW_32BYTE         32                        //发送数据宽度32字节  Byte4.5~0   00100000
#define RX_ADDRESS_0         RX_ADDRESS >> 24          //接收有效地址第1字节 Byte5       11100111
#define RX_ADDRESS_1         (RX_ADDRESS >> 16) & 0xff //接收有效地址第2字节 Byte6       11100111
#define RX_ADDRESS_2         (RX_ADDRESS >> 8) & 0xff  //接收有效地址第3字节 Byte7       11100111
#define RX_ADDRESS_3         RX_ADDRESS & 0xff         //接收有效地址第4字节 Byte8       11100111
      
#define CRC_MODE_16BIT       0x80                      //CRC16模式           Byte9.7     1
#define CRC_MODE_8BIT        0x00                      //CRC8模式            Byte9.7   
#define CRC_EN               0x40                      //CRC使能             Byte9.6     1
#define CRC16_EN             0xc0                      //CRC16模式使能       Byte9.7~6   11
#define CRC8_EN              0x40                      //CRC8模式使能        Byte9.7~6
#define XOF_20MHz            0x20                      //晶体振荡器频率20MHz Byte9.5~3
#define XOF_16MHz            0x18                      //晶体振荡器频率16MHz Byte9.5~3   100
#define XOF_12MHz            0x10                      //晶体振荡器频率12MHz Byte9.5~3
#define XOF_8MHz             0x08                      //晶体振荡器频率8MHz  Byte9.5~3
#define XOF_4MHz             0x00                      //晶体振荡器频率4MHz  Byte9.5~3
#define UP_CLK_EN            0x40                      //输出时钟使能        Byte9.2     1
#define UP_CLK_FREQ_500kHz   0x03                      //输出时钟频率500kHz  Byte9.1~0   11
#define UP_CLK_FREQ_1MHz     0x02                      //输出时钟频率1MHz    Byte9.1~0
#define UP_CLK_FREQ_2MHz     0x01                      //输出时钟频率2MHz    Byte9.1~0
#define UP_CLK_FREQ_4MHz     0x00                      //输出时钟频率4MHz    Byte9.1~0

#define UP_CLK_EN_500kHz     0x43                      //输出时钟频率500kHz  Byte9.2~0   111
#define UP_CLK_EN_1MHz       0x42                      //输出时钟频率1MHz    Byte9.2~0
#define UP_CLK_EN_2MHz       0x41                      //输出时钟频率2MHz    Byte9.2~0
#define UP_CLK_EN_4MHz       0x40                      //输出时钟频率4MHz    Byte9.2~0

#define TX_ADDRESS_0         TX_ADDRESS >> 24          //发送有效地址第1字节
#define TX_ADDRESS_1         (TX_ADDRESS >> 16) & 0xff //发送有效地址第2字节
#define TX_ADDRESS_2         (TX_ADDRESS >> 8) & 0xff  //发送有效地址第3字节
#define TX_ADDRESS_3         TX_ADDRESS & 0xff         //发送有效地址第4字节

出0入0汤圆

发表于 2007-10-24 20:20:17 | 显示全部楼层
楼主是Hotpower老大吧???谢谢你的程序,很有参考价值啊,非常感谢!!!

出0入0汤圆

发表于 2008-9-6 14:04:10 | 显示全部楼层
mark够详细的

出0入0汤圆

发表于 2008-9-7 00:57:09 | 显示全部楼层
不错,好资料

出0入0汤圆

发表于 2008-9-7 10:02:43 | 显示全部楼层
顶一个吧

出0入0汤圆

发表于 2008-9-7 10:17:08 | 显示全部楼层
ding!

出0入0汤圆

发表于 2008-9-7 12:58:51 | 显示全部楼层
我的娘哎,好详细啊....光是冲着你的开源精神就得顶一下

出0入0汤圆

发表于 2008-9-7 14:15:44 | 显示全部楼层
up

出0入0汤圆

发表于 2008-9-7 16:50:32 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-9-8 23:34:57 | 显示全部楼层
不顶不行啊!

出0入0汤圆

发表于 2008-9-9 13:36:01 | 显示全部楼层

出0入25汤圆

发表于 2009-4-20 17:06:04 | 显示全部楼层
upupup

出0入0汤圆

发表于 2009-4-21 11:22:49 | 显示全部楼层
MARK

出0入96汤圆

发表于 2010-5-12 09:53:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-25 15:28:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-25 17:41:15 | 显示全部楼层
mark 详细

出0入0汤圆

发表于 2010-8-29 22:39:02 | 显示全部楼层
顶起

出0入0汤圆

发表于 2010-9-29 12:49:55 | 显示全部楼层
make,记号,详细

出0入0汤圆

发表于 2010-9-29 13:59:56 | 显示全部楼层
不错,不错,很详细

出0入0汤圆

发表于 2010-9-29 15:37:29 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-10-19 10:53:05 | 显示全部楼层
mark rf905

出0入0汤圆

发表于 2011-8-18 14:18:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-18 14:23:48 | 显示全部楼层
这是avr版块儿

出0入0汤圆

发表于 2011-8-20 10:29:48 | 显示全部楼层
谢谢分享,呵呵,正需要这个

出0入0汤圆

发表于 2011-8-20 16:25:53 | 显示全部楼层
多谢分享

出0入0汤圆

发表于 2011-10-23 18:36:33 | 显示全部楼层
多谢!

出0入0汤圆

发表于 2011-10-23 19:51:26 | 显示全部楼层
不错,好东西。

出0入0汤圆

发表于 2011-10-30 19:51:11 | 显示全部楼层
MARK,多谢。

出0入0汤圆

发表于 2011-10-30 23:27:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-31 07:04:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-1 14:06:46 | 显示全部楼层
MARK!好资料!

出0入0汤圆

发表于 2011-12-16 19:32:28 | 显示全部楼层
MAKE GOODE

出0入0汤圆

发表于 2011-12-16 19:40:31 | 显示全部楼层
mark

出0入18汤圆

发表于 2011-12-18 23:46:29 | 显示全部楼层
不顶不行啊!

出0入0汤圆

发表于 2011-12-19 08:05:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-21 19:58:38 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2012-12-31 01:30:06 | 显示全部楼层
顶起来了  我回头详细看

出0入0汤圆

发表于 2012-12-31 09:18:25 | 显示全部楼层
谢谢分享。。。。

出0入0汤圆

发表于 2013-4-14 15:58:49 | 显示全部楼层
虽然时间那么久了,但对我们这些初学者肯定很有用

出0入0汤圆

发表于 2013-4-27 16:09:13 | 显示全部楼层
可以写个流程图就好了,代码太多了,没有时间看,看完了不一定用得上。

出0入0汤圆

发表于 2013-10-11 11:31:36 | 显示全部楼层
做个标记好好学飞

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 15:00

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

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