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

📄 单相复费率.c

📁 单相复费率电能表源代码 支持红外、 RS85通讯。支持尖、峰、平、谷四个费率
💻 C
📖 第 1 页 / 共 5 页
字号:
        SeriesBufDptr=0;
        LcdRunData=1;
        LcdTimeFg=1;
        ReverseFgToLcd=0;
        ReverseFgToData=0;
        PulseParseFg=0;
        PowerStA=0x55;
        PowerStB=0xaa;
        ii=IicByteRead(0xa0,0x00);
        if(ii==0xff)
        {
           ii=IicByteRead(0xa0,0x80);
           if(ii==0xbb)
           {
               ii=IicByteRead(0xa0,0xf0);
               if(ii==0xff)
               {
                   IicByteWrite(0xa0,0x00,0xbb);
                   ii=IicByteRead(0xa0,0x00);
                   if(ii==0xaa)
                   {
                      IicByteWrite(0xa0,0x80,0xaa);
                      ii=IicByteRead(0xa0,0x80);
                      if(ii==0xaa)
                      {
                          IicByteWrite(0xa0,0xf0,0xaa);
                          ii=IicByteRead(0xa0,0xf0);
                          if(ii==0xaa)
                          {
                              ClerData();
                          }
                      }
                   }                   
                }
            }
        }        
    }
} 
 

使用LPC932制作的一款电表---InitCpu 

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

//-----***-CPU寄存器以及外围接口初始化-***-----//
void InitSeries(void)
{
     PCON=PCON | 0x30;             //SMOD1=0;SMOD0=0;通讯速率不加倍,SCON.7作为UART的SM0位
     SCON=SCON | 0xd0;             //串口工作在模式3,禁止串口接收
     SSTAT=0x60;                   //串口工作在普通模式
     BRGCON=BRGCON | 0x02;         //选择波特率发生器用于产生UART的波特率,禁止使能
     //晶振12M通讯速率1200
     BRGR1=0x27;                   //装载高字节
     BRGR0=0x00;                   //装载低字节
     //晶振11.0592通讯速率1200
     //BRGR1=0x23;                 //装载高字节
     //BRGR0=0xF0;                 //装载低字节
     BRGCON=BRGCON | 0x01;         //使能拨特率发生器
     DIR=1;
     ESR=1;                           //使能串口中断
}
void InitCpuIo(void)
{
     P0M1=0x00;
     P0M2=0x38;                     //设置P0.3、P0.4、P0.5为仅为输入
     P1M1=0x2c;
     P1M2=0x0c;
     P2M1=0x40;                     //设置P26为开漏
     P2M2=0x40;
}
void InitTime0(void)
{
     TMOD=TMOD | 0X01;             //
     TAMOD=TAMOD | 0X00;           //定时器工作于模式1
     TH0=0X02;
     TL0=0X40;
     AUXR1=AUXR1 | 0X10;           //定时器0中断反转IO口
     TR0=0;
     ET0=0;                        //使能中断
}
void InitTime1(void)
{
     TMOD=TMOD | 0X10;             //
     TAMOD=TAMOD | 0X00;           //定时器工作于模式1
     TH1=0X00;
     TL1=0X00;
     TR1=1;
     ET1=1;                        //使能中断
}
void InitWDT(void)
{
     ACC=WDCON;                  //看门狗启动,并选择看门狗定时器作为定时
     ACC=ACC|0x84;
     WDL=0x4E;
     WDCON=ACC;
     WFEED1=0xA5;                  //喂狗
     WFEED2=0x5A;
}
void InitINT0(void)
{
     TCON=TCON | 0X00;            //外部中断0采用低电平触发中断
     EX0=1;                       //开启中断
}
void InitINT1(void)
{
    TCON=TCON | 0X00;            //外部中断1采用低电平触发中断
    EX1=1;                         //使能外部中断
}
void Initkey(void)               //初始化键盘中断
{
    //KBPATN=0xff;               //
    KBCON=0x00; 
    KBMASK=0x38;                 //设置P0.1->P0.0为中断源
    EKBI=1;
}
void InitCclk(void)
{
     DIVM=0x00;                   //CCLK=11059200/2;
}
void InitEEPROM(void)
{
    DEECON=0x30;
    EIEE=0;
}
void InitPWM()      //使用外部12M振荡器时:CCU频率=((12000000/2)/6)*16=16000000MHz
{
    TOR2H=0x03;     //定时器重装值=CCU频率/红外线载频=16000000/38000=421=0x1a5
    TOR2L=0x4a;
    OCRAH=0x01;     //(OCRAH:OCRAL)=(TOR2H:TOR2L)/2,PWM的占空比为50%
    OCRAL=0xa4;
    TCR21=0x85;     //PLL预分频为5+1
    CCCRA=1;        //非反相的PWM比较匹配时置位,在CCU定时器向下溢出时清0
    PLLEN=1;        //启动PLL
    PWM=1;
    while(PLLEN==0);
    TCR20=0x82;     // 设置输出模式,非反相PWM
}
void InitCMP(void)
{
    PT0AD=0x06;     //禁止CIN2A上的数字输入功能
    CMP2=0x28;      //0010 1000,CMP1使能,内部Ref,CIN1A
    Delay(10);        //延迟10us,以等待比较器稳定
    CMP2&=0xFE;     //清除比较器中断标志位
    EC=1;           //比较器中断输出使能
}
void InitCpu(void)
{
    InitWDT();
    InitSeries();
    InitCpuIo();
    InitTime0();
    InitTime1();    
    InitINT0();
    InitINT1();
    InitCclk();
    Initkey();
    InitEEPROM();
    InitPWM();
    InitCMP();
} 
 
