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

📄 scom.c

📁 简易风盘控器程序 AVR GCC MEGA8
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif
#else  /* EnPGFENGJI */
   TIMSK2 = (u8)(1 << OCIE2A);
#endif /* EnPGFENGJI */
   //ScFlag = 0;         /* 清除所有标志 */
   //SetTxD();           /* 准备接收 */
   //ScAddrErrCnt = 0;
}

/*---------------------------------------------------------------------------*/
void ScCom_Sub(void)
{
   u8 i;
   u8 j;

#ifdef MONITOR
   if (ScState == 1){               /* 查看数据状态 */
     i = 0;
     while ((i < 18) &&
            (WaiJiCanShu[i] == WaiJiShuJu[i])) i++;
     if (i < 18){
       ScState = 2;
       ScRepCount = 0;              /* 如果数据被修改,启动数据发送 */
     }
   }
#endif

   if (ValBit(ScFlag,fScRxOk)){     /* 1: 接收Ok */
     if ((ScByteCnt != 0) &&
         ((ScBufAdr[0]|ScBufAdr[1]) == 0x0FF) &&
         ((ScBufAdr[2]|ScBufAdr[3]) == 0x0FF) &&
         ((ScBufAdr[4]|ScBufAdr[5]) == 0x0FF)){  /* 校验数据 */
       ScMonCnt = 0;                  /* 与外机通信故障计时 */
       ClrBit(Errorflg,fSComErr);     /* 1:与外机通信故障  */
       if (ScBufAdr[0] == 0x5A){      /* 外机发送 */
         if (!ValBit(Errorflg,fRsAddrErr)){      /* 内机地址冲突时不处理任何命令 */
           OutSideErr = (u8)(ScBufAdr[4] >> 2);  /* 外机故障代码 */

           i = (u8)(RunMode & 0x03);
           if (i >= 0x02){         /* 制冷、除湿 */
             i = 0x01;
           } else if (i == 0x01){  /* 制热 */
             i = 0x02;
           }

           /* 化霜标志 */
           ClrBit(OutDevStu,fOutDeforst);
           if ((j = (u8)(ScBufAdr[4] & 0x03)) == 0x03){
             j = 0x02;             /* 制热 */
             SetBit(OutDevStu,fOutDeforst);
           }

           if ((!ValBit(RunMode,fSysOn)) || /* 关机时允许 */
               ((i | j) != 0x03)){          /* 模式与外机模式一致时允许 */
             SetBit(OutDevStu,fRunEnable);
           } else {
             ClrBit(OutDevStu,fOutDeforst);
             ClrBit(OutDevStu,fRunEnable);
           }

           /* 在模式没有发送到外机之前,先清除允许标志 */
           if (!ValBit(Sysflag,fModeflag)){
             ClrBit(OutDevStu,fRunEnable);
             ClrBit(OutDevStu,fOutDeforst);
           }
           //if (ValBit(OutDevStu,fRunEnable)) ClrBit(Sysflag,fRequest);

           if ((ScByteCnt == 6) &&
               ((ScBufAdr[2] & 0x3F) == NeijiNo)){     /* 风口控制器  */
             ScComTx_Sub();                            /* 准备发送数据 */
             OCR2A = (u8)(TCNT2 + 8192/32);            /* 间隔时间(8.192mS) */
             SetTxD();                                 /* 发送准备 */
             ScFlag = (1<<fScTx)|(1<<fScTxLo);         /* 清除所有标志 */
#ifdef MONITOR
           } else if ((ScByteCnt == 30) &&
                      ((ScBufAdr[2] & 0x0F) == 0x00)){ /* 显示参数, 不应答 */
             i = 6;
             while ((i < 30) &&
                    ((ScBufAdr[i]|ScBufAdr[i + 1]) == 0x0FF)) i += 2;
             if (i >= 30){
               for(i = 0; i < 12; i++){    /* 转存显示参数 */
                 XianShiCanShu[i] = ScBufAdr[6 + (i << 1)];
               }
             }
           } else if ((ScByteCnt == 42) &&
                      ((ScBufAdr[2] & 0x30) == 0x30)){ /* 外机参数, 不应答 */
             i = 6;
             while ((i < 42) &&
                    ((ScBufAdr[i]|ScBufAdr[i + 1]) == 0xFF)) i += 2;
             if (i >= 42){
               for(i = 0; i < 18; i++){    /* 转存外机参数 */
                 WaiJiCanShu[i] = ScBufAdr[6 + (i << 1)];
               }
               if (ScState == 0){
                 ScState = 1;              /* 完成数据读,进入正常模式 */
                 for(i = 0; i < 18; i++){  /* 转存外机参数 */
                   WaiJiShuJu[i] = WaiJiCanShu[i];
                 }
               } else if (ScState == 3){
                 i = 0;
                 while ((i < 18) &&
                        (WaiJiCanShu[i] == WaiJiShuJu[i])) i++;
                 if (i >= 18){
                   ScState = 1; /* 数据校验成功,进入正常模式 */
                   //ScRepCount = 0;
                 } else {
                   ScState = 2; /* 数据校验不成功,再次发送 */
                   if (++ScRepCount >= ScRepCountMax) ScState = 0;
                 }
               }
             }
#endif /* MONITOR */
           }
         }
       } else if (ScBufAdr[0] == 0x0A5){
         /* 收到与本机地址相同的应答帧,则认为有内机地址冲突 */
         if ((ScBufAdr[2] & 0x0f) == NeijiNo){
           ScAddrErrCnt = 0;
           SetBit(Errorflg,fRsAddrErr);
         }

         if (!ValBit(Errorflg,fRsAddrErr)){ /* 内机地址冲突时不处理任何命令 */
           if ((ScByteCnt == 6) &&
               (((ScBufAdr[2] & 0x0Bf) == 0x9f) ||
                ((ScBufAdr[2] & 0x0Bf) == 0x0af))){ /* A 型线控器发送 */
             if ((ScBufAdr[4] >> 4) == NeijiNo){
               if (ValBit(ScBufAdr[2],6)){
                 SetBit(SysConfig,fDisHeat);  /* 1: 外机辅助电加热无效 */
               } else {
                 ClrBit(SysConfig,fDisHeat);  /* 0: 外机辅助电加热有效 */
               }

               i = (u8)(ScBufAdr[4] & 0x0f);
               if (i == 0){
                 ClrBit(RunMode,fSysOnOff);   /* 关机 */
                 ClrBit(RunMode,fSysOn);
                 ClrBit(Sysflag,fMAuto);      /* 自动模式清除 */
                 //ClrBit(SlpTmFlag,fSleep);  /* 清除睡眠和定时 */
                 //ClrBit(SlpTmFlag,fTimeOff);
               } else {
                 SetBit(RunMode,fSysOnOff);   /* 开机 */
                 //ClrBit(SlpTmFlag,fTime);
                 if (i == 1){
                   /* 制冷 */
                   SetMode(MODECOOL);
                 } else if (i == 2){
                   /* 制热 */
                   SetMode(MODEHEAT);
                 } else if (i == 4){
                   /* 通风 */
                   SetMode(MODEFAN);
                 } else if (i == 5){
                   /* 除湿 */
                   SetMode(MODEDRY);
                 } else {
                   /* 自动 */
                   SetMode(MODEAUTO);
                 }
               }
             }
#ifdef MONITOR
           } else if (ScByteCnt > 6){        /* A 型线控器修改外机数据 */
             if (ScState == 1) ScState = 0;  /* 请求刷新 */
#endif
           }
         }
       }
     }
     ClrBit(ScFlag,fScRxOk);            /* 清除标志 */
     ScByteCnt = 0;                     /* 清除数据 */
   }
}

