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

📄 main.c

📁 符合645规范的单相485液晶普通电子式电能表
💻 C
字号:
#pragma sfr
#pragma DI
#pragma EI
#pragma NOP
#pragma HALT
#pragma STOP



/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
文件名:	main.C
功能:		主程序,监测硬件变化,配合其它模块功能的实现
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#pragma interrupt  INTTM000 MD_INTTM000
#pragma interrupt  INTSR6 SERIAL_INTTM000
#pragma interrupt  INTTMH1 MD_INTTMH1


#pragma section @@CNST OPEN AT 0x80
 const unsigned char open=0xF1;


#include "main.h"
#include "WRE2PROM.h"
#include"serialRC.h"
#include"POWER_COUNT.h"
#include"LCD.h"

uchar  arrl=0;
uchar relay_timer=0;
uchar  incept_leisure=0;
extern uchar STB[MAX_STB_COUNT];


_level_counter_s  Positive;
_level_counter_s  Reverse;

uchar timer_event=0;
uchar KwConstant=0;
uchar Comm_Pin_Check=0;
sreg uchar key_timer;
uint program_timer=0;
bit Error_7755,UartState;

void Event_18mS(void);
void intRAM(void);
void Check_Sys(void);
void Power_CHeck(void);


void Power_off_io_int(void)
{
	MK0=MK1=0xFF;
	PM12=0xF6;      //P121,P122输入模式。P123为输出模式,输出0.
	P12=0;
	
	P13=0x01;
	
	PM2 = 0x08;	/* P23为输入模式,P20~P22为输出模式,输出1. */
	P2=0x07;

	
	PM3 = 0x00;	/* 输出模式,输出0 */
	P3=0x00;
	PM4=0xFF;      //ASICL6ISC=0; D0 

	POWER6=0;
	
	LVIS=0x02;     //3//3.9V

	TMC00=0x00;    //16位定时器关
//	
	TMHMD1=0x50;   //中断
	CMP01=0xFF;
	TMIFH1=0;
	TMHE1=1;//开
 	MK0&=0xEF;
}
void int_MCU(void)     //硬件初始化设置
{
	PM12=0x00;
	P12=0x00;

	P13=0x01;     //高电平

	
	PM2 = 0x08;	/* P23为输入模式,P20~P22为输出模式,输出1 */
	PMC2 = 0x00;	//P2口为端口模式
	P2 = 0x04;	/* P22(SDL)输出1 */

	PM3 = 0x03;	/* P30,P31为输入模式 */
	P3 = 0x00;	
	PM4=0xF0;       /*ASICL6ISC=0; D0 */
	P4 =0xF9;       /* P41,P42输出0 */
	MK0=MK1=0xFF;

//38K
#ifdef NEED_IR
	TMHMD1=0x03;
	CMP01=46;
#else
	TMHMD1=0;
#endif	
//38K
	TMIFH1=0;
	TMHE1=0;//关闭

//串口*****	
	CKSR6=0x03;
	BRGC6=186;//104;
	
	ASIM6=0x1D;
	ASICL6=2;
	POWER6=1;
	RXE6=1;
	MK1 &= 0xdf;


//低压检测
	LVIS=0x03;
	LVIM=0x80;
//*****6mS中断
	TMC00=0x00;
	TOC00=0;
	PRM00 = 0x02;				/* 内部时钟计数 */
	CRC00 = 0x00;	
	CR000 =84;				/* 设置计数值 */
	TMC00 = 0x0c;				/* 开始interval timer功能 */

	MK0 &= 0xdf;				/* INTTM000使能 */
	EI();
	//Positive.count=Reverse.count=0;
//****
}
void main(void)
{
PCC=0x00;
PPCC=0x00;
WDTM = 0x67;    //WDTM 7E禁止  0x67;
LSRCM=0x00;	//启动低速晶振
OSTS=0x00;      //stop起来后用最小的时间
PU2=PU3=PU4=PU12=0;//不接上拉
int_MCU();
//P4&=0xFF;    //测试用20081224
Error_7755=0;
	LCD_Show.timer=0;//INT LCD	
	Positive.count=Reverse.count=0;
	//LCD_Show.Relay_State=0;
	//LCD_Show.Relay_State=ReadChar(RELAY_STATE);
	//relay(LCD_Show.Relay_State);
	load_KwConstant();//读脉冲常数
	LCD_Show.Relay_State=ReadChar(RELAY_STATE);
	relay(LCD_Show.Relay_State);
//++++++++++++++++++++++++++++++++
//********WHILE循环开始
//++++++++++++++++++++++++++++++++
	while(1)
	{//<< << << << << << 10
#ifdef NEED_IR
	
			if(UartState)
			{
				Comm_Pin_Check&=IR_IN_RECOGNISE;
			}
#endif
			if ( timer_event>2 )
			{
				DI();
				timer_event=0;
				EI();
				Event_18mS();
			}
	}
}
//++++++++++++++++++++++++++++++++
//********WHILE循环结束
//++++++++++++++++++++++++++++++++

//中断程序


__interrupt void MD_INTTMH1(void)//136.17021276595744680851063829787 mS
{
	timer_event++;
}

#define NATURAL_PLUSE_WIDTH                             4             //正常最少脉冲宽度
#define NATURAL_PLUSE_INTERVAL                            16             //正常最少脉冲间隔 102mS


