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

📄 485mon.lst

📁 包含电路图及c语言程序
💻 LST
字号:
C51 COMPILER V7.02b   485MON                                                               12/10/2005 21:23:08 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE 485MON
OBJECT MODULE PLACED IN 485Mon.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE 485Mon.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

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

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

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

 180          void Clr_StatusBuf(void)
 181          {
 182   1              uchar i;
 183   1              for (i=0;i<STATUSMAXLEN;i++)
 184   1                      StatusBuf[i] = 0;       
 185   1      }                       
 186          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    400    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     10    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      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 + -