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

📄 uart.lst

📁 GSm 与的通信
💻 LST
字号:
C51 COMPILER V8.02   UART                                                                  01/14/2009 17:21:16 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: d:\install\software\program\Keil\C51\BIN\C51.EXE uart.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          #include <intrins.h>
   3          #include <REGX52.h>
   4          #include "uart.h"
   5          
   6          
   7          static unsigned char idata uartbuf;
   8          static unsigned char idata bufwptr, bufrptr;
   9          unsigned char idata uartbuff[UARTBUFFLEN];
  10          
  11          /* 波特率设置表(22.1184MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
  12          //static unsigned char code BAUD[] = {0x70, 0xB8, 0xDC, 0xEE, 0xF4, 0xFA};
  13          /* 波特率设置表(11.0592MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
  14          static unsigned char code BAUD[] = {0xB8, 0xDC, 0xEE, 0xF7, 0xFA, 0xFD};
  15          
  16          /*
  17           *      初始化串口, 波特率57600
  18           */
  19          void UartInit(unsigned char baudrate)
  20          {
  21   1              ES = 0;
  22   1              TR2 = 0;
  23   1      
  24   1              bufwptr = 0;                                    // 写指针
  25   1              bufrptr = 0;                                    // 读指针
  26   1      
  27   1              PCON = 0x00;                                    // 设置串口波特率, 时钟频率30MHZ
  28   1              T2CON = 0x30;                                   // 定时器2作为波特率发生器
  29   1              SCON = 0x50;                                    // 模式1
  30   1                                                                              // n = 65536 - [fosc/baud*32]
  31   1                                                              // n = 65536 - 22118400/(57600*32) = 65536 - 12 = 65524 = 0xfff4
  32   1              RCAP2H = 0xff;                                  
  33   1              RCAP2L = BAUD[baudrate];                // baud rate 57600                      
  34   1              TH2 = 0xff;
  35   1              TL2 = BAUD[baudrate];
  36   1      
  37   1              IP = 0x10;                                              // 串口中断优先级高
  38   1              REN = 1;
  39   1              TI = 0;
  40   1              RI = 0;
  41   1              TR2 = 1;                                                // 启动定时器2
  42   1              ES = 1;                                                 // 使能串口中断
  43   1      }
  44          
  45          
  46          void SendASC(unsigned char ASC)
  47          {
  48   1      bit es;
  49   1      es=ES;
  50   1      ES=0;//关闭中断
  51   1      TI=0;
  52   1      SBUF=ASC;
  53   1      while(!TI);
  54   1      TI=0;
  55   1      ES=es;
C51 COMPILER V8.02   UART                                                                  01/14/2009 17:21:16 PAGE 2   

  56   1      }
  57          
  58          
  59          
  60          /*
  61           *  发送一个字节数据 
  62           */ 
  63          void SendChar(unsigned char ch)
  64          {
  65   1              SBUF = ch;
  66   1              while(TI == 0);
  67   1              TI = 0;
  68   1      }
  69          
  70          /*
  71           * 发送字符串
  72          */
  73          void SendString(char *str)
  74          {
  75   1              while(*str)
  76   1              {
  77   2                      SendChar(*str);
  78   2                      str++;
  79   2              }
  80   1      }
  81          
  82          /*
  83           *      判断是否接收到数据,如果没有返回0,如果有,返回数据长度
  84           */
  85          unsigned char IsUartReceived(void)
  86          {
  87   1              unsigned char num;
  88   1              
  89   1              EA = 0;                                                 // 关中断
  90   1              if(bufwptr == bufrptr)
  91   1                      num = 0;
  92   1              else if(bufwptr > bufrptr)
  93   1                      num = (bufwptr-bufrptr);
  94   1              else // if(bufwptr < bufrptr) 
  95   1                      num = (UARTBUFFLEN-bufwptr+bufrptr);
  96   1              EA = 1;
  97   1              return num; 
  98   1      }
  99          
 100          /*
 101           *      从缓冲区中读一个字节数据
 102           *      返回剩下的字节数
 103           */
 104          unsigned char ReadChar(unsigned char idata *buf)
 105          {
 106   1              unsigned char ch, num;
 107   1      
 108   1              EA = 0;
 109   1              if(bufwptr == bufrptr)
 110   1              {
 111   2                      *buf = 0;
 112   2                      num = 0;
 113   2              }
 114   1              else if(bufwptr > bufrptr)
 115   1              {
 116   2                      ch = uartbuff[bufrptr];
 117   2                      *buf = ch;
C51 COMPILER V8.02   UART                                                                  01/14/2009 17:21:16 PAGE 3   

 118   2                      bufrptr++;
 119   2                      num = (bufwptr-bufrptr);
 120   2              }
 121   1              else    // if(bufwptr < bufrptr) 
 122   1              {
 123   2                      ch = uartbuff[bufrptr];
 124   2                      *buf = ch;
 125   2                      bufrptr++;
 126   2                      if(bufrptr == UARTBUFFLEN)
 127   2                              bufrptr = 0;
 128   2                      num = (UARTBUFFLEN-bufrptr+bufwptr);
 129   2              }
 130   1      
 131   1              EA = 1;
 132   1              return num;
 133   1      }
 134          
 135          
 136          /*
 137           *      串口中断接受 
 138           */
 139          void UartInt(void) interrupt 4 using 1
 140          {
 141   1              if(RI)
 142   1              {
 143   2                      ES = 0;
 144   2                      uartbuf = SBUF;
 145   2                      RI = 0;                                                  // 清中断标志
 146   2                      
 147   2                      uartbuff[bufwptr] = uartbuf;    // 数据写入缓冲区
 148   2                      if(bufwptr >= UARTBUFFLEN-1)    // 循环缓冲指针
 149   2                              bufwptr = 0;
 150   2                      else
 151   2                              bufwptr++;
 152   2                      if(bufwptr == bufrptr)                  // 未读数据被覆盖,读指针更新到写指针的上一个单元
 153   2                              bufrptr = bufwptr + 1;
 154   2      
 155   2                      ES = 1;
 156   2              }
 157   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    266    ----
   CONSTANT SIZE    =      6    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =     35    ----
   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 + -