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 + -
显示快捷键?