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

📄 ddsy922.c

📁 为88SC102IC卡与AT89C52做表的可以供大家参考
💻 C
📖 第 1 页 / 共 5 页
字号:
//入口参数:无
//出口参数:无
//********************************************************************/

void main(void)          //主程序        
{ 
 unsigned char i,TEMP[4];
//TEMP[0]=sizeof(struct real_energy);
  EA=0; // disable all interrupts
  io_init();
  //WDT_Init();
  Clock_Init();
  // LVI_Init();
  INT_Init();
  //WT_Init();
  timer_init();
  init_serialcomm(); //对CPU 各个部件初始化 
  //rst_wdog();
  comm_ini();  
  wren_cmd(); //; Set write enable latch
  wrsr_cmd();// ; Write 00H to status register    
  eeprom();  
  EA=1; // enable all interrupts
  ec.ReceBuf[0]=0X99;
  while(1)
     { 
     //	  page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No),&meter_para.factory_No,sizeof(struct meter_para));     

	 rst_wdog();
	energy_add();  
	 //page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+16,display_time,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
	// page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+16,&display_select+16,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
	// page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+32,&display_select+32,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
	  // 	ec.ReceBuf[0]=0XFF;
	//	ec.ReceBuf[1]=0XFF;
	 //  ec.egy[0]=ec.ReceBuf[0]*256+ec.ReceBuf[1];	
	  /// ec.egy[0]=(bin2bcd(ec.egy[0])); 
	 //  for(i=0;i<4;i++)
	 //  TEMP[i]=ec.ReceBuf[i+1];
	 // p=TWO_BCD_Add(real_energy.money_sum,TEMP);
	  //	for(i=0;i<4;i++)
	  //  {
	  //  TEMP[i]= *(p+i);
  	  //  }	   
      if((flag_send==1)&&(CTRL485==0))  //如果取数标志已置位,就将读到的数从串口发出 
           {
            Serial_Command();
            flag_send=0; //取数标志清0 
            CTRL485=1;               
           }
      if(Flag_Sec)
          {     
           Flag_Sec=LOW;         
           CalcCalendar();
           DataToDisBuf();          
		      page_read(OFFSET_OF(EEPROM_DATA,eprom_money_notice0),TEMP,SIZE_OF(EEPROM_DATA,eprom_money_notice0));
          if(Tow_Compare(&real_energy.money0.money_overplus+1,&TEMP[0])==2)   // if(Tow_Compare(real_energy.money_overplus+4,ec.ReceBuf+4)==1)
             {
              real_energy.relayflag.bitflag.iccommand=0;	               
              }
           else
              real_energy.relayflag.bitflag.iccommand=1;
			relaynotice();			  	      
		   for(i=0;i<3;i++)
		    TEMP[i]=0;
		   if(Tow_Compare(&real_energy.money0.money_overplus+1,&TEMP[0])==1)
		    real_energy.relayflag.bitflag.command=1;
			else 
			real_energy.relayflag.bitflag.command=0;
			relayON_OFF();
		 } 	                 
      if(!Flag_Play)
         {
          if(Flag_ICPort)                                                    
          _ICardType();                                               
         }    
    }  
}  
/***************************************************************************
*                    帋臇儖P擮殠罌幬媍栮曽崕瓡?
崕瓡麣帿槑? restoredate()
岴拵?     搊嫀蛬P擮殠罆幣婑殠纴A槦殠纴A旔掕2殠纴B檸見幧攷祴帵栮曽 ;
************************/
unsigned char m_days(unsigned char mmonth)
 {
   unsigned char days;
     if((mmonth==4)||(mmonth==6)||(mmonth==9)||(mmonth==11))
     {
     	days=31;
     	}
     else if(mmonth==2)
      	  {if((current_time.year%4==0&&current_time.year%100!=0)||(current_time.year%400==0))
      	    days=30;
      	    else days=29;
      	  }
     else days=32;
     return(days);	
 }
 
 void CalcCalendar(void)
      {  
     	unsigned char temp1; 
	    half_second++;
	    if(half_second%2==0)
	       { 

	        current_time.second++;
			current_time.second1++;
			if(current_time.second1>2) 
            { 
	         current_time.second=0;
             DisMode++;}
	        if(current_time.second>=60)
	          {
	    	   current_time.second=0;
	    	   current_time.minute++;
	    	   if(current_time.minute>=60)
	    	     {
	    	     current_time.minute=0;
	    	     current_time.hour++;
	    	     if((current_time.hour)>=24)
	    	       {
	    	       current_time.hour=0;
	    	       current_time.day++;
	    	       temp1=m_days(current_time.month);	    	      
	    	       if(current_time.day>=temp1)
	    	         { 
	    	         current_time.day=1;
	    	         current_time.month++;
	    	         if(current_time.month>=13)
	    	           {
	    	     	   current_time.month=1;
	    	     	   current_time.year++;
	    	           }	
	    	         }		    	  	
	    	      }		    		
	            }
	          }
	        }	
	    } 

 

