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

📄 单相复费率.c

📁 单相复费率电能表源代码 支持红外、 RS85通讯。支持尖、峰、平、谷四个费率
💻 C
📖 第 1 页 / 共 5 页
字号:
        SeriesSendFg=1;
    }
    else
    {
        SeriesSendFg=0;
        CmdParseFg=0;
    }
}
//命令解析
void CmdParse(void)
{
    unsigned char data  CheckSum;
    unsigned char data i,j,k;
    unsigned char data IdRight;
    j=0x40; 
    //判断是否有未发送数据
    if(TimeSendFg)
    {
        //if(ComTimeA>=1)
        //{            
            SeriesSend();    
            TimeSendFg=0;            
        //}
    }
    else
    {
        //数据解析标志是否有效
        if(CmdParseFg)
        {
          DataDeal();
          CmdParseFg=0;
          CheckSum=0;
          //数据校验
          for(i=0;i<(ComDataBuf[9]+10);i++)
          {
            CheckSum=CheckSum+ComDataBuf[i]; 
          }
          //校验和是否相等--如果相等开始校验地址
          if(CheckSum==ComDataBuf[ComDataBuf][9]+10])
          {            
            for(i=0;i<6;i++)
            {
              k=IicByteRead(0xa0,j);
              if(ComDataBuf[1+i]==k)
              {
                IdRight=0x55;
              }
              else
              {
                IdRight=0x00;
                break;
              }
              j++;
            }
            //地址如果正确(非广播命令)开始解析命令
            if(IdRight==0x55)
            {                
                switch(ComDataBuf[8])
                {
                  case 0x01 : 
                              switch(ComDataBuf[11])
                              {
                                case 0x90:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x1f:  //读当前有功电量集合  
                                                          for(i=0;i<4;i++)
                                                          {
                                                            IIcBuf[i]=SumPulseData[i];
                                                          }
                                                          for(i=4;i<8;i++)
                                                          {
                                                            IIcBuf[i]=FengPulseData[i-4];
                                                          }
                                                          for(i=8;i<12;i++)
                                                          {
                                                            IIcBuf[i]=PingPulseData[i-8];
                                                          }
                                                          for(i=12;i<16;i++)
                                                          {
                                                            IIcBuf[i]=GuPulseData[i-12];
                                                          }
                                                           CmdPick(0,0,0,0,IIcBuf,16,0,1);
                                              break;
                                              case 0x20:  //读反向总电量
                                                          CmdPick(0x00,0x00,0x00,0,ReversePulseData,4,0,1);
                                              break;
                                            }
                                break;
                                case 0xb0:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x20:  //读最后一次反向启始时间
                                                          CmdPick(0xa0,0x38,4,0,0,0,1,0);
                                              break;
                                              case 0x21:  //读反向累积总时间
                                                          CmdPick(0x00,0x00,0x00,0,ReverseTime,3,0,0);
                                              break;
                                            }
                                break; 
                                case 0xb2:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x10:  //读最近一次编程时间
                                                          CmdPick(0xa0,0x3c,4,0,0,0,1,0);
                                              break;
                                              case 0x12:  //读编程次数
                                                          CmdPick(0xa0,0x68,2,0,0,0,1,0);
                                              break;
                                            }
                                break;  
                                case 0xc0:
                                            switch(ComDataBuf[10])
                                            {
                                              case 0x10:  //读当前日期
                                                          CmdPick(0,0,0,0,DaysBuf,4,0,0);
                                              break;
                                              case 0x11:  //读当前时间
                                                          CmdPick(0,0,0,0,TimeBuf,3,0,0);
                                              break;
                                              case 0x20:  //读电表运行状态字
                                                          CmdPick(0xa0,0x65,1,0,0,0,1,0);
                                              break;
                                              case 0x30:  //读电表脉冲常数
                                                          CmdPick(0xa0,0x6d,3,0,0,0,1,0);
                                              break; 
                                              case 0x32:  //读电表表号
                                                          CmdPick(0xa0,0x46,0x06,0,0,0,1,0);
                                              break;  
                                              case 0x33:  //读电表地址
                                                          CmdPick(0xa0,0x40,0x06,0,0,0,1,0);
                                              break;   
                                            }
                                break;
                                case 0xc1:
                                            switch(ComDataBuf[10])
                                            {
                                                case 0x17://读自动抄表日期
                                                          CmdPick(0xa0,0x60,0x02,0,0,0,1,0);
                                                break;
                                            }
                                case 0xc3:
                                            switch(ComDataBuf[10])
                                            {
                                                case 0x17://读电表时段
                                                          CmdPick(0xa0,0x60,0x02,0,0,0,1,0);
                                                break;
                                            }
                                break;  
                                case 0xD1:  //读取12个月历史累积电量
                                            for(i=0x20;i<0x2c;i++)
                                            {
                                                if(ComDataBuf[10]==i)
                                                {
                                                    ToDay(ComDataBuf[10]);
                                                    CmdPick(0xa2,IIcByteStar,16,0,0,0,1,0);
                                                }                                               
                                            } 
                              }
                  break;
                  case 0x04:  //写操作
                            if(KeyFg1)
                            {
                              switch(ComDataBuf[10])
                              {
                                  case  0x10: //写日期
                                              //
                                              CmdSave(0x64,16,0x03,4,1);
                                  break;
                                  case  0x11: //写时间
                                              CmdSave(0x64,16,0x00,3,1);                                               
                                  break;
                                  case  0x15: //显示设置
                                              CmdSave(0xa0,16,0x62,3,0);                                                
                                  break;
                                  case  0x17: //写自动抄表日
                                              CmdSave(0xa0,16,0x60,2,0);  
                                  break;
                                  case  0x19: //设置底度
                                              //电度清零
                                              CmdSave(0xa0,16,0x00,16,0);//总电量清零            
                                  break;
                                  case  0x32: //设置表编号
                                              CmdSave(0xa0,16,0x46,6,0);//
                                  break;
                                  case  0x33: //设置表地址
                                              CmdSave(0xa0,16,0x40,6,0);//
                                  break; 
                                  case  0x3f: //设置时段
                                              CmdSave(0xa0,16,0x80,ComDataBuf[9]-6,0);//
                                  break; 
                                  default:
                                             
                                  break;
                              }  
                            }
                            else
                            {
                                switch(ComDataBuf[10])
                              {
                                  case  0x11: //写时间
                                              TimeChk(ComDataBuf[16],ComDataBuf[17]);
                                              if(TimeOk);
                                              {
                                                  CmdSave(0x64,16,0x00,3,1);
                                                  TimeOk=0;
                                              }                                                      
                                  break;
                              } 
                            }                                         
                  break;
                  case 0x0f:  //修改编程密码
                                if(ComDataBuf[14]==0x01)
                              {
                                      CmdSave(0xa0,15,0x4c,4,0);//修改编程密码
                              }
                              else if(ComDataBuf[14]==0x00)
                              {
                                  CmdSave(0xa0,15,0x50,4,0);//修改清令密码
                              }
                  break;
                  case 0x1f:  //电表总清零
                                if(ComDataBuf[9]==0x04)
                              {
                                      ClerData();
                              }
                  break;
                } 
                TimeSendFg=1;
            }
            //否则判断是否是广播命令
            else
            {
              IdRight=0;
              for(i=0;i<6;i++)
              {
                    if(ComDataBuf[1+i]==0x99)
                 {
                   IdRight=0x55;
                 }
                 else
                 {
                   IdRight=0x00;
                   break;
                 }
                 j++;
              }
              //如果是广播命令开始解析
              if(IdRight==0x55)
              {                
                switch(ComDataBuf[8])
                {
                    case 0x08:  //广播校时
                               CmdSave(0x64,15,0x00,3,1);//设置时间
                    break;  
                    case 0x0a:  //广播地址
                               CmdSave(0x64,15,0x00,3,1);//设置时间
                    break;  
                }
                TimeSendFg=1;
              }
              else
              {
                  ClerBuf();
                  SendOverFg=1;
              }
              CmdParseFg=0;
            }
          }
          else
          {
            CmdParseFg=0;
          }
       }
    }    
}
 
 使用LPC932制作的一款电表---LcdParse 

