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

📄 serial_communication.lst

📁 零基础单片机C语言设计全套教程
💻 LST
字号:
C51 COMPILER V8.08   SERIAL_COMMUNICATION                                                  09/04/2008 10:42:41 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE SERIAL_COMMUNICATION
OBJECT MODULE PLACED IN SERIAL_Communication.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE SERIAL_Communication.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>                              //头文件
   2          #include <stdio.h>
   3          #include <rtx51tny.h> 
   4          
   5          #define uchar unsigned char                             //宏定义
   6          
   7          #define  OUTBUF_LEN  8                 //串行口发送缓冲区的长度
   8          #define  INBUF_LEN  8                   //串行口接收缓冲区的长度
   9          
  10          #define   CTRL_Q  0x11 
  11          #define   CTRL_S  0x13 
  12          
  13          bit   Full;                                             //发送缓冲区满标志位
  14          bit   Active;                                           //发送激活标志位
  15          bit   Stop;                                     //发送停止标志位
  16          
  17          uchar  bufout_start;                            //串行口发送缓冲区的起点
  18          uchar  bufout_end;                              //串行口发送缓冲区的终点
  19          idata    char  outbuf[OUTBUF_LEN];              //串行口发送缓冲区
  20          uchar  out_task = 0xff;                                 //串行口输出任务的任务号
  21          
  22          uchar  bufin_start;                             //串行口接收缓冲区的起点
  23          uchar  bufin_end;                               //串行口接收缓冲区的终点
  24          idata   char  inbuf[INBUF_LEN];                 //串行口接收缓冲区
  25          uchar  in_task = 0xff;                                  //串行口输入任务的任务号
  26          
  27          
  28          void putbuf (char c)  
  29          {
  30   1        if (!Full)                                                    //判断发送缓冲区满标志位
  31   1      {                   
  32   2      if (!Active && !Stop)                           //缓冲区未满,发送器未处于活动态
  33   2      { 
  34   3            Active = 1;
  35   3            SBUF = c;                         //直接发送第一个字符到SBUF,并启动发送
  36   3          }
  37   2      else  
  38   2      {
  39   3            outbuf[bufout_end++ & (OUTBUF_LEN-1)] = c; //向定义的发送缓冲区传送字符
  40   3            if (((bufout_end ^ bufout_start) & (OUTBUF_LEN-1)) == 0)  
  41   3      Full = 1;                                               //缓冲区满标志置位
  42   3          }                                 
  43   2        }
  44   1      }
  45          
  46          
  47          
  48          char putchar (char c)  
  49          {
  50   1        if (c == '\n')                                                        //扩展一行新字符
  51   1      {                   
  52   2      while (Full)                                            //如果发送缓冲区满,则等待
  53   2      {               
  54   3            out_task = os_running_task_id ();         //置位输出任务号
  55   3            os_wait (K_SIG, 0, 0);                    //等待信号
C51 COMPILER V8.08   SERIAL_COMMUNICATION                                                  09/04/2008 10:42:41 PAGE 2   

  56   3            out_task = 0xff;                          //输出任务号清零
  57   3          }
  58   2          putbuf (0x0D);                              //在LF换行符之前发送CR回车符
  59   2        }
  60   1        while (Full)                                                          //如果发送缓冲区满,则等待
  61   1      { 
  62   2          out_task = os_running_task_id ();           //置位输出任务号
  63   2          os_wait (K_SIG, 0, 0);                      //等待信号
  64   2          out_task = 0xff;                            //输出任务号清零
  65   2        }
  66   1        putbuf (c);                                   //发送字符
  67   1        return c;                                     //返回字符
  68   1      }
  69          
  70          
  71          char _getkey (void)  
  72          {
  73   1        char crt;
  74   1        while  (bufin_end == bufin_start)             //等待
  75   1      {
  76   2          in_task = os_running_task_id ();                    //置位输入任务号
  77   2          os_wait (K_SIG, 0, 0);                      //等待信号
  78   2          in_task = 0xff;                             //输入任务号清零
  79   2        }
  80   1        crt=inbuf[bufin_start++ & (INBUF_LEN-1)]; 
  81   1        return crt;                                                   //返回值
  82   1      }
  83          
  84          
  85          
  86          void serial () interrupt 4 using 2                      //中断响应函数
  87          {    
  88   1        unsigned char c;
  89   1        bit   start_trans = 0;
  90   1      
  91   1        if (RI)                                                               //RI置1,接收中断
  92   1      { 
  93   2          c = SBUF;                                   //读SBUF
  94   2      RI = 0;                                         //中断请求标志RI清零
  95   2      
  96   2      switch (c)                                              //字符处理
  97   2      {                    
  98   3            case CTRL_S:                                      //如果是CTRL_S
  99   3              Stop = 1;                                       //置位Stop,停止发送
 100   3              break;
 101   3      
 102   3            case CTRL_Q:                                      //如果是CTRL_Q
 103   3              start_trans = Stop;                             //开始发送
 104   3              Stop = 0;
 105   3              break;
 106   3      
 107   3            default:                                  //对于其它字符,则读入输入缓冲区
 108   3              if (bufin_start + INBUF_LEN != bufin_end)
 109   3      {
 110   4                inbuf[bufin_end++ & (INBUF_LEN-1)] = c;
 111   4              }
 112   3                                           
 113   3              if (in_task != 0xFF)                            //如果是任务等待
 114   3      isr_send_signal (in_task);              //发送信号
 115   3              break;
 116   3          }
 117   2        }
C51 COMPILER V8.08   SERIAL_COMMUNICATION                                                  09/04/2008 10:42:41 PAGE 3   

 118   1      
 119   1        if (TI || start_trans)                                        //TI置位,发送中断
 120   1      { 
 121   2          TI = 0;                                     //中断请求标志TI清零
 122   2      if (bufout_start != bufout_end)                         //如果输入缓冲区接收到字符
 123   2      {           
 124   3            if (!Stop)                                                
 125   3      {                                               //发送字符
 126   4              SBUF = outbuf[bufout_start++ & (OUTBUF_LEN-1)];      
 127   4              Full = 0;                                       // Full 标志清零
 128   4                                           
 129   4              if (out_task != 0xFF)                           //如果是任务等待
 130   4      isr_send_signal (out_task);             //发送信号
 131   4            }
 132   3          }
 133   2          else Active = 0;                                    //全部发送完,Active清零
 134   2        }
 135   1      }
 136          
 137          void init_serial (void)  
 138          {
 139   1      SCON  = 0x50;                                           //设置串行口: 方式 1, 8位UART, 允许接收
 140   1      TMOD  |= 0x20;                                          //设置定时器T1, 方式 2, 8位自动重装
 141   1      PCON  =0x80;                                                    //设置SMOD=1
 142   1      TL1    =0xF4;                                                   //波特率4800bit/s,初值
 143   1      TH1    =0xF4;
 144   1      TR1    = 1;                                     //启动定时器T1
 145   1      ES     = 1;                                     //允许串行口中断
 146   1      TI         =1;
 147   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    298    ----
   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 + -