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

📄 gy33485.c

📁 红外抄表系统的源代码。利用非电信号传送控制信息和数据信息
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "mylib.h"

#define RELEASE

uchar  Curtime[7] = {0x07,0x05,0x06,0x08,0x15,0x04,0x25};//年,周,月,日,时,分,秒
uchar disnum[9] = {0,0,0,0,0,0,0,0,0};
bdata uint fbase;
bdata uint prefbase;
bdata uint disnum_flag;
bit send_flag=0;//发送标志
bit times_flag=0; //1~9次,次数增加标志
bit swith_phase=0;
bit error_flag=0;
uchar n=0;
uchar m1=0;//地址加k1值提取下一个故障时间
uchar m2=1;//
uint Fault_adress;
uchar CountTimer=0;


////---------------------------////////
sbit Ua_enable = disnum_flag^0;
sbit Ub_enable = disnum_flag^1;
sbit Uc_enable = disnum_flag^2;
sbit Ia_enable = disnum_flag^3;
sbit Ic_enable = disnum_flag^4;
sbit Ip_enable = disnum_flag^5;

sbit UaIflag = disnum_flag^8;
sbit UbIflag = disnum_flag^9;
sbit UcIflag = disnum_flag^10;
sbit IaIflag = disnum_flag^11;
sbit IcIflag = disnum_flag^12;
sbit IpIflag = disnum_flag^13;

uchar IdNum = 0;
uchar Key3Num = 0;//5_18 added
bit ResetNum = 0;   //

bit mail_box_flag = 0;                    //every second set this flag with 1

bit a_start = 0;   //display "起始" while a_start is 1
bit a_stop = 0;    //display "终/到" while a_stop is 1
//flag for interval min
sbit IntervalUaFlag = fbase^8;
sbit IntervalUbFlag = fbase^9;
sbit IntervalUcFlag = fbase^10;
sbit IntervalIaFlag = fbase^11;
sbit IntervalIbFlag = fbase^12;   //for low voltage ammeter
sbit IntervalIcFlag = fbase^13;
sbit IntervalIpFlag = fbase^14;
sbit IntervalUXFlag = fbase^15;   //for low voltage ammeter
//this flag used to reflect fault occurs
sbit UX_fault_flag = fbase^7;
sbit Ip_fault_flag = fbase^6;
sbit Ic_fault_flag = fbase^5;
sbit Ib_fault_flag = fbase^4;
sbit Ia_fault_flag = fbase^3;
sbit Uc_fault_flag = fbase^2;
sbit Ub_fault_flag = fbase^1;
sbit Ua_fault_flag = fbase^0;
//this flag used to reflect fault prestatus
sbit preUX_fault_flag = prefbase^7;
sbit preIp_fault_flag = prefbase^6;
sbit preIc_fault_flag = prefbase^5;
sbit preIb_fault_flag = prefbase^4;
sbit preIa_fault_flag = prefbase^3;
sbit preUc_fault_flag = prefbase^2;
sbit preUb_fault_flag = prefbase^1;
sbit preUa_fault_flag = prefbase^0;
//this flag used to reflect prestatus of Ua.Ub.....UX
sbit PreUaIn = prefbase^15;
sbit PreUbIn = prefbase^14;
sbit PreUcIn = prefbase^13;
sbit PreIaIn = prefbase^12;
sbit PreIbIn = prefbase^11;
sbit PreIcIn = prefbase^10;
sbit PreIpIn = prefbase^9;
sbit PreUXIn = prefbase^8;

//start_min is the time(min) that fault occur,interval_min is the lasting time of fault
uchar idata Ua_start_min,Ua_start_hour,Ua_interval_min=0;
uchar idata Ub_start_min,Ub_start_hour,Ub_interval_min=0;
uchar idata Uc_start_min,Uc_start_hour,Uc_interval_min=0;
uchar idata Ia_start_min,Ia_start_hour,Ia_interval_min=0;
//uchar idata Ib_start_min,Ib_start_hour,Ib_interval_min=0;
uchar idata Ic_start_min,Ic_start_hour,Ic_interval_min=0;
uchar idata Ip_start_min,Ip_start_hour,Ip_interval_min=0;
//uchar idata UX_start_min,UX_start_hour,UX_interval_min=0;

