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

📄 main.lst

📁 此源码为商用的电力抄表系统的从机端源程序。通过电力载波模块
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.09   MAIN                                                                  01/12/2007 09:29:48 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c ROM(COMPACT) OPTIMIZE(9,SPEED) BROWSE MODP2 DEBUG OBJECTEXTEND PREPR
                    -INT

line level    source

   1          /* //////////////////////////////////////////////////////////////////////////
   2          // main.c  - source file for lme2200 AMR
   3          // 
   4          //   家电智能控制统一灯端程序(根据UPLM2200 API协议设定)
   5          // Copyright 2006, Leaguer MicroElectronics Co., Ltd
   6          // www.leaguerme.com
   7          //
   8          //              软件修改说明在页底,敬请留意
   9          //////////////////////////////////////////////////////////////////////////// */
  10          #include <REG922.H>
  11          
  12          #include "timer.h"
  13          #include "sart.h"
  14          #include "plc.h"
  15          #include "wr_flash.h"
  16          
  17          
  18          #define uint unsigned int
  19          #define uchar unsigned char
  20          
  21          /*============================版本号========================================*/
  22          #define Version1       0x01       //版本号1
  23          #define Version2       0x01       //版本号2
  24          /*=============================================================================*/
  25          
  26          #define AMR_OS_C                0 //本协议的控制字在第一位
  27          #define AMR_OS_L                5 //本协议的长度值在第五位 
  28          
  29          #define S2400          40
  30          #define S1200          50
  31          #define  S600          80
  32          
  33          uchar code ADDR[4]; 
  34          uchar plc_frame[18]; 
  35          uchar code mcu_pc[5]= {0xfe,0xfe,0xfe,0xfe,0x68};
  36          uchar code tx_buf[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x1
             -1,0x12};
  37          uchar code master = 0;
  38          
  39          //bit auto_tx;//上电发送控制       extern 
  40          //bit auto_tx;//自动控制与PC控制标示
  41          //bit Rx_bit; //主机接收控制
  42          //bit master_slave;  // 主从
  43          extern idata uchar amr_frame[];  // AMR frame buffer
  44          extern idata uchar wet;
  45          
  46          uchar CRC;//电力网收到CRC的值 
  47          extern bit timeout_40s;
  48          extern bit delay_tx;
  49          extern bit packet_recved;
  50          extern bit packet_recving;
  51          extern bit t1_enable;
  52          bit switd_s;   //开关确认
  53          bit switd_T1;  //开关-开标示
