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

📄 serial_communication.lst

📁 51单片机开发与应用技术详解(珍藏版)PPT及源码
💻 LST
字号:
C51 COMPILER V8.08   SERIAL_COMMUNICATION                                                  04/25/2008 15:44:36 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 <rtx51tny.h> 
   3          
   4          #define uchar unsigned char                                     //宏定义
   5          
   6          #define  OUTBUF_LEN  8                      //串行口发送缓冲区的长度
   7          uchar  outbuf_start;                                    //串行口发送缓冲区的起点
   8          uchar  outbuf_end;                                      //串行口发送缓冲区的终点
   9          idata    char  outbuf[OUTBUF_LEN];              //串行口发送缓冲区
  10          uchar  out_task = 0xff;                                         //串行口输出任务的任务号
  11          
  12          #define  INBUF_LEN  8                           //串行口接收缓冲区的长度
  13          uchar  inbuf_start;                                     //串行口接收缓冲区的起点
  14          uchar  inbuf_end;                                       //串行口接收缓冲区的终点
  15          idata    char  inbuf[INBUF_LEN];                //串行口接收缓冲区
  16          uchar  in_task = 0xff;                                          //串行口输入任务的任务号
  17          
  18          #define   CTRL_Q  0x11 
  19          #define   CTRL_S  0x13 
  20          
  21          bit   sendfull;                                         //发送缓冲区满标志位
  22          bit   sendactive;                                       //发送激活标志位
  23          bit   sendstop;                                         //发送停止标志位
  24          
  25          void putbuf (char c)  
  26          {
  27   1        if (!sendfull)                                                                //判断发送缓冲区满标志位
  28   1      {                   
  29   2      if (!sendactive && !sendstop)                           //缓冲区未满,发送器未处于活动态
  30   2      { 
  31   3            sendactive = 1;
  32   3            SBUF = c;                                 //直接发送第一个字符到SBUF,并启动发送
  33   3          }
  34   2      else  
  35   2      {
  36   3            outbuf[outbuf_end++ & (OUTBUF_LEN-1)] = c; //向定义的发送缓冲区传送字符
  37   3            if (((outbuf_end ^ outbuf_start) & (OUTBUF_LEN-1)) == 0)  
  38   3      sendfull = 1;                                           //缓冲区满标志置位
  39   3          }                                 
  40   2        }
  41   1      }
  42          
  43          
  44          char putchar (char c)  
  45          {
  46   1        if (c == '\n')                                                                //扩展一行新字符
  47   1      {                   
  48   2      while (sendfull)                                                //如果发送缓冲区满,则等待
  49   2      {               
  50   3            out_task = os_running_task_id ();                 //置位输出任务号
  51   3            os_wait (K_SIG, 0, 0);                            //等待信号
  52   3            out_task = 0xff;                                  //输出任务号清零
  53   3          }
  54   2          putbuf (0x0D);                                      //在LF换行符之前发送CR回车符
  55   2        }
C51 COMPILER V8.08   SERIAL_COMMUNICATION                                                  04/25/2008 15:44:36 PAGE 2   

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

 118   3      {                                                       //发送字符
 119   4              SBUF = outbuf[outbuf_start++ & (OUTBUF_LEN-1)];      
 120   4              sendfull = 0;                                   // sendfull 标志清零
 121   4                                           
 122   4              if (out_task != 0xFF)                                   //如果是任务等待
 123   4      isr_send_signal (out_task);                     //发送信号
 124   4            }
 125   3          }
 126   2          else sendactive = 0;                                //全部发送完,sendactive清零
 127   2        }
 128   1      }
 129          
 130          
 131          void init_serial (void)  
 132          {
 133   1        SCON  = 0x50;                                 //串行口方式1,8位 UART, 允许接收
 134   1        TMOD  = 0x20;                                 //定时器方式2,8位自动重装
 135   1        TH1   = 0xf3;                                         //波特率2400bit/s
 136   1        TR1   = 1;                                            //启动定时器T1
 137   1        ES    = 1;                                            //允许串行口中断
 138   1      }
 139          
 140          
 141          


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 + -