#include <REG932.H>
#include <define.h>
#include <Stdio.h>
#include <Intrins.h>

void LcdFull(unsigned char DataOne,unsigned char DataTwo,unsigned char DataThree,unsigned char DataFour)
{
    unsigned char data i,j,k;
     unsigned char idata DataBufA[4],DataBufB[4];
    unsigned char code    Digit[12]={    
                                    0xBE,    //0
                                    0x06,    //1
                                    0x7C,    //2
                                    0x5E,    //3
                                    0xC6,    //4
                                    0xDA,    //5
                                    0xFA,    //6
                                    0x0E,    //7
                                    0xFE,    //8
                                    0xDE,    //9
                                    0xf8,   //a--E
                                    0x40,   //b--_
                                  };   
   DataBufA[0]=DataOne;
   DataBufA[1]=DataTwo;
   DataBufA[2]=DataThree;
   DataBufA[3]=DataFour;
   
   if(BataMoveFg)
   {
     for(i=0;i<4;i++)//
     {
       k=DataBufA[i];            
       j=DataBufA[i+1];            
       k=k&0x0f;                        
       k=k<<4;                            
       j=j>>4;                    
       j=j&0x0f;    
       DataBufB[i]=k|j;
     }
   }
   for(i=0;i<3;i++)
   {
      k=DataBufB[i] & 0xf0;
      k=k>>4;
      LcdShowBuf[i+i]=Digit[k];
      k=DataBufB[i] & 0x0f;
      LcdShowBuf[i+i+1]=Digit[k];
   }

}
void LcdDisplayData(unsigned char DataOne,unsigned char DataTwo,unsigned char DataThree,unsigned char DataFour,unsigned char DataFive,unsigned char DataSix,unsigned char DataSeven)
{
       unsigned char data i;

    LcdShowBuf[6]=DataFive;
    LcdShowBuf[7]=DataSix;

    switch(DataSeven)
    {
       case 0x00 : //没有小数点的显示/                  
                   LcdFull(DataOne,DataTwo,DataThree,DataFour);                  

⌨️ 快捷键说明

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