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

📄 serial_int_3.lst

📁 基于ARM的时钟中断程序
💻 LST
字号:
C51 COMPILER V8.02   SERIAL_INT_3                                                          04/22/2008 14:44:03 PAGE 1   


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

line level    source

   1          //文件名:serial_int_3.c
   2          //说明:中断法串口通讯程序
   3          //可以使用串口调试助手测试
   4          //编写:王晓荣
   5          //日期:20080403
   6          #include <REGX51.H>
   7          
   8          #define  OUTBUF_LENGTH  20              //输出缓冲区大小
   9          unsigned char  arOutbuf[OUTBUF_LENGTH]; //输出缓冲区
  10          unsigned char *pOutlast = arOutbuf;     //输出缓冲区中已发送数据位置指针            
  11          unsigned char *pPutlast = arOutbuf;     //输出缓冲区中已存放数据位置指针
  12          
  13          #define  INBUF_LENGTH   20              //输入缓冲区大小 
  14          unsigned char arInbuf[INBUF_LENGTH];    //输入缓冲区    
  15          unsigned char *inlast  = arInbuf;       //输入缓冲区中已接收数据位置指针
  16          unsigned char *getlast = arInbuf;       //输入缓冲区中已读取数据位置指针 
  17                           
  18          bit   sendFlg;                  //一组数据的启动发送标志
  19          bit   outbufEmptyFlg;   //输出缓冲区空标志              
  20          bit   inbufEmptyFlg;    //输入缓冲区空标志
  21          bit   inbufFullFlg;     //输入缓冲区满标志
  22          
  23          putbyte(char c);                             //存一个字节到输出缓冲区
  24          putbytes(unsigned char *,unsigned char); //存多个字节到输出缓冲区
  25          putstring(unsigned char *);                  //存字符串到输出缓冲区
  26          unsigned char getbyte ();                                               //从输入缓冲区中读取一个字节数据
  27          void getbytes (unsigned char *, unsigned char); //从输入缓冲区中读取多个字节数据
  28          void getstring (unsigned char *, unsigned char);//从输入缓冲区中读取字符串
  29          //////////////////////////////////////////////////////////////////////////////////////////
  30          
  31          //测试用主函数  
  32          void main( )
  33          {
  34   1              //unsigned char i;
  35   1              unsigned char free[20];
  36   1              sendFlg = 1;              //一组数据的启动发送标志
  37   1              outbufEmptyFlg = 1;       //输出缓冲区空              
  38   1              inbufEmptyFlg = 1;        //输入缓冲区空
  39   1              serial_init ();
*** WARNING C206 IN LINE 39 OF SERIAL_INT_3.C: 'serial_init': missing function-prototype
  40   1              IE = 0X90;
  41   1              //for(i = 0; i < 10; i ++)
  42   1                      //free[i] = i + 0x30;   
  43   1              //getstring(free, 10);
  44   1              //putstring(free);
  45   1              //putbytes(free,10);
  46   1              //getbytes(free, 10);
  47   1              //putbytes(free);       
  48   1              getstring(free, 10);
  49   1              putstring(free);
  50   1              putstring("ready!");    
  51   1              while(1);
  52   1      }///////////////////////////////////////////////////////////////////////////////////                      
             -             
  53          
