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

📄 uart.lst

📁 该程序为RS485通信协议
💻 LST
字号:
C51 COMPILER V6.23a  UART                                                                  09/09/2007 15:51:26 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: e:\my_soft\keil\C51\Bin\c51.exe uart.c DB OE SMALL ROM(LARGE) 

stmt level    source

   1          //*************************************************************************
   2          #include <reg52.h>  
   3          #define  uchar  unsigned char
   4          #define  uint   unsigned int
   5          #define  OLEN  3                                /* size of serial transmission buffer   */ 
   6          unsigned char idata  outbuf[OLEN];          /* storage for transmission buffer      */
   7          unsigned char idata  *outlast=outbuf;    //最后由中断传输出去的字节位置            
   8          unsigned char idata  *putlast=outbuf;    //最后放入发送缓冲区的字节位置         
   9          #define  ILEN 40              //* size of serial receiving buffer      */
  10          unsigned char idata  inbuf[ILEN];  
  11          unsigned char idata *inlast=inbuf;  //最后由中断进入接收缓冲区的字节位置
  12          unsigned char idata *getlast=inbuf;  //最后取走的字节位置                  
  13          bit   outbufsign0;     //最后一个数据覵BUF发完标志  发完=0
  14          bit   outbufsign;     //输出缓冲区非空标志   有=1              
  15          bit   inbufsign;      //接收缓冲区非空标志   有=1
  16          bit   inbufful;       //输入缓冲区满标志  满=1
  17          sbit  SW=P3^2;  //串口收发控
  18          extern char data InKey;
  19          extern bit              OKFlag;
  20          //*****************************
  21          //放入一个字节到发送缓冲区
  22          PutByte(char c)       
  23          {       ES=0;            //暂停串行中断,以免数据比较时出错?    
  24   1              while ( (((outlast-putlast)==2) && (outlast > putlast )) || ((outlast < putlast) && (OLEN-(putlast-ou
             -tlast)==2)))
  25   1              {       ES=1;
  26   2                      c++;c--;
  27   2                      ES=0;
  28   2              }                     
  29   1              *putlast=c;            //放字节进入缓冲区
  30   1              putlast++;          //发送缓冲区指针加一
  31   1              if (putlast==outbuf+OLEN) putlast=outbuf;  //指针到了顶部换到底部
  32   1              if (!outbufsign0)  {outbufsign=1;outbufsign0=1;TI=1;  }   //缓冲区开始为空置为有,启动发送
  33   1              ES=1;
  34   1      }
  35          //*************************************
  36          //从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
  37          uchar GetByte (void)      
  38          {       char idata c ;
  39   1              while (!inbufsign);     //缓冲区空等待
  40   1              ES=0;  
  41   1              c= *getlast;            //取数据 
  42   1              getlast++;              //最后取走的数据位置加一
  43   1              inbufful=0;            //输入缓冲区的满标志清零   
  44   1              if (getlast==inbuf+ILEN)        getlast=inbuf; //地址到顶部回到底部
  45   1              if (getlast==inlast)            inbufsign=0;       //地址相等置接收缓冲区空空标志,再取数前要检该标志
  46   1              ES=1;
  47   1              return (c);        //取回数据
  48   1      }
  49          //*****************************************
  50          //串口中断处理
  51          Serial () interrupt 4 
  52          {   if (TI ) 
  53   1          {   TI = 0;  
  54   2              if (outbufsign)              
C51 COMPILER V6.23a  UART                                                                  09/09/2007 15:51:26 PAGE 2   

  55   2              {       SBUF=*outlast; //未发送完继续发送
  56   3                      outlast++;            //最后传出去的字节位置加一
  57   3                      if (outlast==outbuf+OLEN)       outlast=outbuf;//地址到顶部回到底部
  58   3                      if (putlast==outlast)           outbufsign=0;   //数据发送完置发送缓冲区空标志                    
  59   3              } 
  60   2              else outbufsign0=0;
  61   2          }
  62   1          if (RI)  
  63   1          {  RI = 0;  
  64   2              if(!inbufful)
  65   2              {       *inlast= SBUF;            //放入数据            
  66   3                      inlast++;                    //最后放入的位置加一 
  67   3                      inbufsign=1; 
  68   3                      if (inlast==inbuf+ILEN) inlast=inbuf;//地址到顶部回到底部
  69   3                      if (inlast==getlast)    inbufful=1;  //接收缓冲区满置满标志
  70   3              }
  71   2          }
  72   1      }
  73          //串口初始化                0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200,0xff=57600
  74          SerialInit ()  {
  75   1              SCON  = 0x50;                      /* mode 1: 8-bit UART, enable receiver   */
  76   1              TMOD |= 0x20;                      /* timer 1 mode 2: 8-Bit reload          */
  77   1              PCON &= 0x7f; 
  78   1              TH1 = 0xe8;TL1=0xe8; //速率*2       /* reload value 115200 baud       */
  79   1              TR1   = 1;                         /* timer 1 run                           */
  80   1              ES    = 1; REN=1; EA=1;// SM2=1;          //SM2=1时收到的第9位为1才置位RI标志
  81   1              //P1_7=0;
  82   1      }
  83          
  84          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    238    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4    ----
   IDATA SIZE       =     43       1
   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 + -