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