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

📄 main.c

📁 基于MSP430单片机的测温系统及无线通信程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
      TI_CC_Wait(30000);
      TI_CC_Wait(30000);
      TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
      RFSendPacket(txBuffer1, 9);                 // Send value over RF
      TI_CC_Wait(30000);
      TI_CC_Wait(30000);
      TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
      RFSendPacket(txBuffer1, 9);                 // Send value over RF
      TI_CC_Wait(30000);
      TI_CC_Wait(30000);
      TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  
      j = 1;
    } 

    /*TI_CC_SPIStrobe(TI_CCxxx0_SFRX);//不能和RFReceivePacket()分得太远
    TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 
    TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调*/

    TI_CC_Wait(30000);    //要调的延时
    TI_CC_Wait(30000);
    _BIS_SR(LPM3_bits + GIE);
#endif 


#ifdef _SWOR
 // if (RFReceivePacket(rxBuffer,&len1))       // Fetch packet from CCxxxx
    //  j++;//;  
    //  TI_CC_Wait(30000);    //要调的延时
      //TI_CC_Wait(30000);    //要调的延时
      //TI_CC_Wait(30000);    //要调的延时  

    
    _BIS_SR(LPM3_bits + GIE);
#endif   
  
#ifdef receive
    switch(com)
    {
    case 01://返回一组温度值
         txBuffer2[0] = 24;
         txBuffer2[1] = 1;
         txBuffer2[2] = 2;
         txBuffer2[3] = 0xf1;    //返回一组温度
         for(x=4;x<24;x++)
         {
            txBuffer2[x] = tem_buffer[x-4];   //存数据到发送缓冲
         }
          RFSendPacket(txBuffer2, 24);
         com = 0;
          break;
      case 02:      // 读一次温度值
        DS18B20_OUT |= DS18B20;
        delay(60000) ;
        Ds18b20_Convert_commond(); 
        if(tempera > pre_tem)
        {
          txBuffer1[2] = 0xf3;//返回预警温度值命令
          txBuffer1[3] = tempera; 
          RFSendPacket(txBuffer1, 9);
        }
        tem_buffer[tem_flag] = tempera;
        tem_flag--;
        if(tem_flag == 0)
        {
          tem_flag = 19;
          txBuffer2[0] = 24;
          txBuffer2[1] = 1;
          txBuffer2[2] = 2;
          txBuffer2[3] = 0xf1;    //返回一组温度
          for(x=4;x<24;x++)
          {
            txBuffer2[x] = tem_buffer[x-4];   //存数据到发送缓冲
          }
          RFSendPacket(txBuffer2, 24);
        }
        TI_CC_SPIStrobe(TI_CCxxx0_SFRX);//不能和RFReceivePacket()分得太远???
        TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //???
        TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调???
        com = 0;
        break;
      case 05://设置预警温度
        pre_tem = rxBuffer[4];
        com = 0;
        break;
      case 06://采集温度间隔
        n = rxBuffer[4];
        m=n;
        com = 0;
        break;
      default:
        break;
    }
    _BIS_SR(LPM3_bits + GIE);
#endif    
  }
  
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  CCR0 = 50000;
  TACTL &= ~TAIFG;//复位ta
  m--;
  if(m==0)
  {
    ss++;
    m=n;
    if(ss == 1200)//ss = 1;
    {
       DS18B20_OUT |= DS18B20;
       delay(60000) ;
       Ds18b20_Convert_commond(); 
    //  com = 02;   //采集温度命令
      ss = 0;
      _BIC_SR_IRQ(LPM3_bits);
     }
   }
}


