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

📄 uartcom.lst

📁 51实战工程级源码
💻 LST
字号:
C51 COMPILER V9.02   UARTCOM                                                               11/08/2012 21:34:06 PAGE 1   


C51 COMPILER V9.02, COMPILATION OF MODULE UARTCOM
OBJECT MODULE PLACED IN ..\output\UartCom.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\source\UartCom.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(..\ou
                    -tput\UartCom.lst) OBJECT(..\output\UartCom.obj)

line level    source

   1          /*
   2          **********************************************************************************************************
             -***
   3          *                                                Kingst-51
   4          *                                        Development board samples
   5          *
   6          *                                 (c) Copyright 2009-2012, Kingst Studio
   7          *                                           All Rights Reserved
   8          *
   9          *                                          http://www.kingst.org
  10          * 文件名:UartCom.c
  11          * 描  述:串口通信驱动文件
  12          * 版本号:1.0.0
  13          * 备  注:本驱动提供可按数据块操作的串口写入和读取功能函数,
  14          *         并按照设定的超时时间,自动判断是否接收完一帧数据,在接收完时设置状态标志
  15          **********************************************************************************************************
             -***
  16          */
  17          
  18          #define _UART_COM_C
  19          #include "config.h"
  20          #include "main.h"
  21          #include "UartCom.h"
  22          
  23          
  24          /*
  25          ********************************************************************************
  26          * ----------------------- Local defines  ---------------------------------------
  27          ********************************************************************************
  28          */
  29          /* 接收、发送缓冲区容量设置(最大不能超过126) */
  30          #define RX_BUFF_SIZE    50
  31          #define TX_BUFF_SIZE    30
  32          
  33          
  34          /* 帧间隔设定,即超过此时间时认定为一帧数据传输结束 */
  35          #define FRAME_SPACE_TIME    50  //单位ms
  36          
  37          
  38          /*
  39          ********************************************************************************
  40          * ----------------------- Local variables  -------------------------------------
  41          ********************************************************************************
  42          */
  43          /* 通信状态控制 */
  44          typedef struct {
  45              int8  rxbtm;
  46              int8  rxcnt;
  47              int8  txbtm;
  48              int8  txtop;
  49          } sComSta;
  50          static sComSta ComSta;
  51          static uint8 xdata RxBuff[RX_BUFF_SIZE];
  52          static uint8 xdata TxBuff[TX_BUFF_SIZE];
