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

📄 main.src

📁 电能表源码
💻 SRC
📖 第 1 页 / 共 5 页
字号:
;   *point = 0x00;    //close LCD display
;   point = 0x28d1;
;   *point = 0x01;    //close LCD clock
; 
;   point = 0x2894;
;   *point = 0x00;
;                     //close analog circuit
; 
;   point = 0x2898;
;   *point = 0x00;
; 	
;   point = 0x2896;
;   *point = 0x0c;        
;    point = 0x2897;
;   *point = 0x00; 
;  // point = 0x28d0;
;  // *point = 0x01;    //using OSC
;   
; }
; 
; ------------------------------------------------------------------*/
; 
; /*
; void SetAnalogPara2(void)
; { //	CrtlLDO |= DGEN;
; 	CrtlGA = 0x33;		// 0x2888
; 	CrtlGB = 0x33;		// 0x2889
; 	CrtlGU = 0x31; 		// 0x288a
; 	CrtlADC = 0x37;		// 0x2894
; //	CrtlIAT = 0x00;
; //	CrtlCLK = 0x85;
; 
; //	CrtlIAT	= 0x7f;		// 0x288c
; //	CrtlIAD = 0x12;		// 0x288d
; //	CrtlIBT = 0x01;		// 0x288e
; //	CrtlIBD = 0x12;		// 0x288f
; //	CrtlUT  = 0x7f;		// 0x2890
; //	CrtlBGP = 0x00;		// 0x2892
; //	CrtlPow	= 0x80;		// 0x2893
; 	CrtlCry = 0x03;		// 0x2895
; 	CrtlLDO = 0x11;		// 0x2896
; }
; 
; */
; 
; //=================================================
; //函数功能: 初始化Timer0
; //
; //=================================================
; void Init_Timer0(void)

	RSEG  ?PR?Init_Timer0?MAIN
Init_Timer0:
	USING	0
			; SOURCE LINE # 163
; {	
			; SOURCE LINE # 164
; 	TMOD = 0x01;	     // 工作在模式1
			; SOURCE LINE # 165
	MOV  	TMOD,#01H
; 	CKCON|=0x08;         // clk/4 
			; SOURCE LINE # 166
	ORL  	CKCON,#08H
;     TL0  = 0xff;         //10ms
			; SOURCE LINE # 167
	MOV  	TL0,#0FFH
;     TH0  = 0xdf;
			; SOURCE LINE # 168
	MOV  	TH0,#0DFH
;     TR0 = 1;		     // 开定时器0
			; SOURCE LINE # 169
	SETB 	TR0
; 	Ctor_intrupt(1,1);   //打开中断
			; SOURCE LINE # 170
	MOV  	R5,#01H
	MOV  	R7,#01H
	LJMP 	_Ctor_intrupt
; END OF Init_Timer0

; 	//SetInterrupt(1);     //打开中断
;     
; }
; 
; //===========================================
; //函数功能:初始化io口
; //
; //===========================================
; void Init_io(void)

	RSEG  ?PR?Init_io?MAIN
Init_io:
			; SOURCE LINE # 179
; {
			; SOURCE LINE # 180
;   P1_1OE=1;
			; SOURCE LINE # 181
	MOV  	DPTR,#P1OE_ADDR
;   P1_2OE=1;
			; SOURCE LINE # 182
;   P1_1IE=0;
			; SOURCE LINE # 183
	LCALL	L?0275
	ANL  	A,#0FDH
	MOVX 	@DPTR,A
;   P1_2IE=0;
			; SOURCE LINE # 184
	MOVX 	A,@DPTR
	ANL  	A,#0FBH
	MOVX 	@DPTR,A
;   P2_3OE=0;
			; SOURCE LINE # 185
	MOV  	DPTR,#P2OE_ADDR
	MOVX 	A,@DPTR
	ANL  	A,#0F7H
	MOVX 	@DPTR,A
;   P2_3OD=0;
			; SOURCE LINE # 186
	MOV  	DPTR,#P2OD_ADDR
	MOVX 	A,@DPTR
	ANL  	A,#0F7H
	MOVX 	@DPTR,A
;   P0OE=0;
			; SOURCE LINE # 187
	CLR  	A
	MOV  	DPTR,#P0OE_ADDR
	MOVX 	@DPTR,A
;   P0OD=0;
			; SOURCE LINE # 188
	MOV  	DPTR,#P0OD_ADDR
	MOVX 	@DPTR,A
;   P0IE=0xff;
			; SOURCE LINE # 189
	MOV  	DPTR,#P0IE_ADDR
	MOV  	A,#0FFH
	MOVX 	@DPTR,A
; }
			; SOURCE LINE # 190
	RET  	