//#ifdef _RECEIVER
#pragma vector=PORT1_VECTOR
__interrupt void port1_ISR (void)
{ 
  TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN;              // Clear flag 在这里才能在调试状态下不断进入中断 
  
  // disEnable interrupts
  char len; 
                                      
  next++;                                         // stripped away within RX function)
#ifdef _SWOR 
  CCxxx0ExitWorMode();
  //TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
#endif 
//  TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN;              // Clear flag 在这里才能在调试状态下不断进入中断
  RFReceivePacket(rxBuffer,&len)   ;    // Fetch packet from CCxxxx
              // Toggle LEDs according to pkt data
  TI_CC_SPIStrobe(TI_CCxxx0_SFRX);//不能和RFReceivePacket()分得太远???
  TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调???
  com = rxBuffer[3];
  _BIC_SR_IRQ(LPM3_bits);
   ////////////////////////////////////////////
 /*  DS18B20_OUT |= DS18B20;
   delay(60000) ;
   Ds18b20_Convert_commond(); 
   txBuffer1[2]=  tempera;*/
    ////////////////////////////////////////// 
  
  //TI_CC_SPIStrobe(TI_CCxxx0_SFRX);//不能和RFReceivePacket()分得太远???
  //TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //???
  //TI_CC_SPIStrobe(TI_CCxxx0_SRX);//后面的延时比较难调???
 /* TI_CC_Wait(30000);    //要调的延时
  TI_CC_Wait(30000);    //要调的延时
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  

  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);*/
#ifdef _SWOR
  //TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
    
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);

  //TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
 
  //TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
 
  //TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
  RFSendPacket(txBuffer1, 9);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  TI_CC_Wait(30000);
  
 
  TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN;              // Clear flag 在这里才能在调试状态下不断进入中断  
  CCxxx0EnWorMode();
#endif   
  //_BIC_SR_IRQ(LPM3_bits);
 //_DINT(); 
}

void CCxxx0EnWorMode(void) 
{ 
// Set Event0 timeout = 300 ms (RX polling interval) 
// WOR_RES = 0 
// T_event0 = 750 / f_xosc * EVENT0 * 2^(5*WOR_RES) = 300 ms // Assuming f_xosc = 27 MHz 
// => EVENT0 = 10800 = 0x28A0 TI_CCxxx0_WOREVT1
  TI_CC_SPIWriteReg(TI_CCxxx0_WOREVT1,0x28 ); // WOR High byte Event Timeout. 0x32
  TI_CC_SPIWriteReg(TI_CCxxx0_WOREVT0, 0xa0); // WOR Low byte Event Timeout. 0xC8
// Enable automatic initial calibration of RCosc. 
// Set T_event1 ~ 345 us, enough for XOSC stabilize before starting calibration. 
// Enable RC oscillator before starting with WOR (or else it will not wake up). 
// Not using AUTO_SYNC function. 
  TI_CC_SPIWriteReg(TI_CCxxx0_WORCTRL, 0x38); // WOR control 电磁波激活控制0x79
// Setting Rx_timeout < 0.5 %. 
// => MCSM2.RX_TIME = 101b 
// => Rx_timeout = (EVENT0 * 0.1127) = (10800 * 0.1127) = 1.172 ms, i.e. 0.391% RX duty cycle 
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM2,0x00); // 主通道控制状态机配置
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1,0x30); //设置读取包后进入IDLE态 
  //TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0,0x18); //主通道控制状态机配置calibrate when going from IDLE to RX 
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 
  TI_CC_SPIStrobe(TI_CCxxx0_SWORRST); // Initialize CCxxxx WOR Timer.
  TI_CC_SPIStrobe(TI_CCxxx0_SWOR); // Start automatic RX polling sequence 
}


//************************************************************************************
//Returns : None 
//Parameters : None 
//Purpose : void CCxxx0ExitWorMode(void) 
// CC2500 退出WOR模式 要配置这些些寄存器
//功能描述:退出CCxxx0电磁波激活模式 
//注意事项:None
//************************************************************************************
void CCxxx0ExitWorMode(void)
{
  
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM2,0x07); 
//RX_TIME[2:0]=111 ,无工作暂停
  TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1,0x30); 
//CCA_MODE[5:4]=11,RXOFF_MODE[3:2]=00 , TXOFF_MODE[1:0]=00 
 // TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0,0x18); 
//Enable automatic FS calibration when going from IDLE to RX/TX/FSTXON 
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); 

}

⌨️ 快捷键说明

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