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

📄 3201demo.lst

📁 基于PL3201芯片的单相复费率载波通信多功能电表应用程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 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 + -