📄 main.lst
字号:
197 void reset_primjiaobiao(void)
198 {
199 1 Inti_metermode(); //初始化计量模块
200 1 buffer_energ[0]=0;
201 1 buffer_energ[1]=0;
202 1 }
203
204
205 //=====================================================
206 // 函数功能:检测CF脉冲是否异常
207 // 入口参数:CF脉冲数
208 // 返回数据:修正后的CF脉冲数
209 //=====================================================
210 unsigned long check_jump(unsigned char data_cf)
211 { unsigned long value;
212 1 if(data_cf>max_CF)
213 1 { value=0; //停止能量计量
214 2 if(count_errenergmode<10)
215 2 { count_errenergmode++;
216 3 reset_primjiaobiao(); //重新初始化计量模块
217 3 }
218 2 }
219 1 else
220 1 { count_errenergmode=0;
221 2 value=data_cf;
222 2 }
223 1 return value;
224 1 }
225
226
227 //============================================================================
228 //读取CF脉冲
C51 COMPILER V7.06 MAIN 11/24/2008 09:37:01 PAGE 5
229 //===========================================================================
230 void read_encount(void)
231 { unsigned char temp_CF,temp_data;
232 1 temp_data=ReadMeterFunc();
233 1 if((temp_data&0x40)!=0x40)
234 1 buffer_energ[0]=ReadMeterPara(12)+ReadMeterPara(9); //读有功脉冲数
235 1 else
236 1 buffer_energ[0]=ReadMeterPara(15);
237 1 if(buffer_energ[0]>buffer_energ[1]) // 如果脉冲数有增加
238 1 { temp_CF=buffer_energ[0]-buffer_energ[1]; // 计算增加的脉冲数
239 2 temp_CF=check_jump(temp_CF); // 防飞走
240 2 sumCF_Z=sumCF_Z+temp_CF; // 能量脉冲累加
241 2 //qidong_time=0;
242 2 }
243 1 buffer_energ[1]=buffer_energ[0];
244 1
245 1 }
246
247 //==============================================================
248 //函数功能:恢复电量的整数部分,3个字节
249 //===============================================================
250 void Recover_int(unsigned int rec_id)
251 {
252 1 check_engint(rec_id); // 调用在 energradd.c 中
253 1 }
254
255 //-----------------------------------------------------
256 //函数功能:恢复电量数据
257 //备注:
258 //----------------------------------------------------
259 void Recover_eng(void)
260 {
261 1 Recover_int(ID_POSENGSUM); // ID_POSENGSUM 当前有功总电量ID号=0x0100
262 1 }
263
264
265
266 //======================================================
267 //函数功能:恢复参数
268 // 恢复的数据都在RAM中,恢复错误,则,中心设置
269 //======================================================
270 void Recover_prim(void)
271 {unsigned char i,len;
272 1
273 1 if(recover_item(ID_CHANGSHU)==0) // 如果脉冲常数恢复错误
274 1 { wr_buff[0]=0;
275 2 wr_buff[1]=0x4; // 默认为400
276 2 wr_buff[2]=0;
277 2 } // 存放RAM地址 0x40
278 1 addr_baseonIDandtype(RAM,ID_CHANGSHU);
279 1 data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
280 1 Write_data(RAM,(*ID_coretalbpoint[0]).datalong);
281 1
282 1 if(recover_item(ID_BANTRATA)==0) // 如果恢复波特率出错
283 1 {
284 2 wr_buff[0]=01; // 默认参数1200
285 2 }
286 1 addr_baseonIDandtype(RAM,ID_BANTRATA); // 存放RAM地址 0x43
287 1 data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
288 1 Write_data(RAM,(*ID_coretalbpoint[0]).datalong);
289 1
290 1 if(recover_item(ID_COMADDR)==0) // 恢复表地址错误 表号
C51 COMPILER V7.06 MAIN 11/24/2008 09:37:01 PAGE 6
291 1 { for(i=0;i<6;i++)
292 2 wr_buff[i]=0;
293 2 }
294 1 addr_baseonIDandtype(RAM,ID_COMADDR); // 存放RAM地址 0x44
295 1 data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
296 1 len=(*ID_coretalbpoint[0]).datalong;
297 1 Write_data(RAM,len);
298 1
299 1 if(recover_item(ID_TIMERETUN)==0) //轮显时间
300 1 {
301 2 wr_buff[0]=5; //5秒
302 2 }
303 1 addr_baseonIDandtype(RAM,ID_TIMERETUN); // 存放RAM地址 0x50
304 1 data_addr.word[1]=(*ID_coretalbpoint[0]).dataaddr;
305 1 len=(*ID_coretalbpoint[0]).datalong;
306 1 Write_data(RAM,len);
307 1
308 1 }
309
310
311 //=============================================================
312 //函数功能:恢复停电时保存的数据
313 // 要恢复的数据都存放在EEPROM中
314 //==============================================================
315 void Recover_tindiandata(void)
316 { unsigned char value;
317 1
318 1 data_addr.word[1]=EEP_Save_engdot; //恢复电量小数部分
319 1 Read_data(EEPROM,2);
320 1 value=0;
321 1 if(wr_buff[0]==(wr_buff[1]-0x33)) //校验和相等
322 1 { if(checkone_bcd(wr_buff[0])==1) //BCD校验
323 2 { value=1;
324 3 }
325 2 }
326 1 if(value==0) //恢复失败
327 1 { wr_buff[0]=0;
328 2 }
329 1 addr_baseonIDandtype(RAM,ID_POSENGSUM);
330 1 ram[(*ID_coretalbpoint[0]).dataaddr+3]=wr_buff[0]; // 存放进RAM中
331 1 xiaoshu=wr_buff[0];
332 1
333 1 data_addr.word[1]=EEP_Save_cf; //CF 恢复
334 1 Read_data(EEPROM,2);
335 1 if(wr_buff[1]==(wr_buff[0]+0x33))
336 1 { if(wr_buff[0]<128)
337 2 sumCF_Z=wr_buff[0];
338 2 }
339 1 sumCF_Z=0; // 恢复失败,置0。
340 1 }
341
342 //==================================================
343 //函数功能:恢复数据
344 //备注:
345 //===================================================
346 void Recover_data(void)
347 { Recover_eng(); // 恢复电量整数
348 1 Recover_tindiandata(); // 恢复停电时保存的数据:电量小数,CF脉冲数,等
349 1 Recover_prim(); // 恢复表参数
350 1 }
351
352
C51 COMPILER V7.06 MAIN 11/24/2008 09:37:01 PAGE 7
353 //=============================================
354 //函数功能:检测当前系统供电模式
355 //返回参数:1:市电供电。0:电池供电
356 //=============================================
357 unsigned char check_powertype(void)
358 { unsigned char value;
359 1 if((Systate&0x01)==0x01)
360 1 value=1; //正常供电
361 1 else
362 1 {value=0;
363 2 }
364 1 return value;
365 1 }
366
367 //===============================================
368 //函数功能: 电池电压检测
369 //返回参数: battest=1,电池电量不足;battest=0;正常
370 //=================================================
371 void bat_test(void)
372 { uint32 M;
373 1 // battest=0; //
374 1 SetMChannel(2,1); // 开M通道,电池电压检测功能,1倍增益
375 1 delay_10ms(); // 10MS延时
376 1 M=ReadMeterPara(2); // 读寄存器值
377 1 if(M>0x7fffffff)
378 1 {
379 2 M=(~M)+1; //取补码
380 2 }
381 1 M=(M*3)/1000000000; // 计算有效值
382 1 if (M<3) // 小于多少表示电池电压不足,报警
383 1 battest=1; // 报警标志,LCD中显示
384 1 else
385 1 battest=0; //
386 1 SetMChannel(0,1); // 开M通道,电池电压检测功能,1倍增益
387 1 }
388
389 //==============================================
390 //函数功能:初始化各功能模块
391 //
392 //==============================================
393 void Init_modul(void)
394 {
395 1 Init_disp(); // 初始化显示模块
396 1 // init_keyevent(); // 初始化按键模块
397 1 init_RTCmode(); // 初始化RTC模块
398 1 init_realdate(); // 初始化瞬时值
399 1 int_energeadd(); // 初始化能量计量模块
400 1 // init_485comm(); // 初始化485模块
401 1
402 1
403 1 init_infrcomm(); //初始化红外模块
404 1
405 1 // int_lostqiandong(); //初始化潜动和防窃电模块
406 1 // int_zhuancun(); //初始化历史转存模块
407 1 // Ini_switchmode();
408 1 //Ini_checkmode(); //初始化检测模块
409 1 // Int_ereasflashmode(); //初始化擦除标志位
410 1
411 1 }
412
413
414 //============================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -