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

📄 485mon.lst

📁 485通信程序
💻 LST
字号:
C51 COMPILER V7.50   485MON                                                                10/10/2007 10:43:45 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 485MON
OBJECT MODULE PLACED IN 485Mon.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 485Mon.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /****************************************/
   2          /* Copyright (c) 2005, 通信工程学院     */
   3          /* All rights reserved.                 */
   4          /****************************************/
   5          
   6          #include "485Mon.h"
   7          
   8          
   9          void main(void)
  10          {
  11   1              uchar type;
  12   1      
  13   1      /* 初始化 */
  14   1              init();
  15   1              
  16   1              while (1) 
  17   1              {
  18   2                      if (Recv_Data(&type)==0)                        // 接收帧错误或者地址不符合,丢弃
  19   2                              continue;
  20   2                      switch (type)
  21   2                      {
  22   3                              case ACTIVE:                            // 主机询问从机是否在位
  23   3                                      Send_Data(READY,0,StatusBuf);   // 发送READY指令        
  24   3                                      break;
  25   3                              case GETDATA:                           // 主机读设备请求
  26   3                                      Clr_StatusBuf();
  27   3                                      Get_Stat();                             // 数据采集函数
  28   3       //               Send_Data(SENDDATA,0,StatusBuf);
  29   3       //              Send_Data(SENDDATA,10,StatusBuf);  //statusBuf是缓存中采集到的数据
  30   3                                      Send_Data(SENDDATA,strlen(StatusBuf),StatusBuf);  //statusBuf是缓存中采集到的数据
  31   3                                      break;
  32   3                              default:
  33   3                                      break;                                  // 指令类型错误,丢弃当前帧
  34   3                      }
  35   2              }
  36   1      }
  37          
  38          /* 初始化 */
  39          void init(void)
  40          {
  41   1              //P1 = 0xff;
  42   1              //DevNo = (P1&0x00111111);                      // 读取本机设备号
  43   1         DevNo = 0xff;
  44   1      
  45   1              TMOD = 0x20;
  46   1              SCON = 0x50;
  47   1              TH1 = 0xfd;
  48   1              TL1 = 0xfd;
  49   1              TR1 = 1;
  50   1              PCON = 0x00;                                            // SMOD=0
  51   1              EA = 0;
  52   1                                                      
  53   1      }
  54          
  55          /* 接收数据帧函数,实际上接收的是主机的指令 */
