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

📄 uart.lst

📁 KEIL C上的门禁控制器源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN Uart.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Uart.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          ///////////////////////////////////////////////////////////////////////////////
   2          // 门禁终端与上位服务器通信
   3          // 门禁终端与上位服务器通信采用RS485总线方式连接,每台门禁终端分配固定设备
   4          // 地址。
   5          // 需要注意的是在处理串行通信的时候,可以关闭其它中断
   6          // idata=19
   7          ///////////////////////////////////////////////////////////////////////////////
   8          
   9          #include "Global.h"
  10          
  11          
  12          ///////////////////////////////////////////////////////////////////////////////
  13          // 内部存储区变量       0~128字节
  14          extern data uchar cur_time[15];                 // 系统当前时间显示存储区 XXXX年XX月XX日XX时XX分XX秒星期X
  15          
  16          extern data uchar pulse;                                // 蜂鸣
  17          extern data uint  time_out;                             // 通用超时定时器
  18          
  19          extern data uint  recv_ctr;                             // 接收数据起始指针
  20          extern data uint  trans_time;                   // 发送数据超时保护
  21          extern data uint  trans_ctr;                    // 发送数据指针
  22          extern data uint  trans_size;                   // 发送数据大小
  23          
  24          extern idata uint SOH_crt;                              // 数据包开始指针
  25          
  26          extern idata char  wieformat;                   // 韦根通信格式
  27          
  28          extern bdata bit maxtrans;                              // 大/小数据量传输状态
  29          extern idata uchar baudrate;                    // 波特率
  30          extern bdata bit comm_ok;                               // 通信状态
  31          extern idata uchar laddr;                               // 地址低字节ASC码
  32          extern idata uchar haddr;                               // 地址高字节ASC码
  33          extern idata uchar currecno;                    // 当前已读取的实时记录索引
  34          extern idata uchar sumrecno;                    // 所有实时记录索引
  35          
  36          extern data  uchar checksum;                    // 校验和
  37          extern data  uchar testchecksum;                // 接收到的校验和
  38          
  39          ///////////////////////////////////////////////////////////////////////////////
  40          // 外部存储区变量       256~1280字节
  41          extern xdata uchar SPIbuf[BUFSIZE];                     // SPI和串行通信缓冲区
  42          extern xdata uchar recv_buf[RCVBUFSIZE];        // 接收数据缓冲区
  43          extern xdata uchar trans_buf[TRANSBUFSIZE];     // 发送数据缓冲区
  44          extern xdata uchar RTrecord[MAX_REALREC_SIZE];  // 实时记录缓冲区
  45          
  46          void sendmessage(uchar message);                        // 发送信息
  47          void ClearRcvBuf();                                                     // 清接收缓冲区
  48          
  49          ///////////////////////////////////////////////////////////////////////////////
  50          // 中断4服务列程
  51          // 串行中断服务
  52          ///////////////////////////////////////////////////////////////////////////////
  53          void ser() interrupt 4
  54          {
  55   1              idata uchar c;
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 2   

  56   1      
  57   1              if(_testbit_(TI))                       // 检测发送完成位
  58   1              {
  59   2                      if(maxtrans)                            // 大数据量传输
  60   2                      {
  61   3                              trans_ctr++;                    // 发送指针下移
  62   3                              if(trans_ctr<trans_size)
  63   3                                      SBUF=SPIbuf[trans_ctr]; // 发送数据
  64   3                              else
  65   3                              {
  66   4                                      trans_ctr=0;
  67   4                                      trans_size=0;
  68   4                                      Dir=0;                          // 停止发送
  69   4                              }
  70   3                      }
  71   2                      else                                            // 小数据量传输
  72   2                      {
  73   3                              trans_ctr++;                    // 发送指针下移
  74   3                              if(trans_ctr<trans_size)
  75   3                                      SBUF=trans_buf[trans_ctr];      // 发送数据
  76   3                              else
  77   3                              {
  78   4                                      trans_ctr=0;
  79   4                                      trans_size=0;
  80   4                                      Dir=0;                          // 停止发送
  81   4                              }
  82   3                      }
  83   2              }
  84   1      
  85   1              if(_testbit_(RI))                       // 检测接收完成位
  86   1              {
  87   2                      c=SBUF;
  88   2                      if(c!=0x00)
  89   2                      {
  90   3                              if(maxtrans)                    // 大数据量传输
  91   3                              {
  92   4                                      SPIbuf[recv_ctr]=c;
  93   4                                      recv_ctr++;
  94   4                                      if(recv_ctr>BUFSIZE)
  95   4                                              recv_ctr=0;
  96   4                              }
  97   3                              else                                    // 小数据量传输
  98   3                              {
  99   4                                      recv_buf[recv_ctr]=c;
 100   4                                      recv_ctr++;
 101   4                                      if(recv_ctr>RCVBUFSIZE)
 102   4                                              recv_ctr=0;
 103   4                              }
 104   3                      }
 105   2              }
 106   1      }
 107          
 108          ///////////////////////////////////////////////////////////////////////////////
 109          // 检查接收缓冲区是否有完整的数据包
 110          // 如果有返回成功,如果数据包不完整可能数据有部分丢失或者没有完整的数据返回失败
 111          // 检查SOH和EOT来判断
 112          ///////////////////////////////////////////////////////////////////////////////
 113          bit checkmessage()
 114          {
 115   1              bdata bit  SOHfound;
 116   1              bdata bit  EOTfound;
 117   1              idata uchar temp;
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 3   

 118   1              idata uint i;
 119   1      
 120   1              SOHfound=FALSE;
 121   1              EOTfound=FALSE;
 122   1                      
 123   1              if(recv_ctr==0)
 124   1                      return FALSE;                   // 缓冲区中无数据
 125   1      
 126   1              if(maxtrans)
 127   1              {
 128   2                      if(recv_ctr>BUFSIZE)    // 接收缓冲区溢出
 129   2                      {
 130   3                              ClearRcvBuf();
 131   3                              return FALSE;
 132   3                      }
 133   2              }
 134   1              else
 135   1              {
 136   2                      if(recv_ctr>RCVBUFSIZE) // 接收缓冲区溢出
 137   2                      {
 138   3                              ClearRcvBuf();
 139   3                              return FALSE;
 140   3                      }
 141   2              }
 142   1      
 143   1              for(i=0; i<recv_ctr; i++)
 144   1              {
 145   2                      if(maxtrans)
 146   2                              temp=SPIbuf[i];
 147   2                      else
 148   2                              temp=recv_buf[i];
 149   2      
 150   2                      if(temp==SOH)
 151   2                      {
 152   3                              SOHfound=TRUE;          // 发现SOH
 153   3                              SOH_crt=i;
 154   3                      }
 155   2                      if(temp==EOT)
 156   2                              EOTfound=TRUE;          // 发现 EOT
 157   2              }
 158   1      
 159   1              if(SOHfound&&EOTfound)
 160   1              {
 161   2                      COMDISABLE;                             // 不允许再接收数据
 162   2                      return TRUE;                    // 接收到完整的数据包
 163   2              }
 164   1      
 165   1              return FALSE;
 166   1      }
 167          
 168          ///////////////////////////////////////////////////////////////////////////////
 169          // 发送信息
 170          ///////////////////////////////////////////////////////////////////////////////
 171          void sendmessage(uchar message)
 172          {
 173   1              idata uchar i;
 174   1              idata uchar temp;
 175   1      
 176   1              if(maxtrans)                    // 大模式数据传输
 177   1              {
 178   2                      SPIbuf[0]=SOH;
 179   2                      SPIbuf[1]=haddr;        // 源地址
C51 COMPILER V7.07   UART                                                                  09/14/2005 15:20:57 PAGE 4   

 180   2                      SPIbuf[2]=laddr;
 181   2                      SPIbuf[3]='0';          // 目标地址
 182   2                      SPIbuf[4]='0';
 183   2                      SPIbuf[5]='0';          // 信息号
 184   2                      SPIbuf[6]=message;      // ACK/NAK

⌨️ 快捷键说明

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