亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? powersupply.c

?? 單相多功能代碼,計量芯片采用ADE7737做為計量,SPI通訊,僅供參考,不得用于商業
?? C
字號:
#include "powersupply.h"

// 當前電流電壓(A,B,C相電壓;A,B,C相電流)
unsigned short CurrentVI[6];
// 電源狀態標志
unsigned char PowerStateFlag=0;
// 電表運行狀態
unsigned char MeterRunningState=0;
// 電表運行狀態字
unsigned char MeterRunningStateWord=0x02;
// 電網狀態字
unsigned char PowerNetStateWord=0;
// 失壓失流狀態
unsigned char LostVIStateWord=0;
// 有功功率相位
unsigned char PhaseActive=0;
// 無功功率相位
unsigned char PhaseReactive=0;
// 失壓時間(分鐘)
unsigned char PhaseLostVTime=0;
// 失流時間(分鐘)
unsigned char PhaseLostITime=0;
// 電表運行時間
unsigned char MeterRunTime=0;
// 電池使用時間
unsigned char BatteryRunTime=0;
// 當前頻率
unsigned short CurrentFreq=0;

/* Voltage detect
* 1. Save drop power time and times
* 2. Freeze power data when drop power
* 3. Perform every second
*/
void VoltageDetect(void)
{
    
}

#if 0
void SaveLowVoltageStartTime(unsigned long addr)
{
    unsigned long temp;
    
    SaveSystimeToDataflashByte4(addr);
    BcdShortAdd1AndWriteE2prom(addr+4);
    LoadSpecPwrDataCurSum((unsigned char *)&temp,0);
    VariationalDataWrite(addr+9,(unsigned char *)&temp,4);
}

void SaveLowVoltageTime(unsigned long addr,unsigned long addr1,unsigned char *runtime)
{
    unsigned long t,ts;
    unsigned char tt;
    
    VariationalDataRead(addr,(unsigned char *)&t,3);
    VariationalDataRead(addr1,(unsigned char *)&ts,3);
    tt=Hex2BcdChar(*runtime);
    t=__bcd_add_long(t,(unsigned long)tt);
    ts=__bcd_add_long(ts,(unsigned long)tt);
    VariationalDataWrite(addr,(unsigned char *)&t,3);
    VariationalDataWrite(addr1,(unsigned char *)&ts,3);
    *runtime=0;
}