使用LPC932制作的一款电表---CmdParse 

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

//数据发送
void SeriesSend(void)
{
    unsigned char data i,CheckSum;
    //发送标志有效,开始发送(上位机延时接收)
    if(SeriesSendFg)
    {
        ComDataBuf[8]=ComDataBuf[8]|0x80;
        CheckSum=0;    
        ComDataBuf[0]=0x68;
        for(i=10;i<(ComDataBuf[9]+11);i++)
        {
            ComDataBuf[i]=ComDataBuf[i]+0x33;
        }
        for(i=0;i<(ComDataBuf[9]+10);i++)
        {
          CheckSum=CheckSum+ComDataBuf[i];
        }
        ComDataBuf[ComDataBuf][9]+10]=CheckSum;
        ComDataBuf[ComDataBuf][9]+11]=0x16;
        SeriesSentByte(0xfe);
        SeriesSentByte(0xfe);
        for(i=0;i<ComDataBuf[9]+12;i++)
        {
            SeriesSentByte(ComDataBuf[i]);
        }
        SeriesSentByte(0xff);
        SeriesSentByte(0xff);
        ClerBuf();
        SeriesSendFg=0;
        SendOverFg=1;
    }
}
//编程密码校验---清零密码校验
unsigned char SnCheck(void)
{
    unsigned char i,j,k,m,n,SnIdA,SnIdB,SnCheckData;
    j=0x4c;
    k=0x50;
    m=13;
    SnCheckData=0;
    for(i=0;i<3;i++)
    {
        n=IicByteRead(0xa0,j);
        if(ComDataBuf[m]==IicByteRead(0xa0,j))
        {
           SnIdA=0x55;
        }
        else
        {
           SnIdA=0x00;
           break;
        }
        j++;
    }
    m=13;
    for(i=0;i<3;i++)
    {
        if(ComDataBuf[m]==IicByteRead(0xa0,k))
        {
           SnIdB=0x55;
        }
        else
        {
           SnIdB=0x00;
           break;
        }
        k++;
    }
    if(SnIdA==0x55)
    {
        SnCheckData=0x01;
    }
    else 
    {
        SnCheckData=0;
    }
    if(SnIdB==0x55)
    {       
        SnCheckData=0x01;
    }
    return SnCheckData;
}
//接收到的数据减0x33
void DataDeal(void)
{
    unsigned char i;
    CmdParseFg=0;
    for(i=10;i<ComDataBuf[9]+10;i++)
    {
        ComDataBuf[i]=ComDataBuf[i]-0x33;
        ComDataBuf[ComDataBuf][9]+10]=ComDataBuf[ComDataBuf][9]+10]-0x33;
    }
}
//数据提取
void CmdPick(unsigned char Device,unsigned char PickupAdd,unsigned char DataLen,bit MoveBit,unsigned char *value,unsigned char Lend,bit DataForIic,bit BcdChange)
{    
     unsigned char i,j;

     if(DataForIic)
     {
        if(MoveBit)
        {
           for(i=12;i<DataLen+12;i++)
           {
               j=PickupAdd; 
               ComDataBuf[i]=IicByteRead(Device,j<<4);
               PickupAdd++;
           }
        }
        else
        {
            for(i=12;i<DataLen+12;i++)
            {
               ComDataBuf[i]=IicByteRead(Device,PickupAdd);
               PickupAdd++;
            }
        }
        Lend=DataLen;
     }
     else
     {
         if(BcdChange)
        {
            for(i=12;i<Lend+12;i++)
              {
                  ComDataBuf[i]=HexToBcd(*value);
                  value++;
              }
        }
        else
        {
            for(i=12;i<Lend+12;i++)
              {
                  ComDataBuf[i]=*value;
                  value++;
              }
        }
     }
     ComDataBuf[9]=Lend+2;
     SeriesSendFg=1;
}
//接收到的数据保存
void CmdSave(unsigned char Device,unsigned char PickupAdd,unsigned char SaveAdd,unsigned char DataLen,bit MoveBit)
{
    unsigned char i,j,k;
    k=SnCheck();
    if(k)
    {
        if(MoveBit)
        {
            for(i=0;i<DataLen;i++)
            {
                j=SaveAdd;
                IicByteWrite(Device,j<<4,ComDataBuf[PickupAdd+i]);
                SaveAdd++;
            }
        }
        else
        {
            for(i=0;i<DataLen;i++)
            {
                IicByteWrite(Device,SaveAdd,ComDataBuf[PickupAdd+i]);
                SaveAdd++;
            }
        }        
        for(i=10;i<14;i++)
        {
             ComDataBuf[i]=ComDataBuf[i+4];
        }

⌨️ 快捷键说明

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