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

📄 3201.lst

📁 基于PL3201芯片的单相复费率载波通信多功能电表应用程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   3201                                                                  05/10/2007 10:43:22 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 3201
OBJECT MODULE PLACED IN 3201.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 3201.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          
   3          #include "PL3200.h"
   4          #define LIMIT_3105    0x30                                // lxw载波序列捕获门限
   5          #define LIMIT_3200    0x70                                // lxw载波序列捕获门限
   6          
   7          #define uchar unsigned char
   8          #define uint  unsigned int
   9          
  10          //I/O 口设置
  11          sbit   RS_TLED  = P0^3;                 // 串口发送指示灯D3
  12          sbit   RS_RLED  = P0^4;             // 串口接收指示灯D4
  13          sbit   PLC_TLED = P0^5;                   // 载波发送指示灯D5
  14          sbit   PLC_RLED = P1^2;                           // 载波接收指示灯D6
  15          
  16          sbit   FUNC_LED = P0^2;               // 载波通讯方式,亮:3200模式;灭:3105模式D2
  17          
  18          sbit   function = P1^3;            // 载波通讯方式,0:3200模式;1:3105模式D12
  19          
  20          sbit     PSK_OUT        = P3^7;                                                 // 
  21          sbit     Rxd_p30        = P3^0;                                                 // 
  22          sbit     Txd_p31        = P3^1;                                                 // 
  23          
  24          // 全局变量设置
  25          uchar  data              function_now;                          // 当前的通讯方式,0:3200方式。0xff:为3105模式
  26          uchar  data              function_flage;                        // time = 6 sec
  27          
  28          uchar  data    COM_recv_len;        // 串口接收数据长度
  29          uchar  data    COM_State;                                               // the state of com receive 
  30          uchar  data    COM_recv_pointer;    // 表示串口接收控制变量
  31          uchar  data    COM_send_timer;      // 延时时间变量
  32          
  33          uchar  data    PLC_Rxd_pointer;         // 载波接收过程中的字节数
  34          uchar  data    PLC_Rxd_tlen;            // PLC 接收total len
  35          uchar  bdata   PLC_data;            // 发送字节缓冲
  36          uchar  data    PLC_send_pointer;    // 载波发送字节计数
  37          uchar  data    PLC_timer;           // 载波发送延时计数器
  38          uchar  data    PLC_total_len;       // 载波发送字节长度+8
  39          uchar  data    PLC_Rxd_timer;                   // 载波发送延时时间变量
  40          uchar  data    PLC_Rxd_tdata;                           // PLC_recieve cusion
  41          
  42          uchar  data    WDI;                 // 软狗变量
  43          
  44          // 位变量
  45          bit    bdata   PLC_Rxd_flag;            // 载波有接收标志
  46          bit    bdata   PLC_Rxd_state;           // 载波接收控制变量
  47          bit    bdata   PLC_Rxd_OK;              // 载波接收完成标志
  48          bit    bdata   PLC_sending;         // 载波正在发送标志
  49          
  50          uchar  xdata   PLC_recv_buf[250];   // 载波接收缓冲区
  51          uchar  xdata   COM_recv_buf[250];   // 串口接收缓冲区
  52          
  53          uchar  xdata   R_T_buf_bak[250];    // 通讯数据备份
  54          
  55          /**************************************************************************************
C51 COMPILER V7.06   3201                                                                  05/10/2007 10:43:22 PAGE 2   

  56           *
  57           * FUNCTION:    timeint0
  58           *
  59           * DESCRIPTION: 定时器0中断程序; 
  60           *                                                      50 ms 发生一次中断
  61           *                                                      对延时变量进行减1处理
  62           *
  63           * PARAMETERS:  none
  64           *
  65           * RETURNED:    none
  66           *************************************************************************************/
  67          void  timeint0 ( void ) interrupt 1
  68          {
  69   1         if ( COM_send_timer!=0 )
  70   1         {
  71   2            COM_send_timer--;             // 串口发送延时
  72   2         }
  73   1      
  74   1         if ( PLC_Rxd_timer>0 )
  75   1         {
  76   2            PLC_Rxd_timer--;
  77   2         }
  78   1         else
  79   1         {
  80   2            PLC_Rxd_timer=0;
  81   2            PLC_RLED=1;                                                                                       // turn off the lamp of receiving 
  82   2            PLC_Rxd_state=0;                                                          // resume receive state
  83   2         }
  84   1         
  85   1         if ( PLC_timer>0 )                                                                   //增加载波发送延时控制lxw2006-3-2
  86   1                      PLC_timer--;
  87   1         
  88   1         if ( function_flage ) function_flage--;
  89   1         else
  90   1         {
  91   2               function_flage=10;
  92   2                 if ( function )                                                                                      //载波方式管脚判断
  93   2                      function_now = function_now *2 + 1;     //function_now=0xff为3105方式lxw2006-2-10
  94   2                 else
  95   2                      function_now = function_now *2;                 //function_now=0为3200方式lxw 2006-2-10
  96   2         }
  97   1         
  98   1         TH0=0x63;                                            // 置定时器计数  50ms 中断一次 ( 12MHz )
  99   1         TL0=0xcc;
 100   1      
 101   1         if ( WDI == 0x9a )
 102   1         {
 103   2            WDT_RST=0xa1;                                     // 清看门狗
 104   2            WDI=0;
 105   2         }
 106   1      }
 107          /**************************************************************************************
 108           *
 109           * FUNCTION:    txdbyte
 110           *
 111           * DESCRIPTION: 一字节串口发送函数
 112           *
 113           * PARAMETERS:
 114           *              in:  dachar——要发送的1字节数据
 115           *              out: none
 116           *
 117           *
C51 COMPILER V7.06   3201                                                                  05/10/2007 10:43:22 PAGE 3   

 118           * RETURNED:    none
 119           *
 120           *************************************************************************************/
 121          void txdbyte ( uchar dachar )          // 单片机串口发送
 122          {
 123   1         SBUF=dachar;
 124   1         COM_send_timer=10;                    // 500毫秒钟发送不成功退出
 125   1      
 126   1         while ( !TI )
 127   1         {
 128   2            if ( COM_send_timer == 0 )
 129   2              break;
 130   2         }
 131   1         TI=0;
 132   1      }
 133          /**************************************************************************************
 134           *
 135           * FUNCTION:    PLC_int
 136           *
 137           * DESCRIPTION: 载波中断收、发程序
 138           *
 139           * PARAMETERS:
 140           *
 141           *              out:  PLC_Rxd_OK=1 载波接收成功  
 142           *                                                                              R_T_buf_bak[]  载波接收成功的数据
 143           *
 144           * RETURNED:    none
 145           *************************************************************************************/
 146          void  PLC_int ( void ) interrupt 7
 147          {                                             
 148   1         uchar data i;
 149   1         uchar  data state;                           // 载波通讯状态
 150   1               uchar data SSC_adr_bak;
 151   1               
 152   1               SSC_adr_bak=SSC_ADR;                                                                   //PRTECT
 153   1         SSC_ADR=0x00;                                //选择载波状态寄存器
 154   1         
 155   1         state= SSC_DAT;
 156   1      //   if ( ( state&0x80 ) == 0x0 )
 157   1      //      return;
 158   1         if ( ( state&0x01 ) == 1 )              //载波发送状态
 159   1         { // 载波发送
 160   2          if ( ( PLC_send_pointer < PLC_total_len ) &&
 161   2                        ( PLC_send_pointer < 240 ) )
 162   2          {
 163   3             SSC_BUF=R_T_buf_bak[PLC_send_pointer];                  //发送下一个字节
 164   3             PLC_send_pointer+=1;
 165   3          }
 166   2          else
 167   2          {  //发送完成
 168   3            PLC_sending=0;                    // 清正在发送标志
 169   3            PLC_data=0;
 170   3            PLC_TLED=1;                               // 发送指示灯灭
 171   3          }
 172   2        }
 173   1        else
 174   1        { // 载波接收
 175   2              PLC_Rxd_timer=20;                       // 最大字节接收延时时间为1S
 176   2          if ( ( state&0x04 ) == 0x04 )     //如果接收的是祯头标志
 177   2          {
 178   3            if ( PLC_Rxd_state == 0 )       //如果处于等待接收状态
 179   3            {
C51 COMPILER V7.06   3201                                                                  05/10/2007 10:43:22 PAGE 4   

 180   4               PLC_Rxd_tdata=SSC_BUF;                         //接收第一个字节,并准备接收后面的字节
 181   4               PLC_Rxd_tlen=PLC_Rxd_tdata;
 182   4               PLC_recv_buf[0]=PLC_Rxd_tdata;
 183   4               PLC_Rxd_pointer=1;                                             //lxw2006-3-2 17:07
 184   4               //PLC_Rxd_tlen =60;
 185   4               PLC_Rxd_state=1;
 186   4               PLC_RLED=0;                                                                    //接收指示灯亮
 187   4            }
 188   3            else                                                                                                              // translate to rec
 189   3            {         
 190   4              PLC_Rxd_state=0;
 191   4              SSC_ADR=0X0;                    
 192   4              SSC_DAT=0X0;
 193   4            }
 194   3          }
 195   2          else
 196   2          {
 197   3            if ( PLC_Rxd_state == 1 )       // 如果已经接收了祯头,继续接收后续字节
 198   3            {
 199   4              PLC_Rxd_tdata=SSC_BUF;
 200   4              PLC_recv_buf[PLC_Rxd_pointer]=PLC_Rxd_tdata;
 201   4      
 202   4           /*   if ( PLC_Rxd_pointer == 0x04 ) // 接收到了载波字节个数
 203   4              {
 204   4                 PLC_Rxd_tlen=PLC_Rxd_tdata+7;               // 加7的意思是3个地址码+1个控制码+1个长度码+2个校验
             -码
 205   4                 if ( PLC_Rxd_tlen>100 )
 206   4                    PLC_Rxd_tlen=100;                         // 接收字节长度限制
 207   4              }*/
 208   4      
 209   4              PLC_Rxd_pointer+=1;
 210   4              if ( PLC_Rxd_pointer>PLC_Rxd_tlen )
 211   4              {
 212   5                 PLC_Rxd_OK=1;
 213   5                 PLC_RLED=1;                                                  //接收完毕灯灭
 214   5                 PLC_Rxd_state=0;
 215   5                 for ( i=0 ; i< ( PLC_Rxd_tlen+1 ) ; i++ )
 216   5                 {
 217   6                    R_T_buf_bak[i]=PLC_recv_buf[i];
 218   6                 }           
 219   5                 SSC_ADR=0X0;                                                 // translate to rec
 220   5                 SSC_DAT=0X0;
 221   5              }
 222   4            }
 223   3            else                                                                                                      // translate to rec
 224   3            {
 225   4              PLC_Rxd_state=0;
 226   4              SSC_ADR=0X0;                    
 227   4              SSC_DAT=0X0;
 228   4            }
 229   3          }
 230   2        }
 231   1        SSC_ADR=SSC_adr_bak;
 232   1      }
 233          /**************************************************************************************
 234           *
 235           * FUNCTION:    set_PLC_3200
 236           *
 237           * DESCRIPTION: set the PLC function of pl3201
 238           *
 239           * PARAMETERS:  none
 240           *              
C51 COMPILER V7.06   3201                                                                  05/10/2007 10:43:22 PAGE 5   

 241           * RETURNED:   none
 242           * EDITION:              V1.0
 243           *************************************************************************************/
 244          void set_PLC_3200 (  )
 245          {
 246   1               SSC_ADR=0XFF;        // 2005.11.29 LXW
 247   1               SSC_DAT=0XFF;        // 禁止写保护
 248   1      
 249   1               SSC_ADR=0x03;        // 选择3201载波通讯控制寄存器3    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -