⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf401_tongxin.txt

📁 单片无线收发芯片nRF401的通信实验程序(C语言源文件)
💻 TXT
字号:
/*----------------------------------------------------------------------
nrf401实验程序

-----------------------------------------------------------------------*/
#include <AT89X52.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
#include <nrf401.h>
#include <hotins.h>

#define T0_8mS -8000
#define T1_8mS -8000
#define T2_1_25mS -576 //-1250*0.9216=1.25MS


/*----------------------------------------------------------------------
        系统函数
-----------------------------------------------------------------------*/
void MainInit(void);//系统初始化
void ClrWdt(void);//喂狗
void nRFInit(void);
void SystemInit(void);//系统初始化
void SystemSetup(void);//系统设置
void SystemIoInit(void);//系统接口初始化
void UserSetup(void);//用户运行环境设置
void TimeInit(void);
unsigned char crc8r(unsigned char crcbyte);
unsigned int crc16r(unsigned int crcword, unsigned int crc);
unsigned int GetTXBuffWord(unsigned char ledpos);
void SetTXBuffWord(unsigned char ledpos, unsigned int val);
unsigned int GetRXBuffWord(unsigned char ledpos);
void SetRXBuffWord(unsigned char ledpos, unsigned int val);


SystemData SystemBuffers;//申请系统数据结构

SioData SioBuffers;

/*-----------------------------------------
         主程序初始化
-------------------------------------------*/
void MainInit(void)//系统初始化
{
  SystemIoInit();//系统接口初始化
  ClrWdt();//清除看门狗计数器
  if (SystemBuffers.RamTest != 0x55aa) {//内存测试
SystemInit();//系统上电初始化
  }
  SystemSetup();//系统运行环境设置
  UserSetup();//用户运行环境设置
}

void SystemInit(void)//系统初始化
{
  SystemBuffers.RamTest = 0x55aa;//内存初始化
}

void SystemSetup(void)//系统设置
{
  AUXR = 0x01;//关闭EMI
  nRFInit();
  TimeInit();
  IP = 0x10;//中断优先级EX1>ET2>ET0>EX0>ES
  IE = 0xb4;//开中断EA,ET2,ET1,EX1,ET0
}

void UserSetup(void)//用户运行环境设置
{
}

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

void TimeInit()
{
  TMOD = 0x21;//定时器0,1为方式1(十六位定时器)
  TCON = 0x55;//启动定时器TR1EQUTR0EQU1,IT1EQUIT0EQU1
/*----------------------------------
      定时器0定时参数设置
----------------------------------*/
  TL0 = 0;
  TH0 = 0;
  TR0 = 1;//启动定时器0
/*----------------------------------
      定时器0定时参数设置
----------------------------------*/
  TL1 = SIO_BPS;
  TH1 = SIO_BPS;
  PCON = 0x00;
  TR1 = 1;//启动定时器1
/*----------------------------------
      定时器2定时参数设置
----------------------------------*/
  TIMEER2 = T2_1_25mS;
  RCAP    = T2_1_25mS;
  TR2     = 1;//启动定时器2
}

void nRFInit(void)
{
  nRFCS    = 0;//433.92MHz//1//434.33MHz
  nRFTXEN  = 0;//接收
  nRFPWR   = 1;//上电
  SioBuffers.TXMAXCount = 0;
  SioBuffers.TXCount = 0;
//  SioBuffers.RXCount = 0;
  SCON     = 0x50;          /* SCON: mode 2, 9-bit UART, enable rcvr      */
  SioBuffers.RXCount = 16;
}


/*------------------------------------
         外部INT0中断服务程序
------------------------------------*/
void int0proc() interrupt IE0_VECTOR// using 1
{
}

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

/*------------------------------------
         外部INT1中断服务程序
------------------------------------*/
void int1proc() interrupt IE1_VECTOR using 1
{
}

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

