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

📄 com.c

📁 本代码以AVR单片机为主控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
                        CopyRamToEEP(ADDRESS_230AE,ComVar.RxBuff+16,30);
                  break;
                  case 0x230B:                //产品条形码2(高30字节)
                        CopyRamToEEP(ADDRESS_230BE,ComVar.RxBuff+16,30);
                  break;
               //   case 0xC119:                // 写命令 C119  有功底度
               //          if((ComVar.RxBuff[16]|ComVar.RxBuff[17]|ComVar.RxBuff[18]|ComVar.RxBuff[19])!=0)
               //                 {
               //                     goto INVALID_DATA;
               //                 }
               //        SETBIT(PulseBits,ClearEng);
               //       //  BCDToHEX8(ComVar.RxBuff+16,4);
               //        CopyRam(ComVar.RxBuff+16,PowerVar.ActInPow,4);      // 电能读入缓冲,刷现当前电量
                      //CopyRamToEEP(ADDRESS_C119E,PowerVar.ActInPow,4);    // 存入电能底度
               //        PowerVar.ActInPow[4] = 0x00;
               //        PowerVar.PowerZero   = 0x00;                        // 读出电能小数位
                      // EEPClear(ADDRESS_ZEROE,60);                         // 电能记录区域清零
               //        PowerVar.PowerEEPIndex = 0;
               //        SavePower();                                        // 脉冲数清零
               //        SETBIT(ACSR,ACIE);                                  // 允许掉电检测 允许掉电中断
               //        PowerVar.PowerChange = 0xAA;                        // 置位电量改变标志
               //     break;
                    case 0xC212:
                       CopyRamToEEP(ADDRESS_C212E,ComVar.RxBuff+16,4); 
                    break;  
                    case 0xD410:
                      SETBIT(PulseBits,ClearEng);
                      //  BCDToHEX8(ComVar.RxBuff+16,4);
                      // CopyRam(ComVar.RxBuff+16,PowerVar.ActInPow,4);      // 电能读入缓冲,刷现当前电量
                      //CopyRamToEEP(ADDRESS_C119E,PowerVar.ActInPow,4);    // 存入电能底度
                      for(i=0;i<5;i++) PowerVar.ActInPow[i]=0x00;
                       PowerVar.PowerZero   = 0x00;                        // 读出电能小数位
                       EEPClear(ADDRESS_ZEROE,60);                         // 电能记录区域清零
                       PowerVar.PowerEEPIndex = 0;
                       SavePower();                                        // 脉冲数清零
                       SETBIT(ACSR,ACIE);                                  // 允许掉电检测 允许掉电中断
                       PowerVar.PowerChange = 0xAA;                        // 置位电量改变标志
                    break;
                    case 0xC098:
                       if(ComVar.AdjustEn!=0xAA)
                       {
                         goto INVALID_DATA;
                       }
                      // ComVar.RxBuff[22]=DataAddCS(ComVar.RxBuff+16,6);
                      
                        mIICWritePage(ComVar.RxBuff+16,6,0xA0,0x00);
                        // CopyRamToEEP(ADDRESS_C098E,ComVar.RxBuff+16,6); 
                        //  ReadAdjustConst();
                        CopyRam(ComVar.RxBuff+16,consttmp,6); 
                       // temp =consttmp[0]*256+consttmp[1];
                        //temp =(65535.0-temp)/45.0+0.5;
                        AdjustVar.AdjustConst_A =(0xFFFF-(consttmp[0]*256+consttmp[1]))/45;
                        if((AdjustVar.AdjustConst_A)<100)AdjustVar.AdjustConst_A=100;
                        //-------------------------------------------
                        // CopyEEPToRam(ADDRESS_B,consttmp,2);             // 读入B相分频数
                        //temp =consttmp[2]*256+consttmp[3];
                        //temp =(65535.0-temp)/45.0+0.5;
                        AdjustVar.AdjustConst_B =(0xFFFF-(consttmp[2]*256+consttmp[3]))/45;
                        if((AdjustVar.AdjustConst_B)<100)AdjustVar.AdjustConst_B=100;
                        //--------------------------------------------
                        // CopyEEPToRam(ADDRESS_C,consttmp,2);             // 读入C相分频数
                       // temp =consttmp[4]*256+consttmp[5];
                       //  temp =(65535.0-temp)/45.0+0.5;
                        AdjustVar.AdjustConst_C =(0xFFFF-(consttmp[4]*256+consttmp[5]))/45;
                        if((AdjustVar.AdjustConst_C)<100)AdjustVar.AdjustConst_C=100;
                        AdjustVar.CurrtConst_A = AdjustVar.AdjustConst_A;
                        AdjustVar.CurrtConst_B = AdjustVar.AdjustConst_B;
                        AdjustVar.CurrtConst_C = AdjustVar.AdjustConst_C;
                        AdjustVar.CurrtSumConst = 0;
                    break;
                    //-----------------------------------------------------
                    default:
                        INVALID_DATA:
                        erro = 0x34;
                        goto SEND_645_ERRO;     // 非法数据
                }                               // 发送缓冲前10字节已经准备好
                ComVar.TxAllBuff[8]  = 0x84;    // 置控制码:正常应答,无后续帧
                ComVar.TxAllBuff[10] = DataAddCS(ComVar.TxAllBuff,10);
                ComVar.TxAllBuff[11] = 0x16;
                ComVar.TxConst       = 12;
            }
            else                                // 密码错误处理
            {
                goto PASSWORD_ERRO;             // 密码错误处理
            }
        break;
        //*****************************************************************
            case 0x0F:                                  // 判断密码编程模式
                if(PasswordCheck(10)||ComVar.ProgEn==0xAA)
                {
                   EEPVar.WriteProtectAA = 0xAA;   // 打开EEPROM写保护
                   ComVar.TxAllBuff[8]   = 0x8F;   // 置控制码:正常应答,无后续帧
                   ComVar.TxAllBuff[9]   = 0x04;   // 置数据长度 0
                   CopyRamToEEP(ADDRESS_C212E,ComVar.RxBuff+14,4);
                   CopyRam(ComVar.RxBuff+14,ComVar.TxAllBuff+10,4);
                   DataAdd33(ComVar.TxAllBuff+10,4);
                   ComVar.TxAllBuff[14] = DataAddCS(ComVar.TxAllBuff,16);;
                   ComVar.TxAllBuff[15] = 0x16;
                   ComVar.TxConst  = 16;
                }
                else
                {
                goto PASSWORD_ERRO;              // 密码错误处理
                }
                break;
        //*****************************************************************
        default:
            erro = 0x34;                        // 非法数据
            goto SEND_645_ERRO;
        //*****************************************************************
    }
    //-------------------------------------------------------------------------
    return(1);
    //-------------------------------------------------------------------------
    PASSWORD_ERRO:
    erro = 0x37;
    SEND_645_ERRO:
    ComVar.TxAllBuff[_COM_CTR_CODE] = 0xC0|ComVar.RxBuff[8]; // 生成错误控制字
    ComVar.TxAllBuff[ 9] = 0x01;                // 数据长度
    ComVar.TxAllBuff[10] = erro;
    ComVar.TxAllBuff[11] = DataAddCS(ComVar.TxAllBuff,11);;
    ComVar.TxAllBuff[12] = 0x16;
    ComVar.TxConst = 13;
    return(1);
    //-------------------------------------------------------------------------
}