/*-------------------------------------------------------------<
功能:		定时器2mS中断,为发送准备,编程按键,接收准备,电量脉冲长度计时
返回值:	无
全局变量:	sendready,Programme_On,incept_leisure,Positive.highlevel
对全局变量的影响:	详见代码
-------------------------------------------------------------->*/
__interrupt void MD_INTTM000(void)//6mS
{
      static uchar interval=NATURAL_PLUSE_INTERVAL;//保证刚上电的第一个脉冲有计数
	TMIFH1=0;
       if(interval<NATURAL_PLUSE_INTERVAL)
        {
            interval++;
        }    
	if (POSITIVE_PIN)
 	{
		if (Positive.highlevel < (NATURAL_PLUSE_WIDTH+1) ) 	
		{
		      Positive.highlevel++;
		}
		Reverse.highlevel=0;
	}
	else
	{
		if (Reverse.highlevel < (NATURAL_PLUSE_WIDTH+1) ) 	
		{
		      Reverse.highlevel++;
		     if (Reverse.highlevel >  NATURAL_PLUSE_WIDTH  ) 	
			{
			      if (Positive.highlevel > NATURAL_PLUSE_WIDTH ) 	   
			       {
                                   if(interval<NATURAL_PLUSE_INTERVAL)
                                    {
                                        Error_7755=1;
                                    } 
                                   else
                                    {
        					if (PEVERSE_PIN) 
        					{
        						Reverse.count++;
        					}
        					Positive.count++; 
                                    }
                                   interval=0;
	 			}	
				Positive.highlevel =0;
			}
		}
		if (Positive.highlevel < (NATURAL_PLUSE_WIDTH+1) ) 	
		{
		      Positive.highlevel=0;
		}		
	}
	
	timer_event++;
}



/*-------------------------------------------------------------<
功能:		串口接收中断程序,识别?据帧并保存,发送完一字节清TT,半双工
返回值:	无
全局变量:	COMM,arrl,STB,ncept_leisure,serial_frame,REN
-------------------------------------------------------------->*/
__interrupt void SERIAL_INTTM000( )
{

	SRIF6=0;
	incept_leisure=3;
	if(UartState==UART_WAIT_START)
	{
		if(RXB6==UART_START_BYTE)
		{
			STB[0]=RXB6;
			arrl=1;
			UartState=UART_WAIT_RXDING;	
			Comm_Pin_Check=IR_PIN_HIGH;
		}
	}
	else
	{
		if (arrl<MAX_STB_COUNT)
		{
			STB[arrl++]=RXB6;
		}else
		{
			UartState=UART_WAIT_START;
		}
	}
}


void Measure(void)
{

	if(!KwConstant)
	{
             KwConstant=8;
	}

	if (Positive.count>=KwConstant)
	{
		updataPower(DEGREE_OF_ABCPHASIC_ACT);	//更新EEPROM
		DI();
		Positive.count-=KwConstant;
		EI();
	}

	if ((Reverse.count)>=KwConstant)
	{
		updataPower(DEGREE_OF_ABCPHASIC_REV);//更新EEPROM
		DI();
		Reverse.count-=KwConstant;
		EI();
	}
}


void program_Check(void)
{
	if(PROGR_KEY)
	{
		if(key_timer<KEY_PRESS_TIME)
		{
			key_timer++;
			if(key_timer==KEY_PRESS_TIME-1)
			{
				if(PROGR_ENABLE)
				{
					program_timer=0;
				}
				else
				{
					program_timer=PROGR_15_MIN;
					Update_LCD(1);
					LCD_Show.timer=LCD_TURN_TIME;
				}
			}		
		}

	}
	else
	{
		key_timer=0;
	}
	if(PROGR_ENABLE)
	{
		program_timer--;
	}
}


void comm_check(void)
{
	DI();
	if(incept_leisure)
	{
		incept_leisure--;
	}
       EI();
	if(!incept_leisure)
	{
		MK1.5=1;//关接收中断
		if(UartState==UART_WAIT_RXDING)
		{
			RXE6=0;
			if (STB[9]<MAX_STB_COUNT-11)
			{
				if(STB[STB[9]+10]==uand(STB,STB[9]+10))
				{
					if (Parse_RxFrame()==OK)
				 	{
						sentarr();
						if(PROGR_ENABLE)
						{
							program_timer=PROGR_15_MIN;
						}
					}
				}
			}
			MemSetTo0(STB,MAX_STB_COUNT);
			RXE6=1;
		}
		RESETGET;
		MK1.5=0;
        	Update_LCD(0);
	}
}
#define SHOW_TIME		29  //4//4S
#define CYCLE_TIME     	76//10S

void Power_check(void)
{
	if(POWER_LOW)
	{
		LCD_Show.Showing_ItemNO=0;
		LCD_Show.timer=0;
		program_timer=0;
		LCD_Show_Turn();
		Power_off_io_int();

		while(POWER_LOW)
		{
			if(timer_event == SHOW_TIME )
			{
				Write_Order(LCD_OFF);
				Write_Order(SYS_DIS);
			}
			else if(timer_event== (CYCLE_TIME-4) )
			{
				Write_Order(SYS_EN);
			}
			else if(timer_event== CYCLE_TIME )
			{
				timer_event=0;
				Write_Order(LCD_ON);
			}
			WDTE=0xAC;
			STOP();
		}
		Write_Order(SYS_EN);
                LCD_Show.timer=35;
		LCD_Show.Showing_ItemNO=0;	 
		int_MCU();//

	}

}
void Event_18mS(void)
{
	WDTE=0xAC;
	comm_check();
	if(relay_timer)
	{
		relay_timer--;
		if(relay_timer==0)
		{
			RELAYFREE;			
		}
	}
	else
	{
		Measure();
	}
	Power_check();
	LCD_Show_Turn();
	program_Check();
}

void load_KwConstant(void)
{
    KwConstant=ReadChar(KWCONSTANT);
}


⌨️ 快捷键说明

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