void ScComTx_Sub(void)                  /* 准备发送数据 */
{
#ifdef MONITOR
   u8 i;
#endif

   ScBufAdr[0] = (u8)0x0A5;             /* 起始码 */
   ScBufAdr[2] = NeijiNo;               /* 室内风口控制器 */
   if (ValBit(SysConfig,fDisHeat)){
     SetBit(ScBufAdr[2],6);             /* 0: 外机辅助电加热有效 */
   }

   SetBit(Sysflag,fModeflag);           /* 模式发送标志 */
   ScBufAdr[4] = (u8)(ValBit(RunMode,fSysOn)? SCom_SM_Tab[RunMode & 0x03] : 0);
   //if (!ValBit(Sysflag,fPower)){        /* 不开机时清除 */
   //  ScBufAdr[4] &= 0x0fc;              /* 内机模式 - 不开机,不发送模式 */
   //}
   if (ValBit(Sysflag,fMAuto)){         /* 自动模式 */
     SetBit(ScBufAdr[4],7);
   }

   ScWordCnt = 6;                       /* 正常发送共 6 个字节数据 */
#ifdef MONITOR
   if ((ScState == 0) ||                /* 首次上电,申请读外机数据 */
       (ScState == 3)){                 /* 修改数据后验证读 */
       ScBufAdr[2] |= 0x30;
   } else if (ScState == 2){            /* 修改数据 */
     for (i = 0; i < 18; i++){
       ScBufAdr[6 + (i << 1)] = WaiJiShuJu[i];
       ScBufAdr[7 + (i << 1)] = (u8)(255 - WaiJiShuJu[i]);
     }
     ScState = 3;                       /* 准备验证 */
     ScWordCnt = 42;                    /* 共 42 个数据 */
   }                                    /* 正常发送 */
#endif /* MONITOR */

   /* 设置反码 */
   ScBufAdr[1] = (u8)(255 - ScBufAdr[0]);
   ScBufAdr[3] = (u8)(255 - ScBufAdr[2]);
   ScBufAdr[5] = (u8)(255 - ScBufAdr[4]);
}

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

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