; END OF Init_io

; 
; //==========================================
; //函数功能:系统初始化,
; //备注:初始化模拟部分和数字部分寄存器
; //===========================================
; void Init_System(void)

	RSEG  ?PR?Init_System?MAIN
Init_System:
	USING	0
			; SOURCE LINE # 196
; {  
			; SOURCE LINE # 197
;     port_init();                //初始化io口
			; SOURCE LINE # 198
	LCALL	port_init
; //   SetPLL();                   //开pll电路
;    InitMeter();                //初始化计量电路
			; SOURCE LINE # 200
	LCALL	InitMeter
;    SetMeterFunc(0x07);         //启动关闭,A通道计量,关CF输出
			; SOURCE LINE # 201
	MOV  	R7,#07H
	LCALL	_SetMeterFunc
;    //SetAnalogPara2();            //初始化模拟电路
;    SetADC(1,8);                 //A通道电流,采用8倍增益
			; SOURCE LINE # 203
	MOV  	R5,#08H
	MOV  	R7,#01H
	LCALL	_SetADC
;    SetADC(2,8);                 //B通道电流,采用8倍增益
			; SOURCE LINE # 204
	MOV  	R5,#08H
	MOV  	R7,#02H
	LCALL	_SetADC
;    SetADC(3,8);                 //电压通道,采用8倍增益
			; SOURCE LINE # 205
	MOV  	R5,#08H
	MOV  	R7,#03H
	LCALL	_SetADC
;    SetXRam(1);                 //开启对XRAM的写保护
			; SOURCE LINE # 206
	MOV  	R7,#01H
	LCALL	_SetXRam
;    //Init_eeprom();              //初始化EEPROM      上电误操作
;    Init_Timer0();
			; SOURCE LINE # 208
	LJMP 	Init_Timer0
; END OF Init_System

; }
; 
; //============================================================================
; //读取CF脉冲
; //===========================================================================
; void read_encount(void)

	RSEG  ?PR?read_encount?MAIN
read_encount:
	USING	0
			; SOURCE LINE # 214
; { unsigned char temp_CF,temp_data;
			; SOURCE LINE # 215
;   temp_data=ReadMeterFunc();
			; SOURCE LINE # 216
	LCALL	ReadMeterFunc
;---- Variable 'temp_data?441' assigned to Register 'R7' ----
;   if((temp_data&0x40)!=0x40)
			; SOURCE LINE # 217
	MOV  	A,R7
	JB   	ACC.6,?C0005
;       buffer_energ[0]=ReadMeterPara(12)+ReadMeterPara(9);    //读有功脉冲数
			; SOURCE LINE # 218
	MOV  	R7,#09H
	LCALL	_ReadMeterPara
	MOV  	A,R4
	PUSH 	ACC
	MOV  	A,R5
	PUSH 	ACC
	MOV  	A,R6
	PUSH 	ACC
	MOV  	A,R7
	PUSH 	ACC
	MOV  	R7,#0CH
	LCALL	_ReadMeterPara
	POP  	ACC
	MOV  	R3,A
	POP  	ACC
	MOV  	R2,A
	POP  	ACC
	MOV  	R1,A
	POP  	ACC
	MOV  	R0,A
	LCALL	?C?LADD
	SJMP 	?C0207
?C0005:
;   else
;       buffer_energ[0]=ReadMeterPara(15);
			; SOURCE LINE # 220
	MOV  	R7,#0FH
	LCALL	_ReadMeterPara
?C0207:
	MOV  	DPTR,#buffer_energ
	LCALL	?C?LSTXDATA
?C0006:
;   if(buffer_energ[0]>buffer_energ[1])                    //如果脉冲数有增加
			; SOURCE LINE # 221
	MOV  	DPTR,#buffer_energ+04H
	LCALL	?C?LLDXDATA
	MOV  	DPTR,#buffer_energ
	LCALL	?C?LLDXDATA0
	SETB 	C
	LCALL	?C?ULCMP
	JC   	?C0011
;     { temp_CF=buffer_energ[0]-buffer_energ[1];           //计算增加的脉冲数
			; SOURCE LINE # 222
	MOV  	DPTR,#buffer_energ+04H
	LCALL	?C?LLDXDATA
	XCH  	A,R3
	MOV  	A,R7
	XCH  	A,R3
	MOV  	DPTR,#buffer_energ
	LCALL	?C?LLDXDATA
	CLR  	C
	MOV  	A,R7
	SUBB 	A,R3
	MOV  	R7,A
;---- Variable 'temp_CF?440' assigned to Register 'R7' ----
; 	  sumCF_Z=sumCF_Z+temp_CF;                           //能量脉冲累加  
			; SOURCE LINE # 223
	MOV  	DPTR,#sumCF_Z
	MOVX 	A,@DPTR
	ADD  	A,R7
	MOVX 	@DPTR,A
;       num_xuliangCF_z=num_xuliangCF_z+temp_CF;           //需量脉冲累加 
			; SOURCE LINE # 224
	MOV  	DPTR,#num_xuliangCF_z
	CLR  	A
	MOV  	B,R7
	LCALL	?C?IILDX
;       if(num_xuliangCF_z==1)                             //第一个脉冲启动计数器
			; SOURCE LINE # 225
	MOV  	DPTR,#num_xuliangCF_z
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	XRL  	A,#01H
	ORL  	A,R6
	JNZ  	?C0008
;            time_count_z=0; 
			; SOURCE LINE # 226
	MOV  	DPTR,#time_count_z
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
	SJMP 	?C0009
?C0008:
;       else if(num_xuliangCF_z>1)                          //如果脉冲大于1,则记录时间
			; SOURCE LINE # 227
	SETB 	C
	MOV  	A,R7
	SUBB 	A,#01H
	MOV  	A,R6
	SUBB 	A,#00H
	JC   	?C0009
;            time_maichong_z=time_count_z; 
			; SOURCE LINE # 228
	MOV  	DPTR,#time_count_z
	MOVX 	A,@DPTR
	MOV  	R7,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	DPTR,#time_maichong_z
	XCH  	A,R7
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R7
	MOVX 	@DPTR,A
?C0009:
;       buffer_energ[1]=buffer_energ[0];                          
			; SOURCE LINE # 229
	MOV  	DPTR,#buffer_energ
	LCALL	?C?LLDXDATA
	MOV  	DPTR,#buffer_energ+04H
	LCALL	?C?LSTXDATA
;  	  //qidong_time=0;
;   	}
			; SOURCE LINE # 231
; /*
;    buffer_energ_F[0]=ReadMeterPara(9);               //读反向有功脉冲数 
;    if(buffer_energ_F[0]>buffer_energ_F[1])
;       { temp_CF=buffer_energ_F[0]-buffer_energ_F[1];
;         sumCF_F=sumCF_F+temp_CF;
;         num_xuliangCF_f=num_xuliangCF_f+temp_CF; 
; 		if(num_xuliangCF_f==1)
; 		   time_count_f=0;
; 		else if(num_xuliangCF_f>1)                     //如果脉冲大于1,则记录时间
;            time_maichong_f=time_count_f;  
; 		if(ram[RAM_modeengadd]==1)                                //有功组合方式,反记入正
; 		   { sumCF_Z=sumCF_Z+temp_CF;                            //能量脉冲累加  
;              num_xuliangCF_z=num_xuliangCF_z+temp_CF;            //需量脉冲累加  
;              if(num_xuliangCF_z==1)                             //第一个脉冲启动计数器
;                   time_count_z=0;  
; 			 else if(num_xuliangCF_z>1)                     //如果脉冲大于1,则记录时间
;                   time_maichong_z=time_count_z;  
; 		   }
; 	   buffer_energ_F[1]=buffer_energ_F[0];
; 	  }
;   */
; }
			; SOURCE LINE # 253