void INT_Init( void )	
{
    //SetIORBit(EGP,0X02);
    //SetIORBit(EGN,0X08);
	//ClrIORBit(INTM0, 0x0c);
	//ClrIORBit(ISC,0x01);
	//SetIORBit(PM3, 0x01);			/* set P30 input mode */
	//ClrIORBit(IF0, 0x04);
	//ClrIORBit(MK0, 0x04);			/* enable INTP0 */
	//INTM1=01;
	//SetIORBit(PM1, 0x07);			// set P3.1 cf p3.2 intp2 P3.3 rx input mode
	//ClrIORBit(IF1, 0x04);
	//ClrIORBit(MK1, 0x04);			// enable INTP3 
	
} 

void io_init(void)
{
   rst_wdog();

	/* Initialize the port registers */
	//P0 = PORT_P0;
	//P1 = PORT_P1;
	//P2 = PORT_P2;
	//P3 = PORT_P3;
	//P6 = PORT_P6;
	//P12 = PORT_P12;	
	/* Initialize the pull-up resistor option registers */
	//PU0 = PORT_PU0;
	//PU1 = PORT_PU1;
  //PU3 = PORT_PU3;
	//PU12 = PORT_PU12;
	/* Initialize the mode registers */
//	PM0 = PORT_PM0;
//	PM1 = PORT_PM1;
//	PM2 = PORT_PM2;
//	PM3 = PORT_PM3;
//	PM6 = PORT_PM6;
//	PM7 = PORT_PM7;
//	PM12 = PORT_PM12;
//  ClrIORBit(ADM, 0x81); 
//  ADPC=5;	
}

void Clock_Init(void)
{

}