//this struct used to store fault.hour,fault.min,fault.sec
struct fault_time idata Ua_fault;
struct fault_time idata Ub_fault;
struct fault_time idata Uc_fault;
struct fault_time idata Ia_fault;
struct fault_time idata Ib_fault;
struct fault_time idata Ic_fault;
struct fault_time idata Ip_fault;
struct fault_time idata UX_fault;

//#define sending_data_x_axial 8
//#define sending_data_y_axial 6
/*
uchar  idata sendingdata[sending_data_x_axial][sending_data_y_axial]=
                {{0x00,0x00,0x00,0x00,0x00,0x00}, //UA //Ua
                 {0x00,0x00,0x00,0x00,0x00,0x00}, //UB //Ub
                 {0x00,0x00,0x00,0x00,0x00,0x00}, //UC //Uc
                 {0x00,0x00,0x00,0x00,0x00,0x00}, //IA //Ia
                 {0x00,0x00,0x00,0x00,0x00,0x00}, //IC //Ib
                 {0x00,0x00,0x00,0x00,0x00,0x00}, //I- //Ic
                 {0x00,0x00,0x00,0x00,0x00,0x00}, //I.. //Ip
                 {0x00,0x00,0x00,0x00,0x00,0x00},};//U..//Ux*/
//this array used to store fault start_time and stop_time
uchar idata FaultTime[6];

uchar SpIntval = 0;

/*uint UaStartEeprom = 72;
uint UbStartEeprom = 96;
uint UcStartEeprom = 120;
uint IaStartEeprom = 144;
uint IcStartEeprom = 168;
uint IpStartEeprom = 192;*/

uint UaStartEeprom = 80;
uint UbStartEeprom = 200;
uint UcStartEeprom = 320;
uint IaStartEeprom = 440;
uint IcStartEeprom = 560;
uint IpStartEeprom = 680; // 修改定义位置,定义在库函数中

void KickDog(void)
{
    #ifdef RELEASE
    WDT = 0x1E;
    WDT = 0x0E1;
    #else
     ;
    #endif
}
/*
void s_send (void) interrupt 4 using 3
{
        void str(void);    //发送数据块
        uchar mm;
        RI = 0;
        ES = 0;
        mm = SBUF;
        if(mm!='0'){goto reti;}
        while(RI==0);
        RI=0;
        mm=SBUF;
        if(mm!='3'){goto reti;}
        while(RI==0);
        RI=0;
        mm=SBUF;
        if(mm!='1'){goto reti;}
        while(RI==0);
        RI=0;
        mm=SBUF;
        if(mm!='2'){goto reti;}
        while(RI==0);
        RI=0;
        mm=SBUF;
        if(mm!='8'){goto reti;}
        while(RI==0);
        RI=0;
        mm=SBUF;
        if(mm!='5'){goto reti;}
        //P3_2=1;
        SM2=0;
        str();
        //P3_2=0;
        reti:;
        SM2=1;
        ES=1;
}

void str(void)   //发送数据块
{
        uchar i,j;
        for(j=0;j<8;j++)
        {
             for(i=0;i<6;i++)
             {
                 SBUF=sendingdata[j][i];
                 while(TI==0);
                 TI=0;
             }
        }
}*/
/*************************************************/
/* Delay 60us/unit at 11.0592 MHz crystal clock  */
/*************************************************/
void delay(uint t)
{
    uint i,j;
    for(i=0;i<t;i++)
    {
        for(j=0;j<2;j++);
        KickDog();
    }
}
/***************************************/
/*void timer0() interrupt 1 using 2
{
	 if (SpIntval) SpIntval--;
}*/
/***************************************/
/***************************************/
void timer2() interrupt 5 using 1
{   TF2=0;
	 if (SpIntval) SpIntval--;
}
/******************************************************/
/*定时器T0中断子程序,产生38.4千赫兹载波*/
/**************************************/
/*************************************设计日期*2007.6.8*****/
t0()interrupt 1 using 2//
  { P2_7= !P2_7;
   }
/******************************************************/
/*串行接收中断子程序***********************************/
/********************************************************/
/*************************************设计日期*2007.6.8***/
void serial(void) interrupt 4 using 3//
  {uchar mm;
   if(RI)
   {RI=0;
    mm=SBUF;
    if(!(mm^0xaa))
	  send_flag=1;
	  if(!(mm^0xbb))
	  swith_phase=1;
	  if(!(mm^0xee))
	   error_flag=1;
    }
 }