?C0011:
	RET  	
; END OF read_encount

; 
; /*
; //==================================================
; //函数功能:恢复月平均功率因数
; //
; //==================================================
; void Recover_yinshu(void)
; { uint8 i,value;
;   value=0;
; 
;   offset_yinshuflash=127;
;   for(i=0;i<128;i++)
;      { data_addr.word[1]=FL_yinshu+4*offset_yinshuflash;     //xx.xxxx
; 	   Read_data(FLASH,3);
; 	   if(check_X_bcd(3,wr_buff)==1)        //如果数据合法
; 	       { data_addr.word[1]=RAM_yinshu;
;  		     Write_data(RAM,3);
;              buff_yingshu=value_hex_from_2bcd(&ram[RAM_yinshu]);    //转为hex码
;              buff_yingshu=buff_yingshu*100+value_hex_from_bcd(ram[RAM_yinshu+2]);
; 			 value=1;
; 		   }
; 	   else
; 	       offset_yinshuflash--;
; 	 }
;   if(value==0)                           //如果恢复出错
;      { F_askerasyingshu=1;               //擦flash
; 	   for(i=0;i<3;i++)
; 	      ram[i+RAM_yinshu]=0;          
;        buff_yingshu=0;
;  	 }
;   else
;      F_askerasyingshu=0;
; }
; */
; 
; 
; //====================================================
; //函数功能:恢复需量数据
; //====================================================
; void Recover_xuliang(void)

	RSEG  ?PR?Recover_xuliang?MAIN
Recover_xuliang:
	USING	0
			; SOURCE LINE # 293
