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

📄 time_event.c

📁 单相 CPU卡表复费率电能表,内部有提供I2C驱动,CPU卡驱动,NEC单片机0513等
💻 C
字号:
#include <sys_parameter.h>

volatile bit Count_direction,sixteenth_flag;
volatile Timer_Parameter_s xdata Sys_Timer;
byte data tick_count3 = 0;
byte data T15s_Count = 0;
unsigned char data real_pulse_high_timer;
unsigned char key_prog_count = 0, key_page_count = 0;



void timer0(void) interrupt 1 using 2
{
	if (TH0!=TIMER0_H) TH0=TIMER0_H; 
	if (TL0!=TIMER0_L) TL0=TIMER0_L; 		

	Timer0_Count++;

    /* 15秒计时判断,每15秒清零一次TICK计数 */
    if(Timer0_Count >= TIMER_SLOW_JOB) 
	{
		Timer0_Count = 0;
		_sys_evt_add_in_interrupt(EVENT_15_SEC);

    	T15s_Count++;
		if(T15s_Count >= OVERLOAD_CHK_TIME) /* 24次15秒计时判断 */
    	{
	    	T15s_Count=0;
			_sys_evt_add_in_interrupt(EVENT_6_MIN);
    	}
	}  

	/* 16次TICK中断指示1秒(62.5ms*16=1s) */
    if(!(Timer0_Count&0x0f)) 
	{
		_sys_evt_add_in_interrupt(EVENT_SECOND);
	}

	_sys_evt_add_in_interrupt(EVENT_SYS_TIMER);

	
	sixteenth_flag=1;
						
}



void  timeint1(void) interrupt 3 using 3
{	
	static unsigned char *ExtIoState = _drv_led_digit_array;
	unsigned char data k;

	//检测继电器当前状态
    FHASE_OUT=1;
	if(!FHASE_OUT)
	{
		phase_voltage_out = OPEN;
		relay_status_count = 0;
	}
	else
	{
		if(relay_status_count < 56)
		{
			relay_status_count++;
		}
		else
		{
			phase_voltage_out = CLOSE;
		}
	}
	
	
	P0 |= 0x07;

    for( k = 0; k < 8; k++ )
    {		
        if( (*ExtIoState) & (0x80>>k) )
            LED_A2 = 1;
        else
            LED_A2 = 0;
		        
        HC_CLK = 1;   

        HC_CLK = 0;
    }

	P0 &= (0xf8|(ExtIoState - _drv_led_digit_array));

	if((++ExtIoState) >= (_drv_led_digit_array + LED_DIGIT_NUM))
	{
	    ExtIoState = _drv_led_digit_array;
	}

    if(pulse_tally)//90mS
    {
        tick_count3++;

		switch (tick_count3)
		{
			case 1:
				if(Count_direction)
				{
		            JDQ0 = 1;
					JDQ1 = 0;
				}
				else
				{
		            JDQ0 = 0;
					JDQ1 = 1;
				}
				Count_direction=~Count_direction;
				break;
			case 37:
	            JDQ0 = 1;
				JDQ1 = 1;
			   break;
			case 73:
				tick_count3=0;
				pulse_tally--;
			   break;
		}
    }     

	if(Pulse_Pin)
	{
		if(real_pulse_high_timer<4)
		{
			real_pulse_high_timer++;
			if(4 == real_pulse_high_timer)
			{
				real_pulse_count++;				
				if(real_pulse_count >= pulse_constant_1_percent)
				{
					if(pulse_counter<255)
					{
					    pulse_counter++;
						pulse_tally++;
					}
					real_pulse_count = 0;
				}
			}
		}
	}
	else
	{
		real_pulse_high_timer=0;
	}
	
	//2.5ms  
	if (TH1 != 0xFC) TH1 = 0xFC; 
	if (TL1 != 0x18) TL1 = 0x18;
}



uchar key_press_check(uchar AD_addr, uchar *timer,uchar max_timer)
{
   EXT_ADR = AD_addr;
   if(EXT_DAT < 0x65)
   {
   	  if(*timer < 32) //防止计数溢出,最大只计计到200
	  {
		 (*timer)++;
	  }
	  if( max_timer == *timer)  //about 250ms的键盘去抖时间
	  {
		return KEY_PRESS;
	  }
   }
   else
   {
 	 *timer=0;
   }
   
  return KEY_NOT_PRESS;
}
void key_check(void)
{

	if(CHG == 0)
	{
		if( KEY_PRESS == key_press_check(0x0B,&key_page_count,1) )
		{
			if(0x00 == display_power)
			{
				epmPowerDisplaySw();
			}
							
			if(display_item >= DISP_ITEM_NUMBER)
			{
				display_item=0;
			}
			display_step = 0;//显示下一个显示内容
			epmDisplayRefresh();

		}
		
		if( KEY_PRESS == key_press_check(0x09,&key_prog_count,7) )
		{
			if(PROG_ENABLE)
			{
				LAMP_OFF();
				Sys_Timer.Prog_enable_Timer =0;
			}else
			{
				Sys_Timer.Prog_enable_Timer = PROG_ENABLE_CONTINUE_TIME;
				LAMP_ON();
			}	
		}
		
		CHG = 1;
	}

}
void Sys_Tick_Proc(void)
{
	//62.5 mS

	key_check();	
	WDI_RESET();	
	ICCard_Polling();
	WDI_RESET();
	epmPowerRecord();  
}

void Sys_sencond_proc(void)
{

#if 0 //test
	//测试代码,用来伪装外部来的电量脉冲
	pulse_counter++;
#endif	
	epmPowerMonitor();
	WDI_RESET();
    epmDisplayRefresh();
    WDI_RESET();
	if(Sys_Timer.resume_power_supply_timer)
	{
		Sys_Timer.resume_power_supply_timer--;
		if(0x00 == Sys_Timer.resume_power_supply_timer)
		{
			resume_power_supply();
		}
	}	
}

void Sys_15_sencond_proc(void)
{
	usrPhaseStateChk();
    WDI_RESET();
    usrPowerAlert();
    WDI_RESET();
	if(PROG_ENABLE)
	{
		Sys_Timer.Prog_enable_Timer--;
		if(!PROG_ENABLE)
		{
			LAMP_OFF();
		}
	}

}

void Sys_6_minute_proc(void)
{
	usrPhaseStateRect();
    WDI_RESET();
    epmQDDLCalculate();
    WDI_RESET();
    epmZDXLCalculate();
    WDI_RESET();
    epmOverloadOper();
    WDI_RESET();
	Reset_Sys();
	WDI_RESET();
}


⌨️ 快捷键说明

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