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

📄 serial.lst

📁 基于51单片机和RTL8019以太网控制器的嵌入式以太网控制程序。
💻 LST
字号:
C51 COMPILER V8.02   SERIAL                                                                09/21/2006 20:16:31 PAGE 1   


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

line level    source

   1          //波特率计算公式:
   2          //        TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
   3          //    其中:SMOD=0,1;Fosc=晶体或晶振频率;Bound=波特率
   4          //    本例中,SMOD=0;Fosc=20*10E6;Bound=300,所以TH1=0x52。
   5          //Baud rate(20Mhz)
   6          //300(52);1200(D5);2400(EA);4800(F5);9600(FB);19200(FD);38400(FF);
   7          //应用举例:(可在KEIL仿真环境下运行)
   8          //源程序文件:serial.h/serial.c/main.c
   9          //main.c内容:
  10          
  11          #include <general.h>
  12          
  13          sbit P10=P1^0;
  14          unsigned char xdata TxBuf[LenTxBuf],RxBuf[LenRxBuf];//收发缓冲区实体
  15          unsigned char xdata *inTxBuf,*outTxBuf, *inRxBuf,*outRxBuf;//收发缓冲区读写指针
  16          //inRxBuf指向收的收,outRxBuf指向收缓冲区的读。
  17          
  18          bit TIflag=1;//Note:It must be 1.
  19          unsigned char xdata bRxFull;            //标志收缓冲区是否溢出
  20          unsigned char xdata bFullSend;          //收缓冲区是否溢出是否已发送满命令
  21          unsigned char xdata bEptSend;           //收缓冲区空时是否已发空命令
  22          void InitSerial()//串口初始化
  23          {
  24   1              TMOD=TMOD&0x0F;
  25   1              TMOD=TMOD|0x20;
  26   1              TL1=0xF7,TH1=0xF7;//19200 , 32MHz
  27   1              SCON=0x50;PCON=0x80;
  28   1              TR1=1;
  29   1      }
  30          
  31          void InitSerialBuffer(void)//串口缓冲区初始化
  32          {
  33   1              inTxBuf = TxBuf;
  34   1              outTxBuf = TxBuf;
  35   1              inRxBuf = RxBuf;
  36   1              outRxBuf = RxBuf;
  37   1              bRxFull = FALSE;                //收缓冲区非满
  38   1              bFullSend = FALSE;
  39   1              bEptSend = TRUE;
  40   1              EA=1;
  41   1              ES=1;
  42   1      }
  43          
  44          /************************************************/
  45          void serial(void) interrupt 4
  46          {//串口中断服务子程序
  47   1              unsigned char *t;
  48   1      
  49   1              if(TI)
  50   1              {
  51   2                      TI=0;
  52   2                      if(inTxBuf==outTxBuf) 
  53   2                      {
  54   3                              TIflag=1;
  55   3                      }//TxBuf Empty
C51 COMPILER V8.02   SERIAL                                                                09/21/2006 20:16:31 PAGE 2   

  56   2                      else
  57   2                      {
  58   3                              SBUF=*outTxBuf; outTxBuf++;
  59   3                              if(outTxBuf==TxBuf+LenTxBuf) 
  60   3                                      outTxBuf=TxBuf;
  61   3                      }
  62   2              }
  63   1              if(RI)
  64   1              {
  65   2                      //这里,缓冲区的读写方式跟8019as的ram区一样,是循环读,而且也用了
  66   2                      //两个指针,一个用来收,一个用来读
  67   2                      RI=0;
  68   2                      t=inRxBuf;
  69   2                      t++;                            //保留指针位置
  70   2                      if(t==RxBuf+LenRxBuf) 
  71   2                              t=RxBuf;        //如果到缓冲区末尾,则返回缓冲区头
  72   2                      if(t!=outRxBuf)
  73   2                      {
  74   3                              //如果相等,说明缓冲区满了,RxBuf Full
  75   3                              *inRxBuf=SBUF;
  76   3                              inRxBuf=t;
  77   3                      }
  78   2                      else
  79   2                      {
  80   3                              bEptSend = FALSE;       //在满了之后,需等待发送空信号
  81   3                              bFullSend =FALSE;
  82   3                              bRxFull = TRUE;         //收缓冲区满
  83   3                      }
  84   2              }
  85   1      }
  86          //------------------------------------------------------------------------
  87          //函数功能://从串口缓冲区读1字节数据,并对缓冲区状态进行检查。如果满了,则
  88          //                      发送缓冲区满信号,如果为空,则发送缓冲区为空信号。
  89          //
  90          //入参:发送区指针,TCP包的长度(包括头部)
  91          //
  92          //
  93          //
  94          //
  95          //作者:
  96          //
  97          //注意:
  98          //
  99          //
 100          //注释:        Mingtree
 101          //日期:        2004-11-10
 102          //修改:    2005-12-01  为了实现接收串口的数据,对缓冲区溢出情况进行处理
 103          
 104          //------------------------------------------------------------------------
 105          bit Mygetch(unsigned char xdata *ch)
 106          {
 107   1              ES = 0;
 108   1              //接收缓冲区满,则发送full信号
 109   1              if(bRxFull && !bFullSend)
 110   1              {
 111   2                      bFullSend = TRUE;
 112   2                      PrintStr("full");
 113   2              }
 114   1              if(inRxBuf == outRxBuf) 
 115   1              {
 116   2                      //为空
 117   2                      ES = 1;
C51 COMPILER V8.02   SERIAL                                                                09/21/2006 20:16:31 PAGE 3   

 118   2                      bRxFull = FALSE;
 119   2                      if(!bEptSend)
 120   2                      {
 121   3                              bEptSend = TRUE;
 122   3                              PrintStr("empty");
 123   3                      }
 124   2                      return 0;
 125   2              }       //RxBuf Empty
 126   1              *ch=*outRxBuf;  
 127   1              outRxBuf++;                             //数据被读走,读指针加1
 128   1              if(outRxBuf == RxBuf+LenRxBuf)
 129   1              {
 130   2                      outRxBuf = RxBuf;       //如果读指针到缓冲区尾部,则返回到头部
 131   2              }
 132   1              ES = 1;
 133   1              return 1;
 134   1      }
 135          
 136          void PrintChar(unsigned char ch)//显示字符
 137          {
 138   1              unsigned char *t;
 139   1      
 140   1              ES = 0;
 141   1              if(TIflag)
 142   1              {
 143   2                      TIflag = 0;
 144   2                      TI = 1;
 145   2              }
 146   1              t = inTxBuf;t++;
 147   1              if(t == TxBuf+LenTxBuf) t = TxBuf;
 148   1              if(t == outTxBuf) 
 149   1              {
 150   2                      ES = 1;
 151   2                      return;
 152   2              }//TxBuf Full
 153   1              *inTxBuf = ch;
 154   1              inTxBuf = t;
 155   1              ES=1;
 156   1      }
 157          
 158          void PrintCh(unsigned char ch)//内部使用,不建议用户看到。
 159          {
 160   1              if(ch>=0&&ch<=9) ch=ch+'0';
 161   1              else if(ch>=10&&ch<=15) ch=ch+'A'-10;
 162   1              PrintChar(ch);
 163   1      }
 164          
 165          void PrintByte(unsigned char Byte)//以十六进制格式显示1个字节数据
 166          {
 167   1              unsigned char c;
 168   1              c=Byte;
 169   1              c=c>>4;PrintCh(c);
 170   1              c=Byte;c=c&0x0F;PrintCh(c);
 171   1      }
 172          
 173          void PrintWord(unsigned int Word)//以十六进制格式显示1个字数据
 174          {
 175   1              PrintByte(Word>>8);
 176   1              PrintByte(Word&0xFF);
 177   1      }
 178          
 179          void PrintLong(unsigned long LongWord)//以十六进制格式显示1个长字数据
