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

📄 serial_int_2.lst

📁 基于ARM的时钟中断程序
💻 LST
字号:
C51 COMPILER V8.02   SERIAL_INT_2                                                          04/21/2008 06:36:30 PAGE 1   


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

line level    source

   1          //文件名:serial_int_2.c
   2          //说明:较简单的中断法串口通讯程序
   3          //可以使用串口调试助手测试
   4          //编写:王晓荣
   5          //日期:20080403
   6          
   7          #include <reg51.h>
   8          
   9          #define  OUTBUF_LENGTH  5                    //输出缓冲区大小
  10          unsigned char  arOutbuf[OUTBUF_LENGTH];       //输出缓冲区
  11          unsigned char *pOutlast = arOutbuf;           //最后由中断传输出去的字节位置            
  12          unsigned char *pPutlast = arOutbuf;           //最后放入发送缓冲区的字节位置
  13          
  14          #define  INBUF_LENGTH   5                    //输入缓冲区大小 
  15          unsigned char arInbuf[INBUF_LENGTH];              //输入缓冲区    
  16          unsigned char *inlast  = arInbuf;             //最后由中断进入接收缓冲区的字节位置
  17          unsigned char *getlast = arInbuf;             //最后取走的字节位置 
  18                           
  19          bit   sendoutEndFlg;              //BUF中最后一个数据发完标志,用于启动一组数据的发送
  20          bit   outbufEmptyFlg;             //输出缓冲区空标志              
  21          bit   inbufEmptyFlg;              //接收缓冲区空标志
  22          bit   inbufFullFlg;               //输入缓冲区满标志
  23          //////////////////////////////////////////////////////////////////////////////////////////
  24           
  25          //放入一个字节到发送缓冲区
  26          putbyte(char c)       
  27          {                           
  28   1              //等待,防止写入数据时发生套圈现象
  29   1              while ((pOutlast == pPutlast + 2) || 
  30   1                         (OUTBUF_LENGTH + pOutlast == pPutlast + 2)); 
  31   1              ES=0;                     //暂停串行中断
  32   1          *pPutlast = c;            //写缓冲区
  33   1           pPutlast ++;             //发送缓冲区指针加一
  34   1          if (pPutlast == arOutbuf + OUTBUF_LENGTH)  //指针到了顶部换到底部
  35   1                      pPutlast = arOutbuf;  
  36   1          outbufEmptyFlg = 0;
  37   1          if (sendoutEndFlg)   //缓冲区开始为空置为有,启动发送
  38   1              {
  39   2                      sendoutEndFlg = 0;
  40   2                      TI = 1;  
  41   2              }  
  42   1          ES = 1;
  43   1      }///////////////////////////////////////////////////////////////////////
  44          
  45          
  46          //发送一个定义在程序存储区的字符串到串口
  47          putstring(unsigned char  *pString)
  48          {
  49   1              for (;*pString != 0; pString++)   //遇到停止符0结束
  50   1                      putbyte(*pString);
  51   1      }//////////////////////////////////////////////////////////
  52          
  53          unsigned char getbyte ()      
  54          { 
  55   1              unsigned char c ;
C51 COMPILER V8.02   SERIAL_INT_2                                                          04/21/2008 06:36:30 PAGE 2   

  56   1              while (inbufEmptyFlg);     //如果缓冲区空,则等待
  57   1              ES = 0;  
  58   1              c = *getlast;            //取数据 
  59   1              getlast ++;              //最后取走的数据位置加一
  60   1              inbufFullFlg = 0;            //输入缓冲区的满标志清零   
  61   1              if (getlast == arInbuf + INBUF_LENGTH) //地址到顶部回到底部
  62   1                      getlast = arInbuf; 
  63   1              if (getlast == inlast)  //如果缓冲区数据已读取完
  64   1                      inbufEmptyFlg = 1;       
  65   1              ES = 1;
  66   1              return (c);        //取回数据
  67   1      }//////////////////////////////////////////////////////////////////////////////////
  68          
  69          //串口中断处理
  70          serial () interrupt 4 
  71          {   
  72   1              if (TI ) 
  73   1          {   
  74   2                      TI = 0;  
  75   2              if (!outbufEmptyFlg)              
  76   2              {
  77   3                              SBUF = *pOutlast; //未发送完继续发送
  78   3                      pOutlast++ ;            //最后传出去的字节位置加一
  79   3                      if (pOutlast == arOutbuf + OUTBUF_LENGTH) 
  80   3                                      pOutlast = arOutbuf;//地址到顶部回到底部
  81   3                      if (pPutlast == pOutlast) 
  82   3                                      outbufEmptyFlg = 1;   //数据发送完置发送缓冲区空标志                    
  83   3              } 
  84   2                  else 
  85   2                              sendoutEndFlg = 1;
  86   2          }
  87   1          if (RI)  
  88   1          {  
  89   2                      RI = 0; 
  90   2              if(!inbufFullFlg)
  91   2              {
  92   3                      *inlast = SBUF;            //放入数据            
  93   3                      inlast ++;                    //最后放入的位置加一 
  94   3                      inbufEmptyFlg = 0; 
  95   3                      if (inlast == arInbuf + INBUF_LENGTH) 
  96   3                                      inlast = arInbuf;//地址到顶部回到底部
  97   3                      if (inlast == getlast)  
  98   3                                      inbufFullFlg = 1;  //接收缓冲区满置满标志                 
  99   3              }
 100   2          }
 101   1      }//////////////////////////////////////////////////////////////////////////////////
 102          
 103          //串口初始化                
 104          serial_init ()  
 105          {
 106   1              TMOD = 0x20;                    
 107   1              TH1 = 256 - 12;         //1.5: 波特率19200; 3: 波特率9600; 6:波特率4800; 12:波特率2400   
 108   1              TL1 = 256 - 12; 
 109   1              SCON = 0x50;    //工作方式1              
 110   1              PCON &= 0xef;   // 波特率不倍增                                 
 111   1              TR1 = 1;
 112   1      }//////////////////////////////////////////////////////////////////////////////////
 113          
 114          //测试用主函数  
 115          void main( )
 116          {       
 117   1              unsigned char c;
C51 COMPILER V8.02   SERIAL_INT_2                                                          04/21/2008 06:36:30 PAGE 3   

 118   1              sendoutEndFlg = 1;              //BUF中最后一个数据发完标志,用于启动一组数据的发送
 119   1              outbufEmptyFlg = 1;             //输出缓冲区空标志              
 120   1              inbufEmptyFlg = 1;              //接收缓冲区空标志
 121   1              serial_init ();
 122   1      
 123   1              IE = 0X90;
 124   1              putstring("com");
 125   1              putstring("com");               
 126   1              while(1)        
 127   1              {
 128   2                      c = getbyte (); 
 129   2                      putbyte(c);     
 130   2              }
 131   1      
 132   1      }                                   
 133          
 134          
 135          
 136          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    507    ----
   CONSTANT SIZE    =      4    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     22       3
   IDATA SIZE       =   ----    ----
   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 + -