void faultcount(void)
{
    uchar i;
    if(Ua_fault_flag&& !preUa_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[1]++;
         wr_s_eeprom(disnum+1, 66, sizeof(disnum[1]));
    }
    if(Ub_fault_flag && !preUb_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[2]++;
         wr_s_eeprom(disnum+2, 67, sizeof(disnum[2]));
    }
    if(Uc_fault_flag && !preUc_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[3]++;
         wr_s_eeprom(disnum+3, 68, sizeof(disnum[3]));
    }
    if(Ia_fault_flag && !preIa_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[4]++;
         wr_s_eeprom(disnum+4, 69, sizeof(disnum[4]));
    }
/*    if(Ib_fault_flag && !preIb_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[5]++;
    }*/
    if(Ic_fault_flag && !preIc_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[6]++;
         wr_s_eeprom(disnum+6, 70, sizeof(disnum[6]));
    }
    if(Ip_fault_flag && !preIp_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[7]++;
         wr_s_eeprom(disnum+7, 71, sizeof(disnum[7]));
    }
/*    if(UX_fault_flag && !preUX_fault_flag)
    {
         disnum[0]++;
         wr_s_eeprom(disnum, Num_EEPROM, sizeof(disnum[0]));
         disnum[8]++;
    }*/
    preUa_fault_flag = Ua_fault_flag;
    preUb_fault_flag = Ub_fault_flag;
    preUc_fault_flag = Uc_fault_flag;
    preIa_fault_flag = Ia_fault_flag;
//    preIb_fault_flag = Ib_fault_flag;
    preIc_fault_flag = Ic_fault_flag;
    preIp_fault_flag = Ip_fault_flag;
//    preUX_fault_flag = UX_fault_flag;
    for(i=0;i<9;i++)
    {
        if(*(disnum+i) > 9)*(disnum+i) = 0;
    }
}

void loop(void)
{
	  uint i;
    Curtime[5]=R1302(0x83);
    Curtime[4]=R1302(0x85);
    Curtime[3]=R1302(0x87);
    Curtime[2]=R1302(0x89);
    Curtime[1]=R1302(0x8B);
    Curtime[0]=R1302(0x8D);
    for(i=0;i<6;i++)
        Curtime[i] = hex_to_dec(Curtime[i]);
    if(a_start)
        DispIC2_time(S12,Curtime);
    else if(a_stop)
        DispIC2_time(S14,Curtime);
    else
        DispIC2_time(S13,Curtime);
}

void gzsmdy(void)
{
    uint i;
    Ua_in=1;
    if(!Ua_in)  //Ua fault processing
    {
         Ua_fault.sec=Ua_fault.sec + 1;
         if(Ua_fault.sec>=60)
         {
              Ua_fault.sec = 0;
              Ua_fault.min++;
              if(Ua_fault.min>=60)
              {
                   Ua_fault.min = 0;
                   Ua_fault.hour++;
                   if(Ua_fault.hour>=10000)
                   {
                        Ua_fault.hour = 9999;
                   }
              }
         }
         wr_s_eeprom((uchar idata *)(&Ua_fault), Ua_EEPROM, sizeof(Ua_fault));
//----------------------------//
         if(UaStartEeprom > 194)
             UaStartEeprom = 80;
//----------------------------//
         if(!PreUaIn)
         {
             IntervalUaFlag = 1;
             // start Ua_fault  ,read start time,read Ua_fault.min
             Ua_start_min = Ua_fault.min;
             Ua_start_hour = Ua_fault.hour;
             for(i=2;i<6;i++)
                 FaultTime[i] = Curtime[i];  //fault start time(include month,date,hour,minute)
             FaultTime[1] = Curtime[0];
             FaultTime[0] = Ua;

             wr_s_eeprom(FaultTime,UaStartEeprom,sizeof(FaultTime));
             UaStartEeprom += 6;
         }
         if(IntervalUaFlag)
              Ua_interval_min = Ua_fault.min +(Ua_fault.hour-Ua_start_hour)*60 - Ua_start_min;
         if(Ua_interval_min >= 1)      //10
         {
              Ua_fault_flag = 1;
              IntervalUaFlag = 0;

⌨️ 快捷键说明

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