//*****************************************************************************
//       函数 : INT8U DataAddCS(INT8U *datap,INT8U count)                     *
//                                                                            *
//       功能 : 发送数据计算CS子函数                                          *
//*****************************************************************************
INT16U DataAddCS_ZhengZhou(INT8U *datap,INT8U count)
{
    union
    {
        INT16U cs;
        INT8U  cs_buff[2];
    }cs_union;
    INT8U      buff[4];


    cs_union.cs = 0;
    for(;count>0;count--)
    {
        cs_union.cs += *datap;
        datap++;
    }
    HEXToBCD32(cs_union.cs,buff);
    cs_union.cs_buff[0] = buff[2];
    cs_union.cs_buff[1] = buff[3];
    return(cs_union.cs);
}
//*****************************************************************************
//       函数 : INT8U CheckProgKeyHigh(void)                                  *
//                                                                            *
//       功能 : 编程开关检测                                                  *
//                                    *
//*****************************************************************************
  void CheckProgKeyHigh(void)
{
    if(CHKBIT(PINB,IO_PROG)==0)
    {
        ShortDelay();
        if(CheckPin(PINB,1,IO_PROG)==0)
        {
            if(CHKBIT(EventBits,ProgKey))
            {
            if((TimeVar.AdjustTimer>=2)&(ComVar.AdjustEn!=0xAA))
              {
              ComVar.AdjustEn=0xAA;
              SETBIT(TimeBits,AdjustFlash);
              SETBIT(TimeBits,EnDisplay);
              }
           
            }
            else {SETBIT(EventBits,ProgKey);TimeVar.AdjustTimer=0;}
        }
    }
    else
    {
     ComVar.AdjustEn=0x55;
     
     if(CHKBIT(EventBits,ProgKey))
       {
         CLRBIT(EventBits,ProgKey);
         if(ComVar.ProgEn != 0xAA) ComVar.ProgEn = 0xAA;
            else ComVar.ProgEn = 0x55;
         TimeVar.ProgTimer = 0;
       }
     }
     if(ComVar.ProgEn == 0xAA)           // 编程键延时控制
    {
        //_FLASH_STATUS_LED();            // 闪烁状态LED
        if(++TimeVar.ProgTimer >= _PROG_TIMER_CNT )
        {
            ComVar.ProgEn = 0x55;       // 关闭编程开关
            //_STATUS_LED_OFF();          // 关闭状态LED显示
        }
    }
}