C51 COMPILER V7.09   MAIN                                                                  01/12/2007 09:29:48 PAGE 2   

  54          bit switd_T2;  //开关-关标示
  55          
  56          bit reply; //数据返回
  57          bit adss_ok;//本地址正确标示
  58          bit public_addr; //公用地址标示
  59          bit CRC_switch;//CRC开关
  60          bit addr_wr;//写地址标示
  61          
  62          sbit tai    = P0^4;//   灯开关控制端
  63          sbit switd =  P0^5;  //双联开关
  64                                                   
  65          void proc_amr_frame(uchar frame[]);
  66          void amr_send_frame(uchar buf[]);
  67          void return_inf(uchar frame,uchar inf_buf[],uchar dat);
  68          void uart_tx_mode(uchar i_buf[]);
  69          void rx_return(bit y,uchar R_data[]);
  70          int plc_send(uchar frame[]);
  71          void return_data();
  72          void adss_crc(uchar buf[]);//地址校验
  73          void write_addr (bit y,uchar frame[]);//写地址功能
  74          void processing_unit(uchar frame[]);//数据接收处理
  75          //void w_flsh(uchar dat,uchar dat1);
  76          
  77          /*=============================================================================*/
  78          /*                                                                主程序                                                                           */
  79          /*=============================================================================*/
  80          main() {
  81   1      
  82   1        uchar l; 
  83   1        uchar buf[2];        
  84   1        P0M1 = 0x80;    // 这是为第二版电力载波的小模块,发射部分是安捷伦的810方案  -IO口的定义
  85   1        P0M2 = 0x41;
  86   1        P1M1 = 0x7c;
  87   1        P1M2 = 0x80; 
  88   1      
  89   1        Rxok   = 0;
  90   1        reply  = 0;
  91   1        adss_ok = 0;
  92   1        public_addr = 0;//地址标示清零 
  93   1        timer0_init(242, 10); // 1ms * 10 = 10ms
  94   1       // plc_init(SMOD_SYNC); 
  95   1        uart_init(); //<--------------串口初始化 
  96   1        //relay_init();
  97   1        wdt_init();//<----------------看门狗初始化
  98   1        clr_wdt();
  99   1        plc_power_on();
 100   1      
 101   1        for(l = 0;l < 18;l ++)
 102   1        plc_frame[l]  =  0;
 103   1        clr_wdt();  
 104   1        timeout_40s = 0;
 105   1        setup_t2(4000, timeout_t2); //原10S
 106   1      
 107   1        setup_t1(30, disable_t1); //定时LED为300ms
 108   1        plc_getframe(plc_frame);      //查收8300的数据
 109   1       
 110   1        FLASH_ReadNByte(0x1c00,buf, 2);
 111   1        if(buf[0]!= 0){
 112   2        write_reg(REG_WR_33, buf[0]);
 113   2        write_reg(REG_WR_3c, buf[1]);
 114   2        }
 115   1       // FLASH_ReadNByte(0x1b05,buf, 2);  
C51 COMPILER V7.09   MAIN                                                                  01/12/2007 09:29:48 PAGE 3   

 116   1       // master_slave  = (bit)buf[0];
 117   1       
 118   1      
 119   1       while (1) {   // the forever loop
 120   2                      
 121   2                        if (uart_recved()) {  // AMR frame recved from meter
 122   3                             disable_t2();//<-------------------------------关40秒定时                          
 123   3                                if (recv_amr_frame()) { //uart_sendblock(amr_frame,4);
 124   4                                  clr_wdt(); 
 125   4                     // uart_sendblock(amr_frame, amr_frame[5]+6); //串口送至PC  
 126   4                                  proc_amr_frame(amr_frame);  //最多26个字节
 127   4                             clr_wdt(); 
 128   4                                }
 129   3                               }
 130   2      
 131   2                        if (packet_recving) {//收到电力线上的数据
 132   3                              disable_t2();//<-------------------------------关40秒定时  
 133   3                               while (!plc_recved()) { clr_wdt();}// wait until packet is recved
 134   3                                 packet_recving = 0; // reset it                                 
 135   3                             plc_getframe(plc_frame);// read packet data
 136   3                             clr_wdt();
 137   3                                 setup_t4(40, timeout_t4);delay_tx = 1; /*-延迟返回初始化-不可小于35*/
 138   3                     CRC = read_crc(); //取CRC的值                       
 139   3                                 if (CRC == 0) {     // check CRC21                       
 140   4                                 Rxok = 0; clr_wdt();                
 141   4                             t1_enable = 1;
 142   4                                 adss_crc(plc_frame);          //LED定时300ms
 143   4                     if((adss_ok==1)|| public_addr){;//地址校验)//地址是否对
 144   5                                 //rx_return(1,plc_frame);    //数据发入串口
 145   5                     processing_unit(plc_frame); 
 146   5                                 //while(delay_tx)clr_wdt(); /*-延迟返回------*/
 147   5                     //Rx_Command_Reply(plc_frame[0]);//测试回复控制
 148   5                     if(reply){                          
 149   6                                 Remote_Replies(plc_frame);//测试回复
 150   6                                 clr_wdt(); 
 151   6                                 }                      
 152   5                             }}
 153   3                                 if(CRC_switch){ //CRC开关
 154   4                                      rx_return(0,plc_frame); //数据发入串口 
 155   4                                              clr_wdt(); /*-延迟返回------*/
 156   4                                 }
 157   3                    adss_ok = 0;public_addr = 0;//地址标示清零
 158   3                                setup_t2(4000, timeout_t2); //40S      
 159   3                              }
 160   2      
 161   2               /********************************************************/
 162   2               if(switd  == !switd_T1){    //switd - on
 163   3                     switd_T1  = 1;
 164   3                     if(switd_T1 == switd_T2){
 165   4                        switd_T2 = 0;
 166   4                        switd_s = 1; //开关确认 
 167   4                     }
 168   3                 }
 169   2               if(!switd  == !switd_T2){    //switd - off
 170   3                     switd_T2  = 1;
 171   3                     if(switd_T2 == switd_T1){
 172   4                        switd_T1 = 0;
 173   4                        switd_s = 1; //开关确认
 174   4                     }
 175   3                  }
 176   2                if(switd_s){
 177   3                  switd_s = 0;
C51 COMPILER V7.09   MAIN                                                                  01/12/2007 09:29:48 PAGE 4   

 178   3                  addr_wr = ~addr_wr;  //写地址
 179   3                  tai  = ~tai; //灯的开关
 180   3                }
 181   2               /********************************************************/
 182   2      
 183   2                        if (timeout_40s)// Auto thres adjustment
 184   2                           {  
 185   3                            thres_adjust();
 186   3                            packet_recved = 0; // reset it      
 187   3                              }
 188   2                      
 189   2                          if(~t1_enable)Rxok   = 1;  
 190   2                            
 191   2                          clr_wdt();
 192   2                           plc_getframe(plc_frame);  
 193   2                          clr_wdt();
 194   2              }
 195   1      }
 196          
 197          /*=============================================================================*/
 198          /*=============================================================================*/
 199           
 200          // Process the received AMR message/cmd from meter
 201          /*=============================================================================*/
 202          
 203          void proc_amr_frame(uchar frame[])
 204          {  
 205   1         uchar m_buf[2];
 206   1         uchar contror_me;//B7B6  控制字 
 207   1         uchar command;   //B5~B0 命令字
 208   1         contror_me = (frame[AMR_OS_C] & 0xc0)>>6; //B7B6  控制字 
 209   1         command    = frame[AMR_OS_C] & 0x3f; //B5~B0 命令字
 210   1      
 211   1         switch (contror_me){
 212   2               Rxok   = 0;
 213   2              
 214   2              case 0x00:{ uart_tx_mode(frame);}break;//发送到远方模块
 215   2      
 216   2                  case 0x01:{//本地设置控制
 217   3       
 218   3                    switch (command){
 219   4                            case 0x01:{if(frame[AMR_OS_L] == 0){m_buf[0] = Version1;m_buf[1] = Version2;return_i
             -nf(0x61,m_buf,2);}}break;//读版本号
 220   4      
 221   4                            case 0x02:{if(frame[AMR_OS_L] == 0){m_buf[0] = read_reg(REG_RD_F3);return_inf(0x62,m
             -_buf,1);}}break;//读速率信息
 222   4      
 223   4                            case 0x03:{ 
 224   5                              if(frame[AMR_OS_L] == 1){  
 225   6                               switch (frame[AMR_OS_L + 1] ){
 226   7      
 227   7                                            case 0x01:{ w_flsh(0x01,0x04);}break; //设置速率2400bps
 228   7                                                                                       
 229   7                                                    case 0x02:{ w_flsh(0x02,0x02);}break;  //设置速率1200bps
 230   7      
 231   7                                                    case 0x04:{ w_flsh(0x04,0x01);}break;  //设置速率 600bps                                          
 232   7                                               }
 233   6                               m_buf[0] = read_reg(REG_RD_F3);return_inf(0x62,m_buf,1);}}break;//读速率信息     
 234   4      
 235   4                            case 0x04:{if(frame[AMR_OS_L] == 0)CRC_switch = 1;}break;//读设置接收数据CRC报出
 236   4                    
 237   4                            case 0x05:{if(frame[AMR_OS_L] == 0)CRC_switch = 0;}break;//读设置接收数据CRC不报出
C51 COMPILER V7.09   MAIN                                                                  01/12/2007 09:29:48 PAGE 5   

 238   4                                                
 239   4                            case 0x06:{;}break;
 240   4      
 241   4                                                case 0x07:{;}break;
 242   4      
 243   4                                                case 0x08:{if(frame[AMR_OS_L] == 0)sync_sendchar(0x7e);}break;
 244   4      
 245   4                            case 0x3f:{write_addr (0,frame);}break;
 246   4                    }
 247   3                 }break;
 248   2      
 249   2               case 0x02:{ uart_tx_mode(frame);}break;//远程设置控制//发送到远方模块
 250   2      
 251   2               case 0x03:{;}break;
 252   2              
 253   2               
 254   2                   

⌨️ 快捷键说明

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