C51 COMPILER V8.02   SERIAL_INT_3                                                          04/22/2008 14:44:03 PAGE 2   

  54            
  55          //存一个字节到输出缓冲区
  56          putbyte(char c)       
  57          {                           
  58   1              //等待,防止写入数据时发生套圈现象
  59   1              while ((pOutlast == pPutlast + 2) || 
  60   1                         (OUTBUF_LENGTH + pOutlast == pPutlast + 2)); 
  61   1              ES=0;                     //暂停串行中断
  62   1          *pPutlast = c;            //存数据
  63   1           pPutlast ++;             //已存放数据位置指针调整   
  64   1          if (pPutlast == arOutbuf + OUTBUF_LENGTH)  
  65   1                      pPutlast = arOutbuf;  //指针到了顶部换到底部
  66   1          outbufEmptyFlg = 0;       //输出缓冲区标志为非空
  67   1          if (sendFlg)              //如果是第1个数据,启动发送
  68   1              {
  69   2                      sendFlg = 0;
  70   2                      TI = 1;               //启动发送  
  71   2              }  
  72   1          ES = 1;
  73   1      }///////////////////////////////////////////////////////////////////////
  74          
  75          
  76          //存多个字节到输出缓冲区
  77          putbytes(unsigned char *pOutput,unsigned char length) 
  78          {       
  79   1              unsigned char i;
  80   1              for(i = 0; i < length; i++)
  81   1              {
  82   2                      putbyte(*pOutput);
  83   2                      pOutput ++;
  84   2              }
  85   1      }//////////////////////////////////////////////////////////// 
  86          
  87          
  88          //存字符串到输出缓冲区
  89          putstring(unsigned char  *pString)
  90          {
  91   1              for (;*pString != 0; pString++)   //遇到停止符0结束
  92   1                      putbyte(*pString);
  93   1      }//////////////////////////////////////////////////////////
  94          
  95          //从输入缓冲区中读取一个字节数据
  96          unsigned char getbyte ()      
  97          { 
  98   1              unsigned char ch ;
  99   1              while (inbufEmptyFlg);   //如果缓冲区空,则等待
 100   1              ES = 0;  
 101   1              ch = *getlast;           //读取输入缓冲区数据 
 102   1              getlast ++;              //调整已读取数据位置指针
 103   1              inbufFullFlg = 0;        //输入缓冲区未满         
 104   1              if (getlast == arInbuf + INBUF_LENGTH) 
 105   1                      getlast = arInbuf;       //地址到顶部回到底部   
 106   1              if (getlast == inlast)   //如果缓冲区数据已读取完 
 107   1                      inbufEmptyFlg = 1;       
 108   1              ES = 1;
 109   1              return (ch);             //取回数据
 110   1      }//////////////////////////////////////////////////////////////////////////////////
 111          
 112          //从输入缓冲区中读取多个字节数据
 113          //参数         接收数据存放位置,   接收数据长度   
 114          void getbytes (unsigned char *pline, unsigned char length)  
 115          {
C51 COMPILER V8.02   SERIAL_INT_3                                                          04/22/2008 14:44:03 PAGE 3   

 116   1              unsigned char i;
 117   1              for(i = 0; i < length; i++)
 118   1              {
 119   2                      *pline = getbyte ();                 
 120   2                      pline ++;               
 121   2              }               
 122   1      }/////////////////////////////////////////////////////////////////////////
 123          
 124          //从输入缓冲区中读取字符串
 125          //参数         接收数据存放位置,   接收数据长度   
 126          void getstring (unsigned char *pline, unsigned char length)  
 127          { 
 128   1              unsigned char i;
 129   1              for(i = 0; i < length; i++)
 130   1              {
 131   2                      *pline = getbyte (); 
 132   2                      if( *pline == 0x00)
 133   2                              break;               
 134   2                      pline ++;               
 135   2              } 
 136   1              *pline = 0x00;     //加上停止符0
 137   1      }/////////////////////////////////////////////////////////////////////////
 138          
 139          //串口中断处理
 140          serial () interrupt 4 
 141          {   
 142   1              if (TI ) 
 143   1          {   
 144   2                      TI = 0;  
 145   2              if (!outbufEmptyFlg)              
 146   2              {
 147   3                              SBUF = *pOutlast;         //未发送完继续发送
 148   3                      pOutlast++ ;              //最后传出去的字节位置加一
 149   3                      if (pOutlast == arOutbuf + OUTBUF_LENGTH) 
 150   3                                      pOutlast = arOutbuf;  //地址到顶部回到底部
 151   3                      if (pPutlast == pOutlast) 
 152   3                                      outbufEmptyFlg = 1;   //数据发送完置发送缓冲区空标志                    
 153   3              } 
 154   2                  else 
 155   2                              sendFlg = 1;
 156   2          }
 157   1          if (RI)  
 158   1          {  
 159   2                      RI = 0; 
 160   2              if(!inbufFullFlg)
 161   2              {
 162   3                      *inlast = SBUF;           //放入数据            
 163   3                      inlast ++;                //最后放入的位置加一 
 164   3                      inbufEmptyFlg = 0;                //输入缓冲区非空
 165   3                      if (inlast == arInbuf + INBUF_LENGTH) 
 166   3                                      inlast = arInbuf;     //地址到顶部回到底部
 167   3                      if (inlast == getlast)  
 168   3                                      inbufFullFlg = 1;     //输入缓冲区满              
 169   3              }
 170   2          }
 171   1      }//////////////////////////////////////////////////////////////////////////////////
 172          
 173          //串口初始化                
 174          serial_init ()  
 175          {
 176   1              TMOD = 0x20;                    
 177   1              TH1 = 256 - 12; //1.5: 波特率19200; 3: 波特率9600; 6:波特率4800; 12:波特率2400   
C51 COMPILER V8.02   SERIAL_INT_3                                                          04/22/2008 14:44:03 PAGE 4   

 178   1              TL1 = 256 - 12; 
 179   1              SCON = 0x50;    //工作方式1              
 180   1              PCON &= 0xef;   // 波特率不倍增                                 
 181   1              TR1 = 1;
 182   1      }//////////////////////////////////////////////////////////////////////////////////
 183          
 184          
 185          
 186          
 187          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    661    ----
   CONSTANT SIZE    =      7    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     52      32
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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