3201.lst
来自「基于PL3201芯片的单相复费率载波通信多功能电表应用程序」· LST 代码 · 共 801 行 · 第 1/3 页
LST
801 行
250 1 SSC_DAT=0xc0; // 开启载波通讯功能,打开中断,选择接收状态置为3200模式
251 1
252 1 SSC_ADR=0x04; // 设置捕获门限
253 1 SSC_DAT=LIMIT_3200;
254 1
255 1 SSC_ADR=0XFF;
256 1 SSC_DAT=0XAA; // 使能写保护
257 1 }
258 /**************************************************************************************
259 *
260 * FUNCTION: set_PLC_3105
261 *
262 * DESCRIPTION: set the PLC function of pl3201 be 3105
263 *
264 * PARAMETERS: none
265 *
266 * RETURNED: none
267 * EDITION: V1.0
268 *************************************************************************************/
269 void set_PLC_3105 ( )
270 {
271 1 SSC_ADR=0XFF; // 2005.11.29 LXW
272 1 SSC_DAT=0XFF; // 禁止写保护
273 1
274 1 SSC_ADR=0x03; // 选择3201载波通讯控制寄存器3
275 1 SSC_DAT=0xe0; // 开启载波通讯功能,打开中断,选择接收状态置为3105模式
276 1
277 1 SSC_ADR=0x04; // 设置捕获门限
278 1 SSC_DAT=LIMIT_3105;
279 1
280 1 SSC_ADR=0XFF;
281 1 SSC_DAT=0XAA; // 使能写保护
282 1 }
283 /**************************************************************************************
284 *
285 * FUNCTION: initsys
286 *
287 * DESCRIPTION: 初始化设置函数,
288 * 进行系统初始化设置
289 *
290 * PARAMETERS: none
291 *
292 * RETURNED: none
293 *
294 *************************************************************************************/
295 void initsys ( void )
296 { // 控制看门狗喂狗时间长度
297 1 CKCON=0X3F;
298 1 // 8位/16位运算模式选择位设置
299 1 ALU_MOD=0; // 设置成8位运算模式
300 1 //载波通讯配置
301 1 //************ 3201的载波寄存器设置 **********//
302 1 set_PLC_3105 ( ); //上电为3105模式
C51 COMPILER V7.06 3201 05/10/2007 10:43:22 PAGE 6
303 1
304 1 SSC_ADR=0xFF;
305 1 SSC_DAT=0xFF;
306 1 SSC_ADR=0x02;
307 1 SSC_DAT=0x1F;
308 1 SSC_ADR=0xFF;
309 1 SSC_DAT=0x00;
310 1
311 1 //************ 3201的载波寄存器设置 **********//
312 1 EIE=0X01; // ( A9H 使能INT2中断(EX2=1)
313 1 IT2=1; // ( C8H ) 为边沿触发方式(IT2=1)
314 1
315 1 //串口通讯配置
316 1 TMOD = 0x21 ; // 设 T/C1 为定时方式2 设置为8位自装载计数器 T/C0 为定时方式 14
317 1 SCON=0x50; // 工作方式1
318 1
319 1 PCON=0X80; // 波特率加倍
320 1 TH1=0xf6;
321 1 TL1=0xf6; // 加倍设定波特率 9.6MHz ( PL3105按4800计算) 下数 F6H
322 1 TR1=1; // 启动定时器1
323 1
324 1 // 定时器0中断配置
325 1 TH0=0x63;
326 1 TL0=0xcc; // 定时 50 ms 一个定时中断
327 1 TR0 = 1; // 启动 T0 定时器
328 1 // 中断级别设置
329 1 IP=0x02; // 定时器 T0 中断为高级中断
330 1 EIP=1; // 外部中断2 为高级中断
331 1 // 中断允许设置
332 1 IE=0x82; // 允许ET0=1定时器 T0 中断; 开放中断
333 1 }
334 /**************************************************************************************
335 *
336 * FUNCTION: initsys_ref
337 *
338 * DESCRIPTION: 初始化重置函数,
339 * 进行系统初始化重置
340 *
341 * PARAMETERS: none
342 *
343 * RETURNED: none
344 *
345 *************************************************************************************/
346 void initsys_ref( void )
347 { // 载波设置重置
348 1 uchar data s1;
349 1 uchar data GOLD_KSAMI;
350 1
351 1 if ( EIE!=1 )
352 1 EIE=0X01; // ( A9H 使能INT2中断(EX2=1)
353 1 if ( IT2!=1 )
354 1 IT2=1; // ( C8H ) 为边沿触发方式(IT2=1)
355 1
356 1 SSC_ADR=0x02;
357 1 GOLD_KSAMI=SSC_DAT;
358 1 if ( GOLD_KSAMI!=0x1F )
359 1 {
360 2 SSC_ADR=0xFF;
361 2 SSC_DAT=0xFF;
362 2 SSC_ADR=0x02;
363 2 SSC_DAT=0x1F;
364 2 SSC_ADR=0xFF;
C51 COMPILER V7.06 3201 05/10/2007 10:43:22 PAGE 7
365 2 SSC_DAT=0x00;
366 2 }
367 1
368 1 // 串口设置重置
369 1 if ( TMOD!=0x21 )
370 1 TMOD = 0x21 ; // 设 T/C1 为定时方式2 设置为8位自装载计数器 T/C0 为定时方式 14
371 1 if ( PCON!=0x80 )
372 1 PCON=0X80; // 波特率加倍
373 1
374 1 s1=SCON;
375 1 s1=s1&0xf0;
376 1 if ( s1!=0x50 )
377 1 initsys ();
378 1
379 1 if ( TH1!=0xF6 )
380 1 TH1=0xF6;
381 1 if ( TR1!=1 )
382 1 TR1=1; // 启动定时器1
383 1 // 定时器0重置
384 1 if ( TR0!=1 )
385 1 TR0 = 1; // 启动 T0 定时器
386 1
387 1 // 中断设置重置
388 1 if ( IE!=0x82 )
389 1 IE=0x82;
390 1 if ( IP!=2 )
391 1 IP=2;
392 1 if ( EIP!=1 )
393 1 EIP=1; // 外部中断2 为高级中断
394 1 }
395 /**************************************************************************************
396 *
397 * FUNCTION: PLC_prog
398 *
399 * DESCRIPTION: 载波接收数据包后的处理函数
400 * 1. 进行数据包的校验和合法性判断
401 * 2. 点亮上传指示灯
402 * 3. 进行数据包的向上转发
403 * 4. 清com_buf[]
404 *
405 * PARAMETERS: in: PLC_Rxd_OK=1 ; R_T_buf_bak[]数据存入接收和数据
406 * out: none
407 *
408 *
409 * RETURNED: none
410 *
411 *************************************************************************************/
412 void PLC_prog ( void )
413 {
414 1 uchar data i;
415 1
416 1 if ( EIE!=0X01 ) EIE=0X01; // 先判断后再操作LXW2006-3-2 9:28
417 1
418 1 RS_TLED=0; // 串口发送指示灯亮
419 1 PLC_Rxd_OK=0; // 清载波接收好标志
420 1 COM_State=0;
421 1 COM_recv_pointer=0; // 停止串口接收
422 1
423 1 txdbyte ( 'D' );
424 1 txdbyte ( 'A' );
425 1 txdbyte ( 'T' ); //发送协议命令字
426 1 PLC_Rxd_tlen=PLC_Rxd_tlen+3; //加09.AF两个字节
C51 COMPILER V7.06 3201 05/10/2007 10:43:22 PAGE 8
427 1 txdbyte ( PLC_Rxd_tlen ); //发送长度
428 1 txdbyte ( 0x09 );
429 1 txdbyte ( 0xaf );
430 1 PLC_Rxd_tlen=PLC_Rxd_tlen-3; // 恢复数据体长度。
431 1 for ( i=0;i<=PLC_Rxd_tlen;i++ ) //
432 1 {
433 2 txdbyte ( R_T_buf_bak[i] );
434 2 WDI=0x9a; // not interrupt set the soft dog
435 2 }
436 1
437 1 PLC_Rxd_state=0;
438 1 PLC_Rxd_pointer=0;
439 1 PLC_Rxd_tlen=0;
440 1 RS_TLED=1; // 发送完毕串口发送指示灯灭
441 1
442 1 COM_State=8;
443 1
444 1 if ( EIE!=0X01 ) EIE=0x01; // 先判断后再操作lxw2006-3-2 9:30 ( A9H 使能INT2中断(EX2=1)
445 1 }
446 /**************************************************************************************
447 *
448 * FUNCTION: COM_Re_prog
449 *
450 * DESCRIPTION: 接收串口数据包并做载波转发处理
451 * 1. 点亮上传指示灯
452 *
453 * PARAMETERS: in: RI=1
454 * out: none
455 *
456 *
457 * RETURNED: none
458 *
459 *************************************************************************************/
460 void COM_Re_prog ( void )
461 {
462 1 if ( RI ) // 有串口下发命令处理
463 1 {
464 2 RI=0;
465 2 switch ( COM_State )
466 2 {
467 3 case 0: //接收初始态
468 3 if ( SBUF == 'S' )
469 3 {
470 4 RS_RLED=0;
471 4 COM_State=1;
472 4 COM_recv_pointer=1;
473 4 }
474 3 else
475 3 {
476 4 COM_State=0; COM_recv_pointer=0;
477 4 }
478 3 break;
479 3
480 3 case 1: //接收到第一字节准备接收第2个字节
481 3 if ( SBUF == 'N' )
482 3 {
483 4 COM_State=2; COM_recv_pointer=1;
484 4 }
485 3 else
486 3 {
487 4 COM_State=0; COM_recv_pointer=0;
488 4 }
C51 COMPILER V7.06 3201 05/10/2007 10:43:22 PAGE 9
489 3 break;
490 3
491 3 case 2:
492 3 if ( SBUF == 'D' )
493 3 { COM_State=3; COM_recv_pointer=1; }
494 3 else
495 3 { COM_State=0; COM_recv_pointer=0;}
496 3 break;
497 3
498 3 case 3: //接收串口数据长度
499 3 if ( COM_recv_pointer == 1 )
500 3 {
501 4 COM_State=4;
502 4 COM_recv_pointer=0;
503 4 COM_recv_len=SBUF;
504 4 if(COM_recv_len>100)
505 4 COM_State=0;
506 4 }
507 3 else
508 3 { COM_State=0; COM_recv_pointer=0; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?