/******************************************
* 掉電檢測
******************************************/
void BreakPowerDetect(void)
{
    unsigned char flag;
    
    if(!(PWR_F0_IN&PWR_F0))
    {
        // 停電處理
        if(!(PowerStateFlag&PS_BREAKPOWER_FLAG))
        {
            // 擴展I/O的驅動管腳置低
            P6OUT&=~(STCP|MR|SHCP|DS);
            ExtIoState=0;
            
            P3DIR|=(ADE7758_DO);
            P3OUT&=~(ADE7758_DI|ADE7758_CLK|ADE7758_DO|ADE7758_CS);
            //P3OUT|=(ADE7758_DI|ADE7758_CLK|ADE7758_DO|ADE7758_CS);
            
            P2DIR|=ADE7758_IRQ;
            P2SEL&=~(RS485_TX);
            //P2OUT&=~(RS485_TX+ADE7758_IRQ);
            P2OUT&=~(RS485_TX);
            P2OUT|=ADE7758_IRQ;
            
            // 保存當天電量數據
            //StorePowerData();

            flag=0x5A;
            AptoticDataWrite(ADDR_OF_BREAK_POWER_FLAG,(unsigned char *)&flag,1);
            AptoticDataWrite(ADDR_OF_RAM,(unsigned char *)&TodayPower[0],164);
            AptoticDataWrite(ADDR_OF_RAM+164,(unsigned char *)&PwrData.chksum,sizeof(_sys_wat_data));
            // 保存停電時間
            SavePgmInfo(ADDR_OF_CP_IDX);
            MemSetTo0((unsigned char *)&CurrentVI[0],12);
            LostVIStateWord=0x77;
            //MeterRunningState=0x77;
            PowerNetStateWord=0x77;
            //BTCTL=BT_ADLY_1000+BT_fLCD_DIV128+BTFRFQ1;
            AlarmCtlWord|=ALARM_OF_POWERUP;
            PowerStateFlag|=PS_BREAKPOWER_FLAG;
        }
        LCDMEM[15]=0;
        LCDMEM[16]&=~(BIT0|BIT1);
    }
    else
    {
        // 來電處理
        if(PowerStateFlag&PS_BREAKPOWER_FLAG)
        {
            // 擴展I/O的驅動管腳置高
            P6OUT|=(STCP|MR|SHCP|DS);
            
            P3DIR=P3DIR_VAL;
            P3OUT=P3OUT_VAL;
            
            P2DIR&=~(ADE7758_IRQ);
            P2SEL|=RS485_TX;
            P2OUT|=RS485_TX;
            
            // 初始化7758
            SetSystemEvent(EVENT_INIT_ADE7758);
            // 保存來電時間
            SavePgmInfo(ADDR_OF_UP_IDX);
            //BTCTL=BT_ADLY_125+BT_fLCD_DIV128+BTFRFQ1;
            flag=0xA5;
            AptoticDataWrite(ADDR_OF_BREAK_POWER_FLAG,(unsigned char *)&flag,1);
            AlarmCtlWord&=~ALARM_OF_POWERUP;
            PowerStateFlag&=~(PS_BREAKPOWER_FLAG);
            // 初始化擴展I/O
            EXT_IO_HIGH();
        }
        //LCDMEM[15]|=(LCD_SY_INFO_N1|LCD_SY_INFO_N2|LCD_SY_INFO_N3|LCD_SY_INFO_N4);
        //LCDMEM[16]|=(BIT0|BIT1);
    }
}

void SetFreqSel(unsigned char sel)
{
    Ade7758Write(ADE_ADDR_MMODE,&sel,1);
    AptoticDataWrite(ADDR_OF_ADE_BASE+3*7,&sel,1);
    EnsurePeriodOfTime();
}

// A,B,AB,C,AC,BC,ABC
const unsigned long _LowVoltageItemAddr[]=
{
    ADDR_OF_LV_PHA_LATELY_T,
    ADDR_OF_LV_PHB_LATELY_T,
    ADDR_OF_LV_PHAB_LATELY_T,
    ADDR_OF_LV_PHC_LATELY_T,
    ADDR_OF_LV_PHAC_LATELY_T,
    ADDR_OF_LV_PHBC_LATELY_T,
    ADDR_OF_LV_PHABC_LATELY_T,
    ADDR_OF_LI_PHA_LATELY_T,
    ADDR_OF_LI_PHB_LATELY_T,
    ADDR_OF_LI_PHAB_LATELY_T,
    ADDR_OF_LI_PHC_LATELY_T,
    ADDR_OF_LI_PHAC_LATELY_T,
    ADDR_OF_LI_PHBC_LATELY_T,
    ADDR_OF_LI_PHABC_LATELY_T,
};
// A,B,AB,C,AC,BC,ABC
const unsigned long _LowVoltageStopTimeItemAddr[]=
{
    ADDR_OF_LV_PHA_STOP_T,
    ADDR_OF_LV_PHB_STOP_T,
    ADDR_OF_LV_PHAB_STOP_T,
    ADDR_OF_LV_PHC_STOP_T,
    ADDR_OF_LV_PHAC_STOP_T,
    ADDR_OF_LV_PHBC_STOP_T,
    ADDR_OF_LV_PHABC_STOP_T,
    ADDR_OF_LI_PHA_STOP_T,
    ADDR_OF_LI_PHB_STOP_T,
    ADDR_OF_LI_PHAB_STOP_T,
    ADDR_OF_LI_PHC_STOP_T,
    ADDR_OF_LI_PHAC_STOP_T,
    ADDR_OF_LI_PHBC_STOP_T,
    ADDR_OF_LI_PHABC_STOP_T,
};
//
const unsigned long _LostVISumTime[]=
{
    ADDR_OF_LV_SUM_T,
    ADDR_OF_LI_SUM_T,
};
//
const unsigned long _LostVIStartTime[]=
{
    ADDR_OF_LV_LATELY_T,
    ADDR_OF_LI_LATELY_T,
};
//
const unsigned long _LostVIStopTime[]=
{
    ADDR_OF_LV_STOP_T,
    ADDR_OF_LI_STOP_T,
};
//
const unsigned char _MModeVal[]=
{
    0,1,0,2,0,1,0,0
};
/******************************************
* 電壓檢測
******************************************/
void PhaseVoltageDetect(void)
{
    unsigned long vtemp;
    unsigned char i[2],temp[2];
    unsigned char lvisw=LostVIStateWord;
    unsigned char mrs=MeterRunningState;
    unsigned char pnsw=PowerNetStateWord&0x70;

    // 如果沒有掉電,則讀相電壓
    if(!(PowerStateFlag&PS_BREAKPOWER_FLAG))
    {
        for(i[0]=0;i[0]<3;i[0]++)
        {
            vtemp=0;
            if(Ade7758Read(ADE_ADDR_AIRMS+i[0],(unsigned char *)&vtemp,3)==OK)
            {
                // 取低2字節
                vtemp>>=8;
                if(vtemp&0x00008000)
                {
                    vtemp=(~(vtemp)+1);
                    vtemp&=0x0000FFFF;
                }
                
                vtemp*=_SysPotInfo.currentcoe;
                vtemp/=1000;
                
                // 失流及斷流檢測
                temp[0]=PS_LIA_PHA<<i[0];
                if((unsigned short)vtemp<_SysPotInfo.losti_con)
                {
                    // 置失流標志
                    if(!(lvisw&temp[0]))
                    {
                        lvisw|=temp[0];
                    }
                    if(vtemp<10)
                    {
                        // 置斷流標志
                        if(!(mrs&temp[0]))
                        {
                            mrs|=temp[0];
                        }
                    }
                    else
                    {
                        // 清斷流標志
                        if(mrs&temp[0])
                        {
                            mrs&=~(temp[0]);
                        }
                    }
                }
                else
                {
                    // 清斷流標志
                    if(mrs&temp[0])
                    {
                        mrs&=~(temp[0]);
                    }
                    // 清失流標志
                    if(lvisw&temp[0])
                    {
                        lvisw&=~(temp[0]);
                    }
                }
                // 保存當前電流
                CurrentVI[i[0]+3]=(unsigned short)vtemp;
            }
            
            vtemp=0;
            // 讀電壓有效值
            if(Ade7758Read(ADE_ADDR_AVRMS+i[0],(unsigned char *)&vtemp,3)==OK)
            {
                // 取低2字節
                vtemp>>=8;
                if(vtemp&0x00008000)
                {
                    vtemp=(~(vtemp)+1);
                }

                // 失壓檢測
                temp[0]=PS_LVA_PHA<<i[0];
                if((unsigned short)vtemp<_SysPotInfo.lostv_con)
                {
                    // 置失壓標志
                    if(!(lvisw&temp[0]))
                    {
                        lvisw|=temp[0];
                    }
                    if((unsigned short)vtemp<110)
                    {
                        // 置斷壓標志
                        if(!(mrs&temp[0]))
                        {
                            mrs|=temp[0];
                        }
                    }
                    else
                    {
                        // 清斷壓標志
                        if(mrs&temp[0])
                        {
                            mrs&=~(temp[0]);
                        }
                    }
                }
                else
                {
                    // 清失壓標志
                    if(lvisw&temp[0])
                    {
                        lvisw&=~(temp[0]);
                    }
                    // 清斷壓標志
                    if(mrs&temp[0])
                    {
                        mrs&=~(temp[0]);
                    }
                }
                
                temp[0]=(PS_NET_OVER_PHA<<i[0]);
                // 過壓檢測
                if((unsigned short)vtemp>_SysPotInfo.regv_max)
                {
                    // 置過壓標志
                    if(!(pnsw&temp[0]))
                    {
                        pnsw|=temp[0];
                    }
                }
                else
                {
                    // 清過壓標志
                    if(pnsw&temp[0])
                    {
                        pnsw&=~(temp[0]);
                    }
                    // 清過壓標志
                    if(pnsw&temp[0])
                    {
                        pnsw&=~(temp[0]);
                    }
                }
                
                // 保存當前電壓
                CurrentVI[i[0]]=(unsigned short)vtemp;
            }
        }
    }
    if((lvisw==0)&&((mrs&0x7F)==0)&&(pnsw==0))
    {
        LCDMEM[LCD_CN_INFO_ADDR_ALARM]&=~LCD_CN_INFO_ALARM;
    }
    else
    {
        LCDMEM[LCD_CN_INFO_ADDR_ALARM]|=LCD_CN_INFO_ALARM;
    }
    temp[0]=_SysPotInfo.ade7758_info[7]&0xFC;
    temp[0]|=_MModeVal[mrs&0x07];
    if(temp[0]!=_SysPotInfo.ade7758_info[7])
    {
        SetFreqSel(temp[0]);
    }
    MeterRunningState=mrs;
    pnsw=(pnsw|(mrs&0x07));
    PowerNetStateWord=pnsw;
    if(LostVIStateWord!=lvisw)
    {
        temp[0]=LostVIStateWord&0x07;
        temp[1]=(LostVIStateWord>>4)&0x07;
        i[0]=lvisw&0x07;
        i[1]=(lvisw>>4)&0x07;
        for(mrs=0;mrs<2;mrs++)
        {
            if(temp[mrs]!=i[mrs])
            {
                pnsw=mrs*7;
                if(temp[mrs]!=0)
                {
                    SaveLowVoltageTime(_LowVoltageItemAddr[temp[mrs]-1+pnsw]+6,_LostVISumTime[mrs],(unsigned char *)&PhaseLostVTime);
                }
                else
                {
                    SaveLowVoltageStartTime(_LostVIStartTime[mrs]);
                }
                if(i[mrs]!=0)
                {
                    SaveLowVoltageStartTime(_LowVoltageItemAddr[i[mrs]-1+pnsw]);
                }
                else
                {
                    SaveSystimeToDataflashByte4(_LostVIStopTime[mrs]);
                    SaveSystimeToDataflashByte4(_LowVoltageStopTimeItemAddr[temp[mrs]-1+pnsw]);
                }
            }
        }
    }
    LostVIStateWord=lvisw;
}