C51 COMPILER V8.02   SERIAL                                                                09/21/2006 20:16:31 PAGE 4   

 180          {
 181   1              PrintWord(LongWord>>16);
 182   1              PrintWord(LongWord&0xFFFF);
 183   1      }
 184          
 185          void PrintStr(unsigned char *str)//显示字符串
 186          {
 187   1              int i;
 188   1              unsigned char j;
 189   1              unsigned char ch;
 190   1              for(i=0;i<MaxLenStr;i++){
 191   2                      ch=*(str+i);
 192   2                      if(ch=='\0') break;
 193   2                      else if(ch=='\n'){PrintChar(10);PrintChar(13);}
 194   2                      else if(ch=='\t'){
 195   3                              for(j=0;j<TABNum;j++)
 196   3                                      PrintChar(' ');
 197   3                      }
 198   2                      else PrintChar(ch);
 199   2              }
 200   1      }
 201          
 202          void PrintRec(unsigned char xdata *str)//显示字符串
 203          {
 204   1              int i;
 205   1              unsigned char ch;
 206   1              for(i=0;i<MaxLenStr;i++){
 207   2                      ch=*(str+i);
 208   2                      if(ch=='\0') break;
 209   2                      else PrintChar(ch);
 210   2              }
 211   1      }
 212          void Mystrlwr(unsigned char xdata *str)//将字符串全部转换成小写格式
 213          {
 214   1              int i;
 215   1              unsigned char ch;
 216   1              for(i=0;1;i++){
 217   2                      ch=*(str+i);
 218   2                      if(ch=='\0') break;
 219   2                      else if(ch>='A'&&ch<='Z') *(str+i)=ch-'A'+'a';
 220   2              }
 221   1      }
 222          
 223          //------------------------------------------------------------------------
 224          //函数功能:把收到的命令进行数字和字母的分离,之间用空格隔开
 225          //
 226          //入参:        接收命令缓冲区指针ComBuf,分离后缓冲区指针WordTable
 227          //
 228          //返回值:  分离成功1,失败0
 229          //
 230          //作者:        Mingtree
 231          //
 232          //注释:        Mingtree
 233          //日期:        2004-09-29
 234          //------------------------------------------------------------------------
 235          bit GetWord(unsigned char xdata  * ComBuf,WORDTABLE xdata *  WordTable)
 236          {
 237   1              unsigned char i=0;      /*ComBuf String pointer*/
 238   1              unsigned char j;
 239   1              //对命令包进行调整,去掉数据类型字段和有效数据长度字段
 240   1              for(i = 0 ; i < CMDLEN ; i++)
 241   1                      ComBuf[i] = ComBuf[i+2];
C51 COMPILER V8.02   SERIAL                                                                09/21/2006 20:16:31 PAGE 5   

 242   1              //找到空格的位置
 243   1              i = 0;
 244   1              while(i<MaxLenComBuf)
 245   1              {
 246   2                      if(ComBuf[i]==32)
 247   2                              break;
 248   2                      i++;
 249   2              }
 250   1              if(i!=0)
 251   1              {
 252   2                      //进行分离
 253   2                      //取得命令
 254   2                      for(j=0;j<i;j++)
 255   2                              WordTable->wt[0].Str[j]=ComBuf[j];
 256   2                      WordTable->wt[0].Length=i;
 257   2                      WordTable->wt[0].Str[j]='\0';
 258   2                      //取得数字
 259   2                      j++;
 260   2                      for(i=0;i<MaxCmd-WordTable->wt[0].Length;i++)
 261   2                      {
 262   3                              WordTable->wt[1].Str[i]=ComBuf[j];
 263   3                              j++;
 264   3                      }
 265   2                      WordTable->wt[1].Length=i;
 266   2                      WordTable->wt[1].Str[i]='\0';
 267   2                      return 1;
 268   2              }
 269   1              else
 270   1                      return 0;
 271   1      
 272   1      }
 273          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1091    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =    763    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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