; { uint8 i,value;
			; SOURCE LINE # 294
;   value=0;
			; SOURCE LINE # 295
	CLR  	A
	MOV  	DPTR,#value?543
	MOVX 	@DPTR,A
;   offset_xuliangaddr=55;
			; SOURCE LINE # 296
	MOV  	DPTR,#offset_xuliangaddr
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,#037H
	MOVX 	@DPTR,A
;   for(i=0;i<56;i++)
			; SOURCE LINE # 297
	CLR  	A
	MOV  	DPTR,#i?542
	MOVX 	@DPTR,A
?C0012:
;      { data_addr.word[1]=FL_maxxuliang+offset_xuliangaddr*9;
			; SOURCE LINE # 298
	MOV  	DPTR,#offset_xuliangaddr
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	R4,#00H
	MOV  	R5,#09H
	LCALL	?C?IMUL
	CLR  	A
	ADD  	A,R7
	MOV  	R7,A
	MOV  	A,R6
	ADDC 	A,#07AH
	LCALL	L?0221
; 	   Read_data(FLASH,9);
			; SOURCE LINE # 299
	MOV  	R7,#02H
	LCALL	_Read_data
; 	   if(check_X_bcd(8,wr_buff)==1)        //如果数据合法
			; SOURCE LINE # 300
	LCALL	L?0248
	MOV  	R7,#08H
	LCALL	_check_X_bcd
	MOV  	A,R7
	XRL  	A,#01H
	JNZ  	?C0015
; 	       { addr_baseonIDandtype(RAM,ID_XULENGPOSSUM);
			; SOURCE LINE # 301
	MOV  	R5,A
	MOV  	R4,#041H
	MOV  	R7,A
	LCALL	_addr_baseonIDandtype
;              data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
			; SOURCE LINE # 302
	LCALL	L?0217
	LCALL	L?0219
;  		     Write_data((*ID_coretalbpoint[0]).stortype,(*ID_coretalbpoint[0]).datalong);
			; SOURCE LINE # 303
	LCALL	L?0245
	MOV  	R5,A
	LCALL	_Write_data
; 			 value=1;
			; SOURCE LINE # 304
	MOV  	DPTR,#value?543
	MOV  	A,#01H
	MOVX 	@DPTR,A
; 		   }
			; SOURCE LINE # 305
	SJMP 	?C0014
?C0015:
; 	   else
; 	       offset_xuliangaddr--;
			; SOURCE LINE # 307
	MOV  	DPTR,#offset_xuliangaddr
	MOV  	A,#0FFH
	MOV  	B,A
	LCALL	?C?IILDX
; 	 }
			; SOURCE LINE # 308
?C0014:
	MOV  	DPTR,#i?542
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	MOVX 	A,@DPTR
	CLR  	C
	SUBB 	A,#038H
	JC   	?C0012
?C0013:
;   if(value==0)                           //如果恢复出错
			; SOURCE LINE # 309
	MOV  	DPTR,#value?543
	MOVX 	A,@DPTR
	JNZ  	?C0017
;      { F_askerasxuliang=1;               //擦flash
			; SOURCE LINE # 310
	MOV  	DPTR,#flag_ereasflash01
	MOVX 	A,@DPTR
	ORL  	A,#04H
	MOVX 	@DPTR,A
; 	   for(i=0;i<8;i++)
			; SOURCE LINE # 311
	CLR  	A
	MOV  	DPTR,#i?542
	MOVX 	@DPTR,A
?C0018:
	MOV  	DPTR,#i?542
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	SUBB 	A,#08H
	JNC  	?C0019
; 	       wr_buff[i]=0;
			; SOURCE LINE # 312
	MOV  	A,#LOW (wr_buff)
	ADD  	A,R7
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#HIGH (wr_buff)
	MOV  	DPH,A
	CLR  	A
	MOVX 	@DPTR,A
	MOV  	DPTR,#i?542
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	SJMP 	?C0018
?C0019:
;        addr_baseonIDandtype(RAM,ID_XULENGPOSSUM);
			; SOURCE LINE # 313
	MOV  	R5,#00H
	MOV  	R4,#041H
	CLR  	A
	MOV  	R7,A
	LCALL	_addr_baseonIDandtype
;        data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
			; SOURCE LINE # 314
	LCALL	L?0217
	LCALL	L?0219
;  	   Write_data((*ID_coretalbpoint[0]).stortype,(*ID_coretalbpoint[0]).datalong);
			; SOURCE LINE # 315
	LCALL	L?0245
	MOV  	R5,A
	LJMP 	_Write_data
;  	 }
			; SOURCE LINE # 316
?C0017:
;  else
;       F_askerasxuliang=0;
			; SOURCE LINE # 318
	MOV  	DPTR,#flag_ereasflash01
	MOVX 	A,@DPTR
	ANL  	A,#0FBH
	MOVX 	@DPTR,A
; }
			; SOURCE LINE # 319
?C0022:
	RET  	
; END OF Recover_xuliang

; /*
; 
; //======================================================
; //函数名称:recover_dot_f()
; //函数功能:从FLASH中读取反向有功电量小数点部分,1个字节
; //备注:
; //======================================================
; unsigned char Recover_dot_f(void)
; { unsigned int i;
;   unsigned char value1;
;   value1=0;
;   data_addr.word[1]=FL_engdotaddr_f+511;
;   Read_data(FLASH,1);
;   for(i=0;i<512;i++)
;         { Read_data(FLASH,1);
; 	      data_addr.word[1]--;
;           if(wr_buff[0]!=0xff)

⌨️ 快捷键说明

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