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

📄 uart4800.c

📁 使用MSP430F413的低功耗水表系统
💻 C
📖 第 1 页 / 共 2 页
字号:
}
/*****************************************************************/
/*功能描述:向TCB发送show_mode                                   */
/*函数说明:show_mode=0or1                                       */
/*调用函数: checkbcc()       TX_NBYTE(uchar)                     */
/*全局变量: RXTXBUF[0~6]    addr表地址                           */
/*输入:                                                          */
/*****************************************************************/
void read_show_mode_res(void)
{
RXTXBUF[0]=0XE9; 
RXTXBUF[1]=0X3A; 
RXTXBUF[2]=0X05; 
RXTXBUF[3]=addr; 
RXTXBUF[4]=show_mode;
RXTXBUF[6]=0XF0;
checkbcc(5);
TX_NBYTE(7);
}
/*****************************************************************/
/*功能描述:向TCB发送版本号                                      */
/*函数说明:                                                     */
/*调用函数: checkbcc()       TX_NBYTE(uchar)                     */
/*全局变量: RXTXBUF[0~8]    addr表地址                           */
/*输入:                                                          */
/*****************************************************************/
void read_version_res(void)//读版本号
{
RXTXBUF[0]=0XE9;
RXTXBUF[1]=0X3E; 
RXTXBUF[2]=0X07;
RXTXBUF[3]=addr;
RXTXBUF[4]=VERSION0;
RXTXBUF[5]=VERSION1;
RXTXBUF[6]=VERSION2;
checkbcc(7);
RXTXBUF[8]=0xF0;
TX_NBYTE(9);
}
/*****************************************************************/
/*功能描述:向TCB发送data xx.xxxxxx                              */
/*函数说明:00008.104 low~high 04 81 00 00                       */
/*调用函数: checkbcc()       TX_NBYTE(uchar)                     */
/*全局变量: RXTXBUF[0~9]    addr表地址                           */
/*输入:                                                          */
/*****************************************************************/
void read_data_verify_res(void)
{
 RXTXBUF[0]=0XE9;
 RXTXBUF[1]=0X32;
 RXTXBUF[2]=0X08; 
 RXTXBUF[3]=addr;
 RXTXBUF[4]=wt_who[1];
 RXTXBUF[5]=wt_who[2];
 RXTXBUF[6]=wt_who[3];
 RXTXBUF[7]=wt_who[4];
 RXTXBUF[9]=0xF0;
 checkbcc(8);
 TX_NBYTE(10);
}
/*****************************************************************/
/*功能描述:向TCB发送uart_mode                                   */
/*函数说明:show_mode=0x55 or 0                                  */
/*调用函数: checkbcc()       TX_NBYTE(uchar)                     */
/*全局变量: RXTXBUF[0~6]    addr表地址                           */
/*输入:                                                          */
/*****************************************************************/
void read_uart_mode_res(void)
{
 RXTXBUF[0]=0XE9;
 RXTXBUF[1]=0X36;
 RXTXBUF[2]=0X05; 
 RXTXBUF[3]=addr;
 RXTXBUF[4]=uart_mode;
 RXTXBUF[6]=0XF0;
 checkbcc(5);
 TX_NBYTE(7);
}

/************************************************************/
/*功能描述:跟据收到的命令 调用不同的处理函数               */
/*函数说明:                                                */
/*调用函数:                                                 */
/*全局变量: uart_w RXTXBUF[0~14]                            */
/*输入:     wt_who[] 8位;//L NNNNNNNN.NNNNNN H +ADDR      */
/*          conster[]  3位:L----H                          */
/************************************************************/
void comand(void)
{ 
 if(uart_w>6)
 { 
   if(RXTXBUF[0]==0XE1)
   {
   if(RXTXBUF[4]==password[0]&RXTXBUF[5]==password[1]&RXTXBUF[6]==password[2])
     {
       if(RXTXBUF[3]==addr)
     {
       if(RXTXBUF[2]==0x0A)
       {
         switch(RXTXBUF[1])
         {
          case 0x2C: write_time_res(RXTXBUF+7);break;
          case 0x21: write_password_res(RXTXBUF+7);break;
         }
       }
       else if(RXTXBUF[2]==0x08)
       {
         switch (RXTXBUF[1])
         {
          case 0x2A: write_show_mode_res(RXTXBUF+7);break;
          case 0x2F: write_lcd_show_res(RXTXBUF+7);break;
          case 0x26: write_uart_mode_res(RXTXBUF+7);break;
         }
       }
       else if(RXTXBUF[1]==0X22&RXTXBUF[2]==0X0B)
        {
         if(WRDATA_FLG==0)
         {
          write_data_res(RXTXBUF+7);
         }
        }
       else if(RXTXBUF[1]==0X29&RXTXBUF[2]==0X0D)
       {
        write_constant_res(RXTXBUF+7);
       }
      }
     else if(RXTXBUF[3]==0XFF)
      {
         if(RXTXBUF[1]==0x28&RXTXBUF[2]==0x08)
        {
         write_address_res(RXTXBUF+7);
        }
       }
      }
   }
 }
 else
 {
   if(RXTXBUF[0]==0XE1)
  {
   if(RXTXBUF[2]==4&RXTXBUF[3]==addr)
   {
    switch(RXTXBUF[1])
    {
     case 0x3C: read_time_res();break; 
     case 0x39: read_constant_res();break;  
     case 0x3A: read_show_mode_res();break;
     case 0x3e: read_version_res();break;
     case 0x32: read_data_verify_res();break;
     case 0x36: read_uart_mode_res();break;
    }
   }
     else if(RXTXBUF[1]==0X38&RXTXBUF[2]==0X04&RXTXBUF[3]==0XFF)
   {
    read_address_res();
   }
  }
   else if(RXTXBUF[0]==0XC0&RXTXBUF[1]==addr&RXTXBUF[3]==0XD0)
   {
    read_data_res();
   }
 }
}