void timer_init(void)
{	


	/*ClrIORBit(TMHMD0, 0x80);
	 		// internal countclock 
	TMHMD0 |= 0x00;//(TM_TMH0_CLOCK << 4);
	
	SetIORBit(PR0H, 0x10);			// low priority level 
	ClrIORBit(IF0H, 0x10);
	// TMH0 interval timer 
	ClrIORBit(TMHMD0, 0x8c);
	CMP00 = 0x00;//TM_TMH0_INTERVALVALUE;*/

}
/********************************************************************
延时函数
原型:void Delay_T(unsigned char );
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
void init_serialcomm(void)
{  
   TL0=0X78;
   TH0=0XEC;
   TR0=ET0=TR1=ES=EA=HIGH;	   
    SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD |= 0x21;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON |= 0x80;       //SMOD=1; 
    TH1   = 0xF4;       //Baud:4800  fosc=11.0592MHz 
    IE   |= 0x90;       //Enable Serial Interrupt    
    TR0   = 1; 
  DelayNus(50); /*延时100ms,以稳定CPU*/  
  rst_wdog();
  CTRL485=1; /*485通讯为接收状态*/
 // COMMSEL=1;	/*485通讯为接收状态*/
  /*串口初始化*/
  PCON&=0x3f; /*UART 设置工作方式3,11 位数据*/
  SCON=0xd0;
}

  
void eeprom(void)
{
 unsigned char buff;
if(judg_eeprom_init()==0XAA)
   {   
   page_read(OFFSET_OF(EEPROM_DATA,eprom_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
    buff=xaoyanghe_cs(real_energy.electric.energy,sizeof(struct real_energy)-1);
      if(buff!=real_energy.cs)
        {
         page_read(OFFSET_OF(EEPROM_DATA,eprom_back_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
         buff=xaoyanghe_cs(real_energy.electric.energy,sizeof(struct real_energy)-1);
        if(buff!=real_energy.cs)
          {
          L_default();
          }
        }
    
   } 
 else
     {
    L_default();
    page_read(OFFSET_OF(EEPROM_DATA,eprom_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));
 
     }     
  page_read(OFFSET_OF(EEPROM_DATA,eprom_factory_No),&meter_para.factory_No,sizeof(struct meter_para));     
} 

unsigned char judg_eeprom_init(void)
{
 unsigned char Ttemp;  
page_read(OFFSET_OF(EEPROM_DATA,eprom_meter_iniflag),&Ttemp,1);
 if(Ttemp==0xaa)
   return 0xAA;
 else 
   return 0x00;  
}

void L_default(void)
{

  page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No),&eeprominit,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
  page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+16,&eeprominit+16,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
    current_time.second=0x00;
    current_time.minute=0x00;
    current_time.hour=0x12;
    current_time.week=0x02;
    current_time.day=0x08;
    current_time.month=0x0a;
    current_time.year=0x06;  
  
  page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+32,&eeprominit+32,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)
  page_write(OFFSET_OF(EEPROM_DATA,eprom_factory_No)+48,&eeprominit+48,16);//&real_energy.energy[0]SIZE_OF(EEPROM_DATA,eprom_real_energy)

 }


//void interrupt_init(void)
//{
//	SetIORBit(INTM1, 0x01);
//	ClrIORBit(INTM1, 0x02);
//	SetIORBit(PM4, 0x02);			/* set P41 input mode */
//	ClrIORBit(IF1, 0x04);
//	ClrIORBit(MK1, 0x04);			/* enable INTP3 */
//}
/* void Power_fail(void)
 {
   // DI();
    //WDTE=0xac;
	 Initialize the port registers //
	//P0.0=0;
	P1.7=0;
    P3.1=0;
    P3.2=0;
	PM0.0=0;
	PM1.7=0;
    PM3.1=0;
    PM3.2=0;    
	//P4 = PORT_P4;	
	//P12 = PORT_P12;
	//P13 = PORT_P13;

	// Initialize the pull-up resistor option registers /
	//PU2 = PORT_PU2;
	//PU3 = PORT_PU3;
    //PU4 = PORT_PU4;
	//PU12 = PORT_PU12;

	//Initialize the mode registers /
	//PM0 = 0X00;
	//PM2 = PORT_PM2;
	//PM3 = PORT_PM3;
	//PM7 = 0X00;
	//PM4 = PORT_PM4;
	//PM12 = PORT_PM12;
    ClrIORBit(ADM, 0x81); 
    ADPC = 5; 
    MK0L = 0XFF;
    MK0H = 0XFF;
	MK1H = 0XFF;
	MK1L = 0XDF;
    // Change CPU clock from main clock to sub clock
    SetIORBit(PCC, 0x10);
    SetIORBit(MOC, 0x80);
    while(!CLS)
    ClrIORBit(OSCCTL,0X40);
    RCM=0X01;
    //EI(); 
 }*/
 /*void POWER_On(void)
 {
    DI();
    WDTE=0xac;
    ClrIORBit(ADM, 0x81); 
    ADPC = 5; 
    MK0L = 0XFF;
    MK0H = 0XFF;
	MK1H = 0XFF;
	MK1L = 0XDF;
    // Change CPU clock from main clock to sub clock
    ClrIORBit(PCC,0X80);
    SetIORBit(PCC, 0x40);
    ClrIORBit(MOC, 0x80);
   // OSTC=0X10;
    ClrIORBit(OSCCTL,0X41);
    RCM=0X00;
    PCC=0X00;
    EI();
	;
 }	*/

/********************中断服务子程序*********************//******* 
外部中断0函数
原型: interrupt0    using 2
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
inter0(void) interrupt 0 
{
unsigned char cs;
  cs=xaoyanghe_cs(real_energy.electric.energy,sizeof(struct real_energy)-1);      
  real_energy.cs=cs;
  page_write(OFFSET_OF(EEPROM_DATA,eprom_real_energy),&real_energy.electric.energy[0],sizeof(struct real_energy));
  page_write(OFFSET_OF(EEPROM_DATA,eprom_back_real_energy), &real_energy.electric.energy[0],sizeof(struct real_energy));

}

/********************************************************************
定时中断函数
原型:timer0(void) interrupt 1   using 2
功能:延时1ms*i
入口参数: i 是设定延时时间
出口参数:无
********************************************************************/
timer0(void) interrupt 1   using 2
{     
   TL0=0X66;
   TH0=0Xf5; 
   TR0=HIGH;
   SecCounter++; 
   if(Flag_Rece)
     {
       Rece500ms++;
       if(Rece500ms>=255)
         {
           Rece500ms=0;
           Flag_Rece=1;
           //Flag_Rece=LOW;
           RecCounter=0;
         }
     } 
   if(SecCounter>=20)
     { 
       SecCounter500ms++;
      if (SecCounter500ms>=20)
       {     
        Flag_Sec=HIGH;
        SecCounter500ms=0;
        }
         TR0=LOW;
         DelayNus(8);
         TR0=HIGH;
      DelayNus(1);
      SecCounter=0;
      Flag_ReadTime=1;
     }
	 P=0XFF;		 
  Display();   
}
/********************************************************************
延时函数

⌨️ 快捷键说明

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