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

📄 uart.lst

📁 串口通信
💻 LST
字号:
C51 COMPILER V7.20   UART                                                                  04/13/2006 13:41:59 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN uart.OBJ
COMPILER INVOKED BY: C:\Keil_C51\C51\BIN\C51.EXE uart.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*
   2           *      Copyright (C) 2006, 华中科技大学电气与电子科技创新中心
   3           *      All Rights Reserved.
   4           *      
   5           *      文件名:         uart.c
   6           *      文件描述:       串口驱动主程序文件
   7           *                      
   8           *      当前版本:       1.0
   9           *      作者:           SangWei(swkyer@gmail.com)
  10           *      完成日期:       2005年12月12日
  11           *      
  12          */
  13          #include <intrins.h>
  14          #include <REGX52.h>
  15          #include "uart.h"
  16          
  17          
  18          static unsigned char idata uartbuf;
  19          static unsigned char idata bufwptr, bufrptr;
  20          unsigned char idata uartbuff[UARTBUFFLEN];
  21          
  22          /* 波特率设置表(22.1184MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
  23          //static unsigned char code BAUD[] = {0x70, 0xB8, 0xDC, 0xEE, 0xF4, 0xFA};
  24          /* 波特率设置表(11.0592MHZ), 4800, 9600, 19200, 38400, 57600, 115200 */
  25          static unsigned char code BAUD[] = {0xB8, 0xDC, 0xEE, 0xF7, 0xFA, 0xFD};
  26          
  27          /*
  28           *      初始化串口, 波特率57600
  29           */
  30          void UartInit(unsigned char baudrate)
  31          {
  32   1              ES = 0;
  33   1              TR2 = 0;
  34   1      
  35   1              bufwptr = 0;                                    // 写指针
  36   1              bufrptr = 0;                                    // 读指针
  37   1      
  38   1              PCON = 0x00;                                    // 设置串口波特率, 时钟频率30MHZ
  39   1              T2CON = 0x30;                                   // 定时器2作为波特率发生器
  40   1              SCON = 0x50;                                    // 模式1
  41   1                                                                              // n = 65536 - [fosc/baud*32]
  42   1                                                                              // n = 65536 - 22118400/(57600*32) = 65536 - 12 = 65524 = 0xfff4
  43   1              RCAP2H = 0xff;                                  
  44   1              RCAP2L = BAUD[baudrate];                // baud rate 57600                      
  45   1              TH2 = 0xff;
  46   1              TL2 = BAUD[baudrate];
  47   1      
  48   1              IP = 0x10;                                              // 串口中断优先级高
  49   1              REN = 1;
  50   1              TI = 0;
  51   1              RI = 0;
  52   1              TR2 = 1;                                                // 启动定时器2
  53   1              ES = 1;                                                 // 使能串口中断
  54   1      }
  55          
C51 COMPILER V7.20   UART                                                                  04/13/2006 13:41:59 PAGE 2   

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    246    ----
   CONSTANT SIZE    =      6    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =     35    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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