C51 COMPILER V9.02   UARTCOM                                                               11/08/2012 21:34:06 PAGE 2   

  53          
  54          
  55          /*
  56          ********************************************************************************
  57          * ----------------------- Globle variables  ------------------------------------
  58          ********************************************************************************
  59          */
  60          eUartRxSta UartRxSta = RX_NONE; //串口接收状态
  61          
  62          
  63          /*
  64          ***************************************************************************************************
  65          * ---------------------------------- Source codes  ------------------------------------------------
  66          ***************************************************************************************************
  67          */
  68          
  69          /*
  70          * 函数名:UartComInit
  71          * 描  述:初始化串口通信配置
  72          */
  73          void UartComInit(void)
  74          {
  75   1              /* 配置T1为波特率发生器 */
  76   1          TMOD &= 0x0F;
  77   1          TMOD |= 0x20;
  78   1              TH1 = 244; //波特率2400,计算公式如下:
  79   1              TL1 = 244; //256 - 时钟频率/(12*32*波特率)
  80   1              ET1 = 0;
  81   1              
  82   1              /* 配置串口工作模式 */
  83   1              SCON = 0x50;
  84   1              TR1 = 1;
  85   1              ES = 1;
  86   1      }
  87          
  88          
  89          /*
  90          * 函数名:UartWrite
  91          * 描  述:UART发送函数,向缓冲区写入指定长度的数据,并启动发送
  92          * 输  入:buff - 待写入数据块的指针
  93          *         len  - 待写入数据块的长度
  94          * 输  出:返回值 - 实际写入的数据长度
  95          */
  96          int8 UartWrite(const void *buff, int8 len)
  97          {
  98   1          int8 i, end;
  99   1          const uint8 *src;
 100   1      
 101   1          /* 获取实际可写入长度 */
 102   1          EA = 0;
 103   1          i = ComSta.txtop - ComSta.txbtm;
 104   1          EA = 1;
 105   1          if (i < 0) {
 106   2              i += TX_BUFF_SIZE;
 107   2          }
 108   1          i = TX_BUFF_SIZE - i;
 109   1          if (len > i) {
 110   2              return 0;
 111   2          }
 112   1      
 113   1          /* 拷贝数据到缓冲区中 */
 114   1          src = (const uint8 *)buff;
C51 COMPILER V9.02   UARTCOM                                                               11/08/2012 21:34:06 PAGE 3   

 115   1          i = ComSta.txtop;
 116   1          end = i + len;
 117   1          if (end < TX_BUFF_SIZE) {
 118   2              for (; i<end; i++) {
 119   3                  TxBuff[i] = *src++;
 120   3              }
 121   2          }
 122   1          else {
 123   2              for (; i<TX_BUFF_SIZE; i++) {
 124   3                  TxBuff[i] = *src++;
 125   3              }
 126   2              end -= TX_BUFF_SIZE;
 127   2              for (i=0; i<end; i++) {
 128   3                  TxBuff[i] = *src++;
 129   3              }
 130   2          }
 131   1      
 132   1          /* 修改缓冲区指向信息 */
 133   1          EA = 0;
 134   1          if (ComSta.txbtm == ComSta.txtop) {
 135   2              TI = 1;
 136   2          }
 137   1          ComSta.txtop = end;
 138   1          EA = 1;
 139   1      
 140   1          return len;
 141   1      }
 142          
 143          /*
 144          * 函数名:UartRead
 145          * 描  述:UART接收缓冲区读取函数,读取指定长度的数据
 146          * 输  出:在指针上输出数据,返回实际读到的数据长度,错误时返回-1
 147          * 输  入:buff - 数据读取的接收指针
 148          *         len  - 读取的数据块长度(-1为全部读出)
 149          * 输  出:buff - 在此指针上输出读到的数据
 150          *         返回值 - 实际读到的数据长度
 151          */
 152          int8 UartRead(void *buff, int8 len)
 153          {
 154   1          int8 i, end;
 155   1          uint8 *dest;
 156   1      
 157   1          /* 获取实际可读取长度 */
 158   1          EA = 0;
 159   1          if ((len>ComSta.rxcnt) || (len<0)) {
 160   2              len = ComSta.rxcnt;
 161   2          }
 162   1          EA = 1;
 163   1      
 164   1          /* 从缓冲区拷贝数据 */
 165   1          dest = (uint8 *)buff;
 166   1          i = ComSta.rxbtm;
 167   1          end  = i + len;
 168   1          if (end < RX_BUFF_SIZE) {
 169   2              for (; i<end; i++) {
 170   3                  *dest++ = RxBuff[i];
 171   3              }
 172   2          }
 173   1          else {
 174   2              for (; i<RX_BUFF_SIZE; i++) {
 175   3                  *dest++ = RxBuff[i];
 176   3              }
C51 COMPILER V9.02   UARTCOM                                                               11/08/2012 21:34:06 PAGE 4   

 177   2              end -= RX_BUFF_SIZE;
 178   2              for (i=0; i<end; i++) {
 179   3                  *dest++ = RxBuff[i];
 180   3              }
 181   2          }
 182   1      
 183   1          /* 修改缓冲区指向信息 */
 184   1          EA = 0;
 185   1          ComSta.rxbtm = end;
 186   1          ComSta.rxcnt -= len;
 187   1          EA = 1;
 188   1      
 189   1          return len;
 190   1      }
 191          
 192          /*
 193          * 函数名:UartRxMonitor
 194          * 描  述:UART通信接收的监控函数,用于判定一帧数据的接收完成
 195          * 输  入:ms - 本函数调用的间隔时间,单位ms
 196          * 输  出:无
 197          */
 198          void UartRxMonitor(uint8 ms)
 199          {
 200   1          uint8 cnt;
 201   1          static uint8 cntbkp;
 202   1          static uint8 idletmr;
 203   1          static uint8 sigpost;
 204   1      
 205   1          cnt = ComSta.rxcnt;
 206   1          if (cnt == 0) {
 207   2              cntbkp = 0;
 208   2              return;
 209   2          }
 210   1          if (cnt != cntbkp) {
 211   2              idletmr = 0;
 212   2              sigpost = 0;
 213   2              cntbkp  = cnt;
 214   2              return;
 215   2          }
 216   1          if (sigpost != 0) {      //保证接收完成标志只推送一次
 217   2              return;
 218   2          }
 219   1          idletmr += ms;
 220   1          if (idletmr >= FRAME_SPACE_TIME) {
 221   2              sigpost = 1;
 222   2              UartRxSta = RX_FINISH;
 223   2          }
 224   1      }
 225          
 226          /*
 227          * 函数名:Serial_ISR
 228          * 描  述:串口中断服务函数
 229          */
 230          void Serial_ISR() interrupt 4
 231          {
 232   1          uint8 chr;
 233   1          int8  top;
 234   1      
 235   1              /* 接收字符,保存到接收缓冲区中 */
 236   1              if (RI == 1) {
 237   2                      RI = 0;
 238   2              chr = SBUF;
C51 COMPILER V9.02   UARTCOM                                                               11/08/2012 21:34:06 PAGE 5   

 239   2              if (ComSta.rxcnt < RX_BUFF_SIZE) {
 240   3                  top = ComSta.rxbtm + ComSta.rxcnt;
 241   3                  if (top >= RX_BUFF_SIZE) {
 242   4                      top -= RX_BUFF_SIZE;
 243   4                  }
 244   3                  RxBuff[top] = chr;
 245   3                  ComSta.rxcnt++;
 246   3              }
 247   2              }
 248   1              
 249   1              /* 由发送缓冲区中提取字符,并发送 */
 250   1              if (TI == 1) {
 251   2                      TI = 0;
 252   2              if (ComSta.txbtm != ComSta.txtop) {
 253   3                  SBUF = TxBuff[ComSta.txbtm];
 254   3                  ComSta.txbtm++;
 255   3                  if (ComSta.txbtm >= TX_BUFF_SIZE) {
 256   4                      ComSta.txbtm = 0;
 257   4                  }
 258   3              }
 259   2              }
 260   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    657    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     80    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       9
   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 + -