/**************************************************************/
/*功能描述:接收N 个字节数据                                  */
/*函数说明:在本函数中还有对发送时间限定和规的一些处理        */
/*调用函数: RX_BYTE() comand()                                */
/*全局变量:RX_FLG uart start_flg uart_w RXTXDATA RXTXBUF[0~14]*/
/*输入:                                                       */
/**************************************************************/
void RX_NBYTE(void)
{
 static unsigned char checksum;
 while( RX_FLG )//是否接收到数据
      {
       RX_FLG=0;
       if(RXTXDATA==0XE1|RXTXDATA==0XC0)//判断是否为起始数据
         {
          if(uart_w==0)//uart_w=接收到的数据长度
            {
             start_flg=1;//收到起始数据的标志位
             uart=UART_SPAN;//时间限制
            }     
          if(uart_w==1)uart_w--;
          checksum=0;
         }
       if(start_flg)
         {
          RXTXBUF[uart_w]=RXTXDATA&0xff;
          checksum+=RXTXBUF[uart_w];
          uart_w++;
         }
       if(RXTXDATA==0xD0|RXTXDATA==0XF0)
         {
          start_flg=0;
          checksum-=RXTXBUF[uart_w-1];//checksum为CRC校验码
          checksum-=RXTXBUF[uart_w-2];    
          if((checksum&0x7f)==RXTXBUF[uart_w-2]){comand();}
          uart_w=0;   
         }
        RX_BYTE();
       }
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  if(time1>3)
  {CCR0+=Bitimel;time1=0;}                           // Add Offset to CCR0
  else {CCR0+=Bitimem;time1++;}
  // RX
  if (CCTL0 & CCIS0)                        //判断是否收到数据
  {
    if( CCTL0 & CAP )                       //是否start位
    {
      CCTL0 &= ~ CAP;                       //设置成比较模式
      CCR0 += Bitime_5;
    }
    else
    {
      RXTXDATA = RXTXDATA >> 1;
      if (CCTL0 & SCCI)                     // Get bit waiting in receive latch
        RXTXDATA |= 0x80;
      BitCnt --;                            //是否收到1字节数据
      if ( BitCnt == 0)
      {
        CCTL0 &= ~ CCIE;// 数据收完结束中断
        LPM3_EXIT;                //LPM3
        RX_FLG=1;
      }
    }
  }
  // TX
  else
  {
    if ( BitCnt == 0)
    { CCTL0 &= ~ CCIE;                      //数据发完关中断
      LPM3_EXIT;
    }
    else
    {
      CCTL0|= OUTMOD2;                 //101复位
      if (RXTXDATA & 0x01)
      CCTL0&=~OUTMOD2;                    //置位
      RXTXDATA = RXTXDATA >> 1;
      BitCnt --;
    }
  }
}
#pragma vector=TIMERA1_VECTOR
__interrupt void timea(void)
{
  if(CCTL1&CCIFG)
  {
    time2++;  
    if(time2&2)
      {
        CCR1+=time_20msm;
        time2=0;        
       }                // Add Offset to CCR0
    else
      {
       CCR1+=time_20msl;
      }
    CCTL1&=~CCIFG;
    time_t++;
    if(start_flg)
      {
       if(uart>=1)
         {uart--;}
       else
         {
          uart_w=0;
          start_flg=0;
         }
       }
    /*if(int_flg)
    {
      int_flg--;
      if(PULL_FLG){int_flg=0;return;}
     if(int_flg==0)
      {
        if(PULL_FLG==0)
          {
           if(span1==0)
             {
               int_sum++;//记录脉冲个数
               //span1=SPAN;//脉冲速度限制 
                LPM3_EXIT;
             }
          }
     span1=SPAN;//脉冲速度限制 
      }
    }*/
      if(int_flg)
        {
            if(filter_port1_flg)
            {
                if(span1==0)
                {
                    int_sum++;                    
                }  
                int_flg=0;
                filter_port1_flg=0;                
                span1=SPAN;
            }
            else {filter_port1_flg=1;}
        }
       if(span1>0){span1--;} 
   }
  LPM3_EXIT;
}
/************************************************************/
/*功能描述:外部中断处理函数                                */
/*函数说明:外部中断       P1.5引脚中断                     */
/*调用函数: 无                                              */
/*全局变量: int_flg  spanl  int_sum                         */
/*输入:                                                     */
/************************************************************/
#pragma vector=PORT1_VECTOR
__interrupt void in0(void)
{
 /*if(P1IFG&BIT5)
   {     
    P1IFG&=~BIT5;
    int_flg=2;//脉冲标志位
   }*/
  if(P1IFG&BIT5)
     {
      if(P1IES &BIT5)  // H -> L
        {
         P1IES &= ~BIT5;
         int_flg=1;
        }
      else                      // L -> H
        {
         P1IES |=BIT5;
         int_flg=0;
         filter_port1_flg=0;
        }
       P1IFG &=~BIT5;
     }
 if(POWER_FLG)//上电检测 
   {
    P1IFG&=~BIT2;
    rest=1;
   } 
// LPM3_EXIT;
}

⌨️ 快捷键说明

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