void LowVoltageDetect(void)
{
    unsigned char temp;

    temp=LostVIStateWord&0x07;
    if(temp)
    {
        PhaseLostVTime++;
        if(PhaseLostVTime>60)
        {
            SaveLowVoltageTime(_LowVoltageItemAddr[temp-1]+6,ADDR_OF_LV_SUM_T,(unsigned char *)&PhaseLostVTime);
        }
    }
    
    temp=(LostVIStateWord>>4)&0x07;
    if(temp)
    {
        PhaseLostITime++;
        if(PhaseLostITime>60)
        {
            SaveLowVoltageTime(_LowVoltageItemAddr[temp+6]+6,ADDR_OF_LI_SUM_T,(unsigned char *)&PhaseLostITime);
        }
    }
}

void SaveTotleTime(unsigned long addr,unsigned char t)
{
    unsigned long ttmp;
    
    VariationalDataRead(addr,(unsigned char *)&ttmp,4);
    t=Hex2BcdChar(t);
    ttmp=__bcd_add_long(ttmp,(unsigned long)t);
    VariationalDataWrite(addr,(unsigned char *)&ttmp,4);
}

void SaveRunTime(void)
{
    // 保存電表運行時間
    MeterRunTime++;
    if(MeterRunTime>=60)
    {
        SaveTotleTime(ADDR_OF_METER_RUNTIME,MeterRunTime);
        MeterRunTime=0;
    }
    if(PowerStateFlag&PS_BREAKPOWER_FLAG)
    {
        BatteryRunTime++;
        if(BatteryRunTime>=60)
        {
            SaveTotleTime(ADDR_OF_BATTERY_RUNTIME,BatteryRunTime);
            BatteryRunTime=0;
        }
    }
    else
    {
        if(BatteryRunTime)
        {
            SaveTotleTime(ADDR_OF_BATTERY_RUNTIME,BatteryRunTime);
            BatteryRunTime=0;
        }
    }
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久精品久久久久久清纯| 精品国产一区二区三区忘忧草| 丁香一区二区三区| 蜜臀av一级做a爰片久久| 亚洲国产成人av网| 午夜精品久久久久久久99樱桃| 亚洲免费观看高清在线观看| 综合av第一页| 中文字幕日韩一区二区| 国产精品久久国产精麻豆99网站| 国产午夜久久久久| 久久久久国产精品麻豆ai换脸| 日韩一区二区在线看片| 国产成人精品免费网站| 懂色av一区二区夜夜嗨| 国产黄色精品视频| 国产剧情一区在线| 激情五月婷婷综合网| 丁香激情综合国产| 懂色av一区二区三区蜜臀| 国产丶欧美丶日本不卡视频| 久久se这里有精品| 粉嫩嫩av羞羞动漫久久久| 国产精品一区二区免费不卡| 国产成人午夜电影网| jlzzjlzz国产精品久久| 91网站最新网址| 精品视频999| 91精品国产高清一区二区三区 | 丁香六月久久综合狠狠色| 国产伦精品一区二区三区免费| 国产精品自拍在线| 懂色av中文一区二区三区| 99视频精品在线| 在线亚洲人成电影网站色www| 欧美无乱码久久久免费午夜一区| 欧美精品乱码久久久久久| 欧美一区二区三区系列电影| 欧美成人福利视频| 中文乱码免费一区二区| 亚洲另类中文字| 一区二区高清在线| 日本中文字幕一区二区有限公司| 午夜亚洲国产au精品一区二区 | 欧美色爱综合网| 欧美一区二区免费观在线| 欧美电影免费观看完整版| 国产精品成人免费| 天天影视网天天综合色在线播放 | 男人的天堂亚洲一区| 精品一区二区在线观看| jlzzjlzz欧美大全| 91蜜桃网址入口| 91精品国产aⅴ一区二区| 精品国产乱码久久久久久久 | 亚洲欧洲另类国产综合| 国产精品久久777777| 免费在线观看一区| 成人在线视频首页| 欧美日韩国产大片| 亚洲精品在线免费观看视频| 亚洲综合免费观看高清在线观看| 久久激情五月激情| 99精品视频中文字幕| 欧美美女黄视频| 《视频一区视频二区| 亚洲18影院在线观看| 国产精品91一区二区| 欧美视频完全免费看| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲国产sm捆绑调教视频| 国产精品18久久久久久vr| 日本电影欧美片| 日韩欧美一级片| 一区二区三区欧美日韩| 国产不卡在线视频| 欧美日韩在线观看一区二区| 日韩伦理电影网| 久久国产精品免费| 欧美视频一区在线观看| 91精品国产综合久久香蕉麻豆| 亚洲精品国产一区二区精华液| 国产一区不卡视频| 欧美美女一区二区三区| 17c精品麻豆一区二区免费| 狠狠色丁香婷婷综合久久片| 欧美性受xxxx| 国产精品久久二区二区| 国内精品伊人久久久久av影院| 在线观看亚洲精品视频| 国产精品视频观看| 精品一区中文字幕| 4hu四虎永久在线影院成人| 午夜影院在线观看欧美| 色综合久久中文字幕综合网| 国产日韩欧美在线一区| 亚洲成人免费在线观看| 色偷偷88欧美精品久久久| 51精品秘密在线观看| 亚洲电影第三页| 91福利国产精品| 亚洲精品中文字幕乱码三区| www.视频一区| 国产精品美女久久久久av爽李琼 | 精品日韩一区二区三区| 日韩专区欧美专区| 在线观看日韩国产| 综合网在线视频| 91视频国产资源| 国产精品嫩草影院com| 国产成人综合在线播放| 亚洲精品一区二区三区影院| 国产米奇在线777精品观看| 日韩欧美另类在线| 乱一区二区av| 日韩欧美精品在线视频| 国产精品中文欧美| 国产亚洲一区二区三区四区| 久久国产尿小便嘘嘘尿| xnxx国产精品| www.欧美色图| 亚洲国产一区在线观看| 欧美一区二区播放| 国产成人精品综合在线观看| 中文字幕一区二区三区在线观看 | 99精品国产99久久久久久白柏| 亚洲色图在线视频| 欧美老女人第四色| 精品一区二区三区影院在线午夜| 国产亚洲欧美一区在线观看| 99精品视频中文字幕| 亚洲成av人片在线观看| 久久影院午夜论| 99久久国产综合精品女不卡| 天堂午夜影视日韩欧美一区二区| 日韩精品一区二区三区视频播放| 国产自产v一区二区三区c| 综合电影一区二区三区 | 色香蕉久久蜜桃| 麻豆精品在线观看| 日韩久久一区二区| 制服丝袜亚洲播放| 成人一级片网址| 性做久久久久久免费观看欧美| 亚洲精品一区二区三区影院| 色8久久精品久久久久久蜜| 蜜臀av在线播放一区二区三区| 国产精品日韩成人| 欧美美女喷水视频| 成人av免费在线观看| 偷偷要91色婷婷| 中文字幕中文字幕一区| 欧美美女一区二区三区| 成人免费三级在线| 美女尤物国产一区| 亚洲精品中文字幕在线观看| 欧美大片一区二区| 在线一区二区三区四区五区 | 777a∨成人精品桃花网| 成人免费精品视频| 蜜桃一区二区三区在线观看| 亚洲欧美日本在线| 久久精品一区二区三区四区| 欧美精品xxxxbbbb| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 色婷婷av一区二区| 国产在线一区观看| 亚洲va天堂va国产va久| 最新成人av在线| 久久精品一区二区三区不卡| 91精品国产色综合久久| 色哟哟欧美精品| 成人免费毛片app| 国产中文一区二区三区| 日韩精品久久久久久| 一级日本不卡的影视| 国产精品人妖ts系列视频| ww亚洲ww在线观看国产| 在线不卡中文字幕播放| 欧美亚洲图片小说| av在线不卡电影| 国产不卡免费视频| 国产精品资源在线观看| 久久不见久久见免费视频1| 日韩精品一级中文字幕精品视频免费观看 | 看片的网站亚洲| 日韩av中文字幕一区二区三区| 亚洲综合免费观看高清在线观看| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美日韩精品欧美日韩精品一| 91亚洲精品乱码久久久久久蜜桃| 国产精品亚洲专一区二区三区| 久久精品国产一区二区三| 日韩电影在线免费看| 亚洲高清在线精品| 亚洲综合一区二区三区| 亚洲精品视频在线观看网站| 亚洲天堂a在线| 成人免费一区二区三区在线观看| 中文幕一区二区三区久久蜜桃|