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

📄 uart.lst

📁 ZLG500的应用软件
💻 LST
字号:
C51 COMPILER V8.02   UART                                                                  04/18/2008 09:54:38 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE UART.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #define UART_GLOBALS
   2          #include "main.h"
   3          #include "UART.h"
   4          //#include "string.h"
   5          #include "delay.h"
   6          
   7          void UART_Init()
   8          {
   9   1              PCON = 0x80;                    // SMOD = 1;
  10   1              SCON = 0x50;                    // Mode 1, 8-bit UART, enable receiption
  11   1              TMOD = 0x21;                    // Timer 1, mode 2, 8-bit auto reload,
  12   1              
  13   1              MyAddr = 0;
  14   1              BaudNum = 7;
  15   1                      
  16   1              TH1=BaudRateTable[BaudNum];
  17   1              TL1=BaudRateTable[BaudNum];
  18   1              TR1 = 1;        
  19   1              
  20   1          RcvStatus = RCVSTX;
  21   1          SerDTValid = FALSE;
  22   1          SerTmOut = 0;
  23   1          
  24   1          SendFlag = FALSE;
  25   1          SendStatus = SENDIDLE;
  26   1          RS485_TXen = 0;
  27   1          REN = 1;
  28   1          ES = 1;
  29   1      }
  30          
  31          void UART_Isr() interrupt 4 using 1
  32          {
  33   1              INT8U temp;
  34   1              static INT8U SerLen,ExtData;
  35   1              static INT8U LenSend;   //已发送的有效数据长度
  36   1              
  37   1          if(RI)
  38   1          {
  39   2                      temp = SBUF;
  40   2                      
  41   2              if(temp == STX)
  42   2                      {                       //在任何时候收到STX,即可视为一帧的开始
  43   3                              RcvStatus = RCVDATA;
  44   3                              SerLen = 0;
  45   3                              RcvDTLen = 0;
  46   3                              SerTmOut = 2;   //启动超时定时器
  47   3                      }
  48   2                      else if(temp == ETX)
  49   2                      {
  50   3                              if(RcvStatus == RCVDATA)
  51   3                              {       
  52   4                                      if(SerTmOut)            
  53   4                                      {                               //在未超时的情况下,接收数据后又收到一个ETX,则本帧数据有效
  54   5                                              SerDTValid = TRUE;
  55   5                                      }
C51 COMPILER V8.02   UART                                                                  04/18/2008 09:54:38 PAGE 2   

  56   4                                      RcvStatus = RCVSTX;
  57   4                              }
  58   3                      }
  59   2                      else if(RcvStatus == RCVDATA)
  60   2                      {                                       
  61   3                              if((SerTmOut==0) || (temp&0x80))
  62   3                                      RcvStatus = RCVSTX;             //超时或数据中的bit7为1,则本帧数据作废
  63   3                              else
  64   3                              {
  65   4                                      SerTmOut = 2;           
  66   4                              if((SerLen&0x07) == 0)
  67   4                                      {                               //扩展字节
  68   5                                              ExtData = temp;
  69   5                                      }
  70   4                                      else
  71   4                                      {
  72   5                                              if(ExtData & 0x01)
  73   5                                              {
  74   6                                                      temp |= 0x80;
  75   6                                              }
  76   5                                              SerBfr[RcvDTLen++] = temp;
  77   5                                              ExtData >>= 1;
  78   5                                      }
  79   4                                      SerLen++;
  80   4                              }
  81   3                      }
  82   2                      
  83   2                      if(SerDTValid)
  84   2                      {
  85   3                              SerDTValid = FALSE;
  86   3                              if(RcvDTLen == (SerBfr[LENGTH]+6))
  87   3                              {
  88   4                                      temp = 0;
  89   4                                      for(SerLen=0;SerLen<RcvDTLen;SerLen++)
  90   4                                              temp ^= SerBfr[SerLen];
  91   4                                      if(temp == 0xff)
  92   4                                      {
  93   5                                              if(SerBfr[RADDR] == MyAddr)
  94   5                                              {
  95   6                                                      SerDTValid = TRUE;
  96   6                                              }
  97   5                                      }
  98   4                              }
  99   3                      }       
 100   2              RI = 0;
 101   2          }
 102   1          else
 103   1          {
 104   2              if(SendStatus == SENDSTX)
 105   2                      {
 106   3                              SBUF = STX;
 107   3                              SendStatus = SENDDATA;  //下次中断发送数据
 108   3                              SerLen = 0;
 109   3                              LenSend = 0;
 110   3                      }
 111   2                      else if(SendStatus == SENDDATA)
 112   2                      {
 113   3                              if((SerLen&0x07) == 0)
 114   3                              {
 115   4                                      ExtData = 0;
 116   4                                      temp = LentoSend>=7?7:LentoSend;        //计算扩展数据位长度
 117   4                                      do
C51 COMPILER V8.02   UART                                                                  04/18/2008 09:54:38 PAGE 3   

 118   4                                      {
 119   5                                              ExtData <<= 1;
 120   5                                              if(SerBfr[LenSend+(temp-1)]&0x80)
 121   5                                                      ExtData |=0x01;
 122   5                                              temp--; 
 123   5                                      }while(temp);
 124   4                                      SBUF = ExtData;         //发送扩展数据
 125   4                              }
 126   3                              else
 127   3                              {
 128   4                                      SBUF = SerBfr[LenSend]&0x7f;
 129   4                                      LenSend++;
 130   4                                      LentoSend--;
 131   4                                      if(LentoSend == 0)
 132   4                                      {                                       //有效数据已发送完毕
 133   5                                              SendStatus = SENDETX;   //下次中断发送ETX
 134   5                                      }
 135   4                              }
 136   3                              SerLen++;
 137   3                      }
 138   2                      else if(SendStatus == SENDETX)
 139   2                      {
 140   3                              SBUF = ETX;             //发送ETX
 141   3                              SendStatus = SENDSTOP;  //下次中断结束本次发送
 142   3                      }
 143   2                      else if(SendStatus == SENDSTOP)
 144   2                      {
 145   3                              RS485_TXen = FALSE;
 146   3                              SendFlag = FALSE;
 147   3                              SendStatus = SENDIDLE;  //发送器空闲
 148   3                      }
 149   2              TI = 0;
 150   2          }
 151   1      }
 152          
 153          INT8U Ser_Send(INT8U SlvAddr)
 154          {
 155   1          INT8U i;
 156   1          
 157   1          if(SendStatus == SENDIDLE)
 158   1              {
 159   2                      SerBfr[RADDR] = SlvAddr;  //从机地址
 160   2              SerBfr[SADDR] = MyAddr;
 161   2              
 162   2                  LentoSend = SerBfr[LENGTH]+5;
 163   2                  SerBfr[LentoSend] = 0;
 164   2                  for(i=0;i<LentoSend;i++)
 165   2                  {
 166   3                      SerBfr[LentoSend] ^= SerBfr[i];
 167   3                  }
 168   2                  SerBfr[LentoSend] = ~SerBfr[LentoSend];
 169   2                  LentoSend++;
 170   2                  
 171   2                  RS485_TXen = 1;
 172   2                  SendStatus = SENDSTX;
 173   2                  TI = 1;
 174   2                  return TRUE;
 175   2              }
 176   1              else
 177   1                      return FALSE;
 178   1      }
 179          
C51 COMPILER V8.02   UART                                                                  04/18/2008 09:54:38 PAGE 4   



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    402    ----
   CONSTANT SIZE    =      9    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     41    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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