//*****************************************************************************
//       函数 : INT8U PasswordCheck(void)                                     *
//                                                                            *
//       功能 : 密码校验处理                                                  *
//       返回 : 0: 密码错误         1: 密码正确                               *
//*****************************************************************************
INT8U PasswordCheck(INT8U start)
{
    

    INT8U i;

    CopyEEPToRam(ADDRESS_C212E,EEPVar.I2cBuff+start,4);     // 读入4字节密码
    for(i=start;i<(start+3);i++)
    {
        if((EEPVar.I2cBuff[i]!=ComVar.RxBuff[i])&(ComVar.RxBuff[i]!=PassWord[i-12]))
        {
            return(0);
        }
    }
    return(1);
}

//*****************************************************************************
//       函数 : void DataAdd33(INT8U *datap,INT8U count)                      *
//                                                                            *
//       功能 : 数据+33处理子函数                                             *
//       输入 : *datap: 数据起始指针        count: 操作个数                   *
//*****************************************************************************
void DataAdd33(INT8U *datap,INT8U count)
{
    for(;count>0;count--)
    {
        *datap = *datap+0x33;
        datap++;
    }
}
//*****************************************************************************
//       函数 : void DataDec33(INT8U *datap,INT8U count)                      *
//                                                                            *
//       功能 : 发送数据-33处理子函数                                         *
//       输入 : *datap: 数据起始指针        count: 操作个数                   *
//*****************************************************************************
void DataDec33(INT8U *datap,INT8U count)
{
    for(;count>0;count--)
    {
        *datap = *datap-0x33;
        datap++;
    }
}
//*****************************************************************************
//       函数 : INT8U DataAddCS(INT8U *datap,INT8U count)                     *
//                                                                            *
//       功能 : 发送数据计算CS子函数                                          *
//       输入 : *datap: 数据起始指针        count: 操作个数                   *
//*****************************************************************************
INT8U DataAddCS(INT8U *datap,INT8U count)
{
    INT8U cs;

    cs = 0;
    for(;count>0;count--)
    {
        cs += *datap;
        datap++;
    }
    return(cs);
}
//*****************************************************************************
//       函数 : void Com1Reset(void)                                          *
//                                                                            *
//       功能 : 串口1复位程序                                                 *
//*****************************************************************************
void Com1Reset(void)
{
   CLRBIT(UCSR0B,RXCIE0);      // 禁止串口接收中断
    Com1Bits = 0;               // 清除串口工作标志
    Com1Var.RxPoint = 0;        // 串口接收指针清零
    Com1Var.CommEnd = 0;
    Com1Var.OverTimer = 0;
    
    UBRR0  = _UBRR;             // 初始化串口波特率1200bps
    UCSR0C = 0x26;              // 0B10100110;   // 异步 偶校验 1停止位 8 数据位
    CLRBIT(UCSR0B,UCSZ02);      // 8个数据位
    SETBIT(UCSR0B,RXEN0);       // 允许串口接收
    SETBIT(UCSR0B,RXCIE0);      // 允许串口接收中断

    SETBIT(PORTD,IO_TXD1);       // 置高TXD
    SETBIT(UCSR0B,TXEN0);       // 允许串口发送
    CLRBIT(Com1Bits,En500ms);   // 禁止 500 ms 定时标志
}
//*****************************************************************************
//       函数 : void Com2Reset(void)                                          *
//                                                                            *
//       功能 : 串口2复位程序                                                 *
//       注释 : 一部分在串口发送时初始化                                      *
//*****************************************************************************
void Com2Reset(void)
{
    CLRBIT(TIMSK1,ICIE1);       // 禁止输入捕捉中断

    Com2Bits = 0;               // 清除串口工作标志
    Com2Var.RxPoint    = 0;     // 串口接收指针清零
    Com2Var.CommEnd    = 0;
    Com2Var.OverTimer  = 0;
    
    _CLR_IO_TXD2();             // 置高TXD2口
    SETBIT(TCCR1B,ICNC1);       // 输入捕捉噪声抑制允许
    CLRBIT(TCCR1B,ICES1);       // 下降沿捕捉
    SETBIT(TIFR1,ICF1);         // 清标志
    SETBIT(TIMSK1,ICIE1);       // 允许输入捕捉中断
}

//*************************** END OF SUB **************************************/


⌨️ 快捷键说明

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