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

📄 serial.lst

📁 采用C8051F020单片机的串口通信应用资料
💻 LST
字号:
C51 COMPILER V6.23a  SERIAL                                                                04/15/2002 18:18:04 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN Serial.OBJ
COMPILER INVOKED BY: C:\keil\C51\BIN\c51.exe Serial.c DB OE

stmt level    source

   1          //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理
   2          //出入均设有缓冲区,大小可任意设置。
   3          //*************************************************************************
   4          #include "TestSerial.h" 
   5          
   6          #define BAUDRATE0               115200          // 用户定义的UART0 波特率
   7          
   8          #define DB_SENDMAXSIZE 0xf0
   9          #define DB_RECMAXSIZE 0xf0
  10          
  11          bit CommRecDataOverflowFlag,FlagRecComm,SendItComm;
  12          extern unsigned char Count1ms;
  13          unsigned char CommSendBufferHead, CommSendBufferTail;
  14          unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE]; 
  15          unsigned char CommRecBufferHead, CommRecBufferTail;
  16          unsigned char xdata CommRecBuffer[DB_RECMAXSIZE]; 
  17          unsigned char RecDataLen=3;
  18          
  19          void ClearCommRecBuffer(void)
  20          {
  21   1              CommRecBufferHead=CommRecBufferTail=0;
  22   1              FlagRecComm=0;
  23   1      }
  24          
  25          void OpenComm(void) 
  26          {
  27   1              PCON |= 0x80;           // SMOD=1 (HW_UART uses Timer 1 overflow with no divide down).
  28   1              TMOD = 0x20;            // Configure Timer 1 for use by UART0
  29   1              CKCON |= 0x10;          // Timer 1 derived from SYSCLK
  30   1      
  31   1              RCAP2H=(65536-(SYSCLK/BAUDRATE0/32))/256;
  32   1              RCAP2L=(65536-(SYSCLK/BAUDRATE0/32))%256;
  33   1              TH2=RCAP2H;TL2=RCAP2L;
  34   1              CT2=0;                          //T2:timer mode 
  35   1              TR2=1;
  36   1              TCLK=1;RCLK=1;          //说明:52,对于SIO0,可选择T1(TCLK=0,RCLK=0)或T2(TCLK=1,RCLK=1)作为波特率发生器
  37   1                                                  //            SIO1只能用T1作为波特率发生器
  38   1                                                  //baud=OSC/(32*(65536-[RCAP2H,RCAP2L])
  39   1              CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
  40   1              CommRecBufferHead=CommRecBufferTail=0;
  41   1              FlagRecComm=0;
  42   1              RI0=0;                                  // Clear HW_UART receive and transmit
  43   1              TI0=0;                                  // complete indicators.
  44   1              SCON0 = 0x50;                   // Configure UART0 for mode 1, receiver enabled.
  45   1              ES0=1;                                  // allow the serial interrupt
  46   1              SendItComm=1;
  47   1      }
  48          void SendCommChar(char ch)
  49          {
  50   1              CommSendBuffer[CommSendBufferTail]=ch; 
  51   1              CommSendBufferTail++;
  52   1              if (CommSendBufferTail==DB_SENDMAXSIZE)
  53   1              {       
  54   2                      CommSendBufferTail=0;
  55   2              }
C51 COMPILER V6.23a  SERIAL                                                                04/15/2002 18:18:04 PAGE 2   

  56   1              if (SendItComm)
  57   1              {        
  58   2                      TB80=1;SBUF0=CommSendBuffer[CommSendBufferHead]; 
  59   2              }
  60   1              return ;
  61   1      }
  62          
  63          void SendCommString(unsigned char *base) 
  64          {
  65   1      unsigned char i=0;
  66   1              if (base[0]==0) return;
  67   1              for (;;)
  68   1              {       
  69   2                      if (base[i]==0) break;
  70   2                      CommSendBuffer[CommSendBufferTail]=base[i]; 
  71   2                      CommSendBufferTail++; 
  72   2                      if (CommSendBufferTail==DB_SENDMAXSIZE)
  73   2                      {                                               
  74   3                              CommSendBufferTail=0;
  75   3                      }
  76   2                      i++;
  77   2              }
  78   1              if (SendItComm)
  79   1              {                                                       
  80   2                      SBUF0=CommSendBuffer[CommSendBufferHead];
  81   2              }
  82   1      }
  83          
  84          void SendCommBuffer(unsigned char *base, unsigned char size) 
  85          {
  86   1      unsigned char i=0;
  87   1              if (!size) { return; }  
  88   1              while (i<size) 
  89   1              {        
  90   2                      CommSendBuffer[CommSendBufferTail]=base[i]; 
  91   2                      i++;
  92   2                      CommSendBufferTail++; 
  93   2                      if (CommSendBufferTail==DB_SENDMAXSIZE)
  94   2                      { 
  95   3                              CommSendBufferTail=0;
  96   3                      }
  97   2              }
  98   1              if (SendItComm)
  99   1              {        
 100   2                      SBUF0=CommSendBuffer[CommSendBufferHead]; 
 101   2              }
 102   1      }
 103          
 104          void CommISR(void) interrupt 4
 105          {
 106   1              if (_testbit_(TI0))
 107   1              {
 108   2                      TI0=0;
 109   2                      CommSendBufferHead++;   
 110   2                      if (CommSendBufferHead==DB_SENDMAXSIZE)
 111   2                      {        
 112   3                              CommSendBufferHead=0;
 113   3                      }
 114   2                      if (CommSendBufferHead!=CommSendBufferTail)
 115   2                      {        
 116   3                              SBUF0=CommSendBuffer[CommSendBufferHead]; // send the next byte
 117   3                              SendItComm=0;
C51 COMPILER V6.23a  SERIAL                                                                04/15/2002 18:18:04 PAGE 3   

 118   3                      }
 119   2                      else
 120   2                      {
 121   3                              SendItComm=1;
 122   3                      }
 123   2              }
 124   1              if (_testbit_(RI0))     
 125   1              {        
 126   2                      RI0=0;
 127   2                      if (CommRecBufferTail==CommRecBufferHead)
 128   2                      {
 129   3                              CommRecDataOverflowFlag=1;                              //接收缓冲区溢出
 130   3                      }
 131   2                      CommRecBuffer[CommRecBufferTail]=SBUF0;     //receive data           
 132   2                  CommRecBufferTail++;
 133   2                  if (CommRecBufferTail==DB_RECMAXSIZE)
 134   2                  {
 135   3                      CommRecBufferTail=0;
 136   3                  }
 137   2                      FlagRecComm=1;
 138   2              }
 139   1      }
 140          
 141          //从接收缓冲区读数据 ,无数据返回0,有数据返回1
 142          bit GetCommChar(unsigned char idata *ch)      
 143          { 
 144   1              if (CommRecBufferTail==CommRecBufferHead) return 0;     
 145   1              *ch=CommRecBuffer[CommRecBufferHead];
 146   1              CommRecBufferHead++;
 147   1              if (CommRecBufferHead==DB_RECMAXSIZE)
 148   1              {
 149   2                      CommRecBufferHead=0;
 150   2              }
 151   1              if (CommRecBufferTail==CommRecBufferHead) FlagRecComm=0;
 152   1              return 1;
 153   1      }
 154          
 155          //在T(0-255)毫秒内从接收缓冲区读数据 ,无数据返回0,有数据返回1
 156          bit GetCommCharWait(unsigned char idata *ch,unsigned char T)  //T ms    
 157          { 
 158   1              Count1ms=T;*ch=0;
 159   1              while (Count1ms)
 160   1              {
 161   2                      if (CommRecBufferTail!=CommRecBufferHead) break;
 162   2              }
 163   1              if (Count1ms==0) return 0;
 164   1              *ch=CommRecBuffer[CommRecBufferHead];
 165   1              CommRecBufferHead++;
 166   1              if (CommRecBufferHead==DB_RECMAXSIZE)
 167   1              {
 168   2                      CommRecBufferHead=0;
 169   2              }
 170   1              return 1;
 171   1      }
 172          
 173          
 174          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    440    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V6.23a  SERIAL                                                                04/15/2002 18:18:04 PAGE 4   

   XDATA SIZE       =    480    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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