/*------------------------------------
         串口SIO中断服务程序
------------------------------------*/
void sioproc() interrupt SIO_VECTOR// using 1
{
unsigned char i;
unsigned int crc;
  if (RI) {//接收中断
    RI = 0;
if (!nRFTXEN && SioBuffers.RXCount) {//每次接收20个数据
      i = SBUF;
      SioBuffers.RXCount --;
      SioBuffers.RXBuffers[19 - SioBuffers.RXCount] = i;
   switch(SioBuffers.RXCount) {
     case 19:
         if (i != 0x55) SioBuffers.RXCount = 20;
           break;
  case 18:
         if (i != 0xaa) SioBuffers.RXCount = 20;
           break;
  case 0:
         crc = 0;
      for (i = 1; i <= 8; i ++) {
                 crc = crc16r(GetRXBuffWord(i + i), crc);
      }
               if (crc != GetRXBuffWord(18))
                 SioBuffers.RXCount = 20;
       else {
                 nRFTXEN = 1;//发送
              for (i = 0; i < 20; i ++) {
             SioBuffers.TXBuffers[i] = SioBuffers.RXBuffers[i];
           }
     SioBuffers.TXMAXCount = TX_MAXCount;
                 SioBuffers.TXCount = TX_Count + 32;
     TI = 1;//接收结束立即转为发送
      }
         break;
   }
} 
  }
  if (TI) {//发送中断
    TI = 0;
    if (nRFTXEN && SioBuffers.TXCount) {
      SioBuffers.TXCount --;
      if (SioBuffers.TXCount > 19) {
     SBUF = 0x00;
//        SBUF = 0xff;
      }
      else {
        SBUF = SioBuffers.TXBuffers[19 - SioBuffers.TXCount];
      }
     if (SioBuffers.TXCount == 0) {
     if (SioBuffers.TXMAXCount) {
    SioBuffers.TXMAXCount --;
    SioBuffers.TXCount = TX_Count;
  }
        else {
          nRFTXEN = 0;//发送结束立即转为接收
          SioBuffers.RXCount = 20;
  }
   }
}
  }
}

/*------------------------------------
         定时器T2中断服务程序(1.25mS)
------------------------------------*/
void t2proc() interrupt TF2_VECTOR// using 2
{
//unsigned char i;
//unsigned int crc;
  TF2 = 0;
  if (PCON & GF0) {//中断是从主循环内跳入的才能喂狗
    ClrWdt();//清除看门狗计数器
    PCON &= ~GF0;//清除标志 
  }
  SystemBuffers.T2Count ++; 



//  if (SystemBuffers.T2Count >= 80) {//100mS到
  if (SystemBuffers.T2Count >= 400) {//500mS到
    SystemBuffers.T2Count = 0;
//if (((SystemBuffers.T2Count & 3) == 0) && (SioBuffers.TXCount == 0)) {//10mS
//if (SioBuffers.TXCount == 0) {//10mS
/*
if (!ES && (SioBuffers.TXCount == 0)) {//10mS
  SioBuffers.TXCount = 18;
  crc =GetTXBuffWord(2);
  crc = crc16r(crc);
  SetTXBuffWord(4, crc);
  nRFTXEN = 1;//发送
  TI = 1;
  ES = 1;
}
*/ 
//    SioBuffers.TXCount = 8;
//    nRFTXEN = 1;//发送
// SBUF = SioBuffers.TXBuffers[0];
//    ES = 1;
  }
}

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

unsigned char crc8r(unsigned char crcbyte)
{ 
unsigned char i,crc; 
  crc = 0;
  for(i = 0; i < 8; i++) { 
    if(((crc ^ crcbyte) & 0x01) == 0) crc >>= 1; 
    else{ 
      crc ^= 0x18;//0x18;//CRC=X8+X5+X4+1
      crc >>= 1; 
      crc |= 0x80; 
    } 
    crcbyte >>= 1; 
  }
  return crc; 
}

unsigned int crc16r(unsigned int crcword, unsigned int crc) 
{ 
unsigned char i; 
  for(i = 0; i < 16; i++){ 
    if(((crc ^ crcword ) & 0x0001) == 0) crc >>= 1; 
    else{ 
      crc ^= 0x810;//0x0810;//CRC=X16+X12+X5+1 
      crc >>= 1; 
      crc |= 0x8000; 
    } 
    crcword >>= 1; 
  } 
  return crc; 
} 

unsigned int GetTXBuffWord(unsigned char ledpos)
{
unsigned char val1, val2;
unsigned int val;
  val1 = SioBuffers.TXBuffers[ledpos];
  val2 = SioBuffers.TXBuffers[ledpos + 1];
  val = (val1 << 8) + val2;
  return val; 
}

void SetTXBuffWord(unsigned char ledpos, unsigned int val)
{
  SioBuffers.TXBuffers[ledpos]     = (val >> 8); 
  SioBuffers.TXBuffers[ledpos + 1] = val & 0xff;
}

unsigned int GetRXBuffWord(unsigned char ledpos)
{
unsigned char val1, val2;
unsigned int val;
  val1 = SioBuffers.RXBuffers[ledpos];
  val2 = SioBuffers.RXBuffers[ledpos + 1];
  val = (val1 << 8) + val2;
  return val; 
}

void SetRXBuffWord(unsigned char ledpos, unsigned int val)
{
  SioBuffers.RXBuffers[ledpos]     = (val >> 8); 
  SioBuffers.RXBuffers[ledpos + 1] = val & 0xff;
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -