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

📄 main.lst

📁 电能表源码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 197          void reset_primjiaobiao(void)
 198          {
 199   1        Inti_metermode();                              //初始化计量模块
 200   1        buffer_energ[0]=0;
 201   1        buffer_energ[1]=0;
 202   1      }
 203          
 204          
 205          //=====================================================
 206          // 函数功能:检测CF脉冲是否异常
 207          // 入口参数:CF脉冲数
 208          // 返回数据:修正后的CF脉冲数
 209          //=====================================================
 210          unsigned long check_jump(unsigned char data_cf)
 211          { unsigned long value;
 212   1       if(data_cf>max_CF)
 213   1            { value=0;                                            //停止能量计量
 214   2                  if(count_errenergmode<10)
 215   2                     { count_errenergmode++;
 216   3                       reset_primjiaobiao();                          //重新初始化计量模块
 217   3                     }
 218   2                }
 219   1       else
 220   1            { count_errenergmode=0;
 221   2                  value=data_cf;
 222   2                }
 223   1       return value;
 224   1      }
 225          
 226          
 227          //============================================================================
 228          //读取CF脉冲
C51 COMPILER V7.06   MAIN                                                                  11/24/2008 09:37:01 PAGE 5   

 229          //===========================================================================
 230          void read_encount(void)
 231          { unsigned char temp_CF,temp_data;
 232   1        temp_data=ReadMeterFunc();
 233   1        if((temp_data&0x40)!=0x40)
 234   1            buffer_energ[0]=ReadMeterPara(12)+ReadMeterPara(9);    //读有功脉冲数
 235   1        else
 236   1            buffer_energ[0]=ReadMeterPara(15);
 237   1        if(buffer_energ[0]>buffer_energ[1])                    // 如果脉冲数有增加
 238   1          { temp_CF=buffer_energ[0]-buffer_energ[1];           // 计算增加的脉冲数
 239   2            temp_CF=check_jump(temp_CF);                       // 防飞走
 240   2                sumCF_Z=sumCF_Z+temp_CF;                           // 能量脉冲累加  
 241   2                //qidong_time=0;
 242   2          }
 243   1        buffer_energ[1]=buffer_energ[0];                          
 244   1       
 245   1      }
 246          
 247          //==============================================================
 248          //函数功能:恢复电量的整数部分,3个字节
 249          //===============================================================
 250          void Recover_int(unsigned int rec_id)
 251          { 
 252   1        check_engint(rec_id);    // 调用在 energradd.c 中
 253   1      } 
 254          
 255          //-----------------------------------------------------
 256          //函数功能:恢复电量数据
 257          //备注:
 258          //----------------------------------------------------
 259          void Recover_eng(void)
 260          { 
 261   1        Recover_int(ID_POSENGSUM);            // ID_POSENGSUM 当前有功总电量ID号=0x0100 
 262   1      }
 263          
 264          
 265          
 266          //======================================================
 267          //函数功能:恢复参数
 268          //  恢复的数据都在RAM中,恢复错误,则,中心设置
 269          //======================================================
 270          void Recover_prim(void)
 271          {unsigned char i,len; 
 272   1      
 273   1       if(recover_item(ID_CHANGSHU)==0)                              // 如果脉冲常数恢复错误
 274   1         { wr_buff[0]=0;
 275   2           wr_buff[1]=0x4;                                           // 默认为400
 276   2           wr_buff[2]=0;
 277   2         }                                                                                                                    // 存放RAM地址 0x40
 278   1       addr_baseonIDandtype(RAM,ID_CHANGSHU);
 279   1       data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;      
 280   1       Write_data(RAM,(*ID_coretalbpoint[0]).datalong);
 281   1      
 282   1       if(recover_item(ID_BANTRATA)==0)                             // 如果恢复波特率出错
 283   1         { 
 284   2           wr_buff[0]=01;                                           // 默认参数1200
 285   2         }
 286   1       addr_baseonIDandtype(RAM,ID_BANTRATA);                                           // 存放RAM地址 0x43
 287   1       data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
 288   1       Write_data(RAM,(*ID_coretalbpoint[0]).datalong);
 289   1      
 290   1       if(recover_item(ID_COMADDR)==0)                               // 恢复表地址错误  表号
C51 COMPILER V7.06   MAIN                                                                  11/24/2008 09:37:01 PAGE 6   

 291   1         { for(i=0;i<6;i++)
 292   2            wr_buff[i]=0;
 293   2         }
 294   1       addr_baseonIDandtype(RAM,ID_COMADDR);                                                  // 存放RAM地址 0x44
 295   1       data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
 296   1       len=(*ID_coretalbpoint[0]).datalong;
 297   1       Write_data(RAM,len);
 298   1      
 299   1       if(recover_item(ID_TIMERETUN)==0)                                  //轮显时间
 300   1          { 
 301   2            wr_buff[0]=5;                                                 //5秒
 302   2          }
 303   1       addr_baseonIDandtype(RAM,ID_TIMERETUN);                                                        // 存放RAM地址 0x50
 304   1       data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
 305   1       len=(*ID_coretalbpoint[0]).datalong;
 306   1       Write_data(RAM,len);
 307   1      
 308   1      }
 309          
 310          
 311          //=============================================================
 312          //函数功能:恢复停电时保存的数据
 313          // 要恢复的数据都存放在EEPROM中
 314          //==============================================================
 315          void Recover_tindiandata(void)
 316          { unsigned char value;
 317   1      
 318   1        data_addr.word[1]=EEP_Save_engdot;                            //恢复电量小数部分
 319   1        Read_data(EEPROM,2);
 320   1        value=0;
 321   1        if(wr_buff[0]==(wr_buff[1]-0x33))                             //校验和相等
 322   1           { if(checkone_bcd(wr_buff[0])==1)                          //BCD校验
 323   2                    { value=1;
 324   3                }
 325   2           } 
 326   1        if(value==0)                                                  //恢复失败
 327   1           { wr_buff[0]=0;
 328   2               }
 329   1        addr_baseonIDandtype(RAM,ID_POSENGSUM);
 330   1        ram[(*ID_coretalbpoint[0]).dataaddr+3]=wr_buff[0];                    // 存放进RAM中
 331   1        xiaoshu=wr_buff[0];
 332   1      
 333   1        data_addr.word[1]=EEP_Save_cf;                                //CF 恢复
 334   1        Read_data(EEPROM,2); 
 335   1        if(wr_buff[1]==(wr_buff[0]+0x33))
 336   1          { if(wr_buff[0]<128) 
 337   2               sumCF_Z=wr_buff[0];
 338   2              }
 339   1         sumCF_Z=0;                   // 恢复失败,置0。
 340   1      } 
 341          
 342          //==================================================
 343          //函数功能:恢复数据
 344          //备注:
 345          //===================================================
 346          void Recover_data(void)
 347          { Recover_eng();                 // 恢复电量整数
 348   1        Recover_tindiandata();         // 恢复停电时保存的数据:电量小数,CF脉冲数,等
 349   1        Recover_prim();                // 恢复表参数
 350   1      }
 351          
 352          
C51 COMPILER V7.06   MAIN                                                                  11/24/2008 09:37:01 PAGE 7   

 353          //=============================================
 354          //函数功能:检测当前系统供电模式
 355          //返回参数:1:市电供电。0:电池供电
 356          //=============================================
 357          unsigned char check_powertype(void)
 358          { unsigned char value;
 359   1        if((Systate&0x01)==0x01)
 360   1            value=1;                    //正常供电
 361   1        else
 362   1            {value=0;
 363   2                }
 364   1        return value;
 365   1      }
 366          
 367          //===============================================
 368          //函数功能: 电池电压检测
 369          //返回参数: battest=1,电池电量不足;battest=0;正常
 370          //=================================================
 371          void bat_test(void)
 372          { uint32 M;
 373   1      //  battest=0;                  // 
 374   1        SetMChannel(2,1);     // 开M通道,电池电压检测功能,1倍增益
 375   1        delay_10ms();         // 10MS延时
 376   1        M=ReadMeterPara(2);   // 读寄存器值
 377   1        if(M>0x7fffffff)
 378   1              { 
 379   2                M=(~M)+1;                      //取补码
 380   2              } 
 381   1        M=(M*3)/1000000000;   // 计算有效值
 382   1        if (M<3)                          // 小于多少表示电池电压不足,报警
 383   1          battest=1;                  // 报警标志,LCD中显示
 384   1        else
 385   1          battest=0;                  // 
 386   1        SetMChannel(0,1);     // 开M通道,电池电压检测功能,1倍增益
 387   1      }
 388          
 389          //==============================================
 390          //函数功能:初始化各功能模块
 391          //
 392          //==============================================
 393          void Init_modul(void) 
 394          {
 395   1        Init_disp();                             // 初始化显示模块
 396   1      //  init_keyevent();                       // 初始化按键模块
 397   1        init_RTCmode();                          // 初始化RTC模块
 398   1        init_realdate();                         // 初始化瞬时值
 399   1        int_energeadd();                         // 初始化能量计量模块
 400   1      //  init_485comm();                        // 初始化485模块
 401   1      
 402   1      
 403   1        init_infrcomm();                          //初始化红外模块
 404   1      
 405   1      //  int_lostqiandong();                      //初始化潜动和防窃电模块
 406   1      //  int_zhuancun();                          //初始化历史转存模块
 407   1      //  Ini_switchmode();
 408   1        //Ini_checkmode();                         //初始化检测模块
 409   1       // Int_ereasflashmode();                    //初始化擦除标志位
 410   1      
 411   1      }
 412          
 413          
 414          //============================================================

⌨️ 快捷键说明

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