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

📄 serial.lst

📁 一些简单的c51程序
💻 LST
字号:
C51 COMPILER V7.09   SERIAL                                                                06/18/2004 09:25:01 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN SERIAL.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SERIAL.C OPTIMIZE(6,SPEED) DEBUG OBJECTEXTEND

line level    source

   1          /******************************************************************************/
   2          /*                                                                            */
   3          /*       SERIAL.C:  Interrupt Controlled Serial Interface for RTX-51 tiny     */
   4          /*                                                                            */
   5          /******************************************************************************/
   6          
   7          
   8          #include <reg52.h>                    /* special function register 8052       */
   9          #include <rtx51tny.h>                 /* RTX-51 tiny functions & defines      */
  10          
  11          #define  OLEN  8                      /* size of serial transmission buffer   */
  12          unsigned char  ostart;                /* transmission buffer start index      */
  13          unsigned char  oend;                  /* transmission buffer end index        */
  14          idata    char  outbuf[OLEN];          /* storage for transmission buffer      */
  15          unsigned char  otask = 0xff;          /* task number of output task           */
  16          
  17          #define  ILEN  8                      /* size of serial receiving buffer      */
  18          unsigned char  istart;                /* receiving buffer start index         */
  19          unsigned char  iend;                  /* receiving buffer end index           */
  20          idata    char  inbuf[ILEN];           /* storage for receiving buffer         */
  21          unsigned char  itask = 0xff;          /* task number of output task           */
  22          
  23          #define   CTRL_Q  0x11                /* Control+Q character code             */
  24          #define   CTRL_S  0x13                /* Control+S character code             */
  25          
  26          bit   sendfull;                       /* flag: marks transmit buffer full     */
  27          bit   sendactive;                     /* flag: marks transmitter active       */
  28          bit   sendstop;                       /* flag: marks XOFF character           */
  29          
  30          /******************************************************************************/
  31          /*       putbuf:  write a character to SBUF or transmission buffer            */
  32          /******************************************************************************/
  33          void putbuf (char c)  {
  34   1        if (!sendfull)  {                   /* transmit only if buffer not full     */
  35   2          if (!sendactive && !sendstop)  {  /* if transmitter not active:           */
  36   3            sendactive = 1;                 /* transfer the first character direct  */
  37   3            SBUF = c;                       /* to SBUF to start transmission        */
  38   3          }
  39   2          else  {                           /* otherwize:                           */
  40   3            outbuf[oend++ & (OLEN-1)] = c;  /* transfer char to transmission buffer */
  41   3            if (((oend ^ ostart) & (OLEN-1)) == 0)  sendfull = 1;
  42   3          }                                 /* set flag if buffer is full           */
  43   2        }
  44   1      }
  45          
  46          
  47          /******************************************************************************/
  48          /*       putchar:  interrupt controlled putchar function                      */
  49          /******************************************************************************/
  50          char putchar (char c)  {
  51   1        if (c == '\n')  {                   /* expand new line character:           */
  52   2          while (sendfull)  {               /* wait for transmission buffer empty   */
  53   3            otask = os_running_task_id ();  /* set output task number               */
  54   3            os_wait (K_SIG, 0, 0);          /* RTX-51 call: wait for signal         */
  55   3            otask = 0xff;                   /* clear output task number             */
C51 COMPILER V7.09   SERIAL                                                                06/18/2004 09:25:01 PAGE 2   

  56   3          }
  57   2          putbuf (0x0D);                    /* send CR before LF for <new line>     */
  58   2        }
  59   1        while (sendfull)  {                 /* wait for transmission buffer empty   */
  60   2          otask = os_running_task_id ();    /* set output task number               */
  61   2          os_wait (K_SIG, 0, 0);            /* RTX-51 call: wait for signal         */
  62   2          otask = 0xff;                     /* clear output task number             */
  63   2        }
  64   1        putbuf (c);                         /* send character                       */
  65   1        return (c);                         /* return character: ANSI requirement   */
  66   1      }
  67          
  68          
  69          /******************************************************************************/
  70          /*       _getkey:  interrupt controlled _getkey                               */
  71          /******************************************************************************/
  72          char _getkey (void)  {
  73   1        while  (iend == istart)  {
  74   2          itask = os_running_task_id ();    /* set input task number                */
  75   2          os_wait (K_SIG, 0, 0);            /* RTX-51 call: wait for signal         */
  76   2          itask = 0xff;                     /* clear input task number              */
  77   2        }
  78   1        return (inbuf[istart++ & (ILEN-1)]);
  79   1      }
  80          
  81          
  82          /******************************************************************************/
  83          /*       serial:  serial receiver / transmitter interrupt                     */
  84          /******************************************************************************/
  85          void serial (void) interrupt 4 using 2  { /* use registerbank 2 for interrupt */
  86   1        unsigned char c;
  87   1        bit   start_trans = 0;
  88   1      
  89   1        if (RI)  {                         /* if receiver interrupt                 */
  90   2          c = SBUF;                        /* read character                        */
  91   2          RI = 0;                          /* clear interrupt request flag          */
  92   2          switch (c)  {                    /* process character                     */
  93   3            case CTRL_S:
  94   3              sendstop = 1;                /* if Control+S stop transmission        */
  95   3              break;
  96   3      
  97   3            case CTRL_Q:
  98   3              start_trans = sendstop;      /* if Control+Q start transmission       */
  99   3              sendstop = 0;
 100   3              break;
 101   3      
 102   3            default:                       /* read all other characters into inbuf  */
 103   3              if (istart + ILEN != iend)  {
 104   4                inbuf[iend++ & (ILEN-1)] = c;
 105   4              }
 106   3                                           /* if task waiting: signal ready         */
 107   3              if (itask != 0xFF) isr_send_signal (itask);
 108   3              break;
 109   3          }
 110   2        }
 111   1      
 112   1        if (TI || start_trans)  {          /* if transmitter interrupt              */
 113   2          TI = 0;                          /* clear interrupt request flag          */
 114   2          if (ostart != oend)  {           /* if characters in buffer and           */
 115   3            if (!sendstop)  {              /* if not Control+S received             */
 116   4              SBUF = outbuf[ostart++ & (OLEN-1)];      /* transmit character        */
 117   4              sendfull = 0;                /* clear 'sendfull' flag                 */
C51 COMPILER V7.09   SERIAL                                                                06/18/2004 09:25:01 PAGE 3   

 118   4                                           /* if task waiting: signal ready         */
 119   4              if (otask != 0xFF)  isr_send_signal (otask);
 120   4            }
 121   3          }
 122   2          else sendactive = 0;             /* if all transmitted clear 'sendactive' */
 123   2        }
 124   1      
 125   1      }
 126          
 127          
 128          /******************************************************************************/
 129          /*       serial_init: initialize serial interface                             */
 130          /******************************************************************************/
 131          void serial_init (void)  {
 132   1        SCON  = 0x50;                      /* mode 1: 8-bit UART, enable receiver   */
 133   1        TMOD |= 0x20;                      /* timer 1 mode 2: 8-Bit reload          */
 134   1        TH1   = 0xf3;                      /* reload value 2400 baud                */
 135   1        TR1   = 1;                         /* timer 1 run                           */
 136   1        ES    = 1;                         /* enable serial port interrupt          */
 137   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    290    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6       1
   IDATA SIZE       =     16    ----
   BIT SIZE         =      3       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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