C51 COMPILER V7.50   485MON                                                                10/10/2007 10:43:45 PAGE 2   

  56          bit Recv_Data(uchar *type)
  57          {
  58   1              uchar tmp,rCount,i;
  59   1              uchar r_buf[RECFRMMAXLEN];                      // 保存接收到的帧
  60   1              uchar Flag_RecvOver;                            // 一帧接收结束标志     
  61   1              uchar Flag_StartRec;                            // 一帧开始接收标志
  62   1              uchar CheckSum;                                         // 校验和
  63   1              uchar DataLen;                                          // 数据字节长度变量
  64   1                      
  65   1              /* 禁止发送,允许接收 */
  66   1              //DE = 0;
  67   1              //RE = 0;
  68   1      
  69   1              /* 接收一帧数据 */
  70   1              rCount = 0;
  71   1              Flag_StartRec = 0;
  72   1          Flag_RecvOver = 0;
  73   1              while (!Flag_RecvOver)
  74   1              {
  75   2                      RI = 0;                        //接收结束标志位
  76   2                      while (!RI);
  77   2                      tmp = SBUF;
  78   2                      RI=0;
  79   2      
  80   2                      /* 判断是否收到字符'$',其数值为0x24 ,第一个字符*/          
  81   2                      if ((!Flag_StartRec) && (tmp == 0x24))
  82   2                      {
  83   3                              Flag_StartRec = 1;      
  84   3                      }
  85   2      
  86   2                      if (Flag_StartRec) 
  87   2                      {
  88   3                              r_buf[rCount] = tmp;
  89   3                              rCount ++;              
  90   3                              
  91   3                              /* 判断是否收到字符'*',其数值为0x2A,根据接收的指令设置相应标志位,最后一位 */
  92   3                              if (tmp == 0x2A)
  93   3                                      Flag_RecvOver = 1;
  94   3                      }
  95   2      
  96   2                      if (rCount == RECFRMMAXLEN)             // 帧超长错误,返回0
  97   2                              return 0;
  98   2              }
  99   1              
 100   1              /* 计算校验和字节 */
 101   1              CheckSum = 0;
 102   1              DataLen = r_buf[3];
 103   1              for (i=0;i<3+DataLen;i++)
 104   1              {
 105   2                      CheckSum = CheckSum + r_buf[i+1];
 106   2              }
 107   1              
 108   1              /* 判断帧是否错误 */
 109   1              if (rCount<6)                                           // 帧过短错误,返回0,最短的指令帧为6个字节                                             
 110   1                      return 0;
 111   1              if (r_buf[1]!=DevNo)                            // 地址不符合,错误,返回0
 112   1                      return 0;
 113   1              if (r_buf[rCount-2]!=CheckSum)          // 倒数第二位,校验错误,返回0
 114   1              return 0;
 115   1      
 116   1              *type = r_buf[2];                                       // 第三位,获取指令类型
 117   1      
C51 COMPILER V7.50   485MON                                                                10/10/2007 10:43:45 PAGE 3   

 118   1              return 1;                                                       // 成功,返回1
 119   1      }
 120          
 121          /* 发送数据帧函数 */
 122          void Send_Data(uchar type,uchar len,uchar *buf)  //buf指向数据缓存器
 123          {
 124   1              uchar i,tmp;
 125   1              uchar CheckSum = 0;
 126   1              
 127   1              /* 允许发送,禁止接收 */
 128   1      //      DE = 1;
 129   1      //      RE = 1;
 130   1              
 131   1              /* 发送帧起始字节 */
 132   1              tmp = 0x24;
 133   1              Send(tmp);
 134   1              
 135   1              Send(DevNo);                                            // 发送地址字节,也即设备号
 136   1              CheckSum = CheckSum + DevNo;
 137   1       
 138   1              Send(type);                                                     // 发送类型字节
 139   1              CheckSum = CheckSum + type;
 140   1      
 141   1              Send(len);                                                      // 发送数据长度字节
 142   1              CheckSum = CheckSum + len;
 143   1       
 144   1              /* 发送数据 */
 145   1              for (i=0;i<len;i++)                     
 146   1              {
 147   2                      Send(*buf);
 148   2                      CheckSum = CheckSum + *buf;
 149   2                      buf++;
 150   2              }
 151   1              
 152   1              Send(CheckSum);                                         // 发送校验和字节
 153   1      
 154   1              /* 发送帧结束字节 */
 155   1              tmp = 0x2A;
 156   1              Send(tmp);
 157   1      }
 158          
 159          /* 采集数据函数经过简化处理,取固定的10个字节数据 */
 160          void Get_Stat(void)
 161          {
 162   1              StatusBuf[0]=DATA0;
 163   1              StatusBuf[1]=DATA1;
 164   1              StatusBuf[2]=DATA2;
 165   1              StatusBuf[3]=DATA3;
 166   1              StatusBuf[4]=DATA4;
 167   1              StatusBuf[5]=DATA5;
 168   1              StatusBuf[6]=DATA6;
 169   1              StatusBuf[7]=DATA7;
 170   1              StatusBuf[8]=DATA8;
 171   1              StatusBuf[9]=DATA9;
 172   1      }
 173          
 174          /* 发送单字节数据 */
 175          void Send(uchar m)
 176          {
 177   1              TI = 0;
 178   1              SBUF = m;
 179   1          while(!TI);
C51 COMPILER V7.50   485MON                                                                10/10/2007 10:43:45 PAGE 4   

 180   1              TI = 0; 
 181   1      }
 182          
 183          /* 清除设备状态信息缓冲区函数*/
 184          void Clr_StatusBuf(void)
 185          {
 186   1              uchar i;
 187   1              for (i=0;i<STATUSMAXLEN;i++)
 188   1                      StatusBuf[i] = 0;       
 189   1      }                       
 190          
 191          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    386    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11      29
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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