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

📄 uart.lst

📁 51单片机中的波特率发生器51 single-chip baud rate generator in
💻 LST
字号:
C51 COMPILER V7.06   UART                                                                  10/18/2008 15:01:24 PAGE 1   


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

stmt 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      
  34   1      
  35   1              bufwptr = 0;                                    // 写指针
  36   1              bufrptr = 0;                                    // 读指针
  37   1      
  38   1              PCON = 0x00;                                    // 设置串口波特率, 时钟频率30MHZ
  39   1                                              
  40   1              SCON = 0x50;                                    // 模式1
  41   1      
  42   1              TMOD=0x20;              // 定时器1作为波特率发生器
  43   1              TCON=0x00;
  44   1      
  45   1              TH1=BAUD[baudrate];
  46   1              TL1=BAUD[baudrate];                             // n = 65536 - [fosc/baud*32]
  47   1                                                                              // n = 65536 - 22118400/(57600*32) = 65536 - 12 = 65524 = 0xfff4
  48   1                              
  49   1              IP = 0x10;                                              // 串口中断优先级高
  50   1              REN = 1;
  51   1              TI = 0;
  52   1              RI = 0;
  53   1              ES = 1;                                                 // 使能串口中断
  54   1      }
  55          
C51 COMPILER V7.06   UART                                                                  10/18/2008 15:01:24 PAGE 2   

  56          void UartInt(void) interrupt 4 using 1
  57          {
  58   1              if(RI)
  59   1              {
  60   2                      ES = 0;
  61   2                      uartbuf = SBUF;
  62   2                      RI = 0;                                                  // 清中断标志
  63   2                      
  64   2                      uartbuff[bufwptr] = uartbuf;    // 数据写入缓冲区
  65   2                      if(bufwptr >= UARTBUFFLEN-1)    // 循环缓冲指针
  66   2                              bufwptr = 0;
  67   2                      else
  68   2                              bufwptr++;
  69   2                      if(bufwptr == bufrptr)                  // 未读数据被覆盖,读指针更新到写指针的上一个单元
  70   2                              bufrptr = bufwptr + 1;
  71   2      
  72   2                      ES = 1;
  73   2              }
  74   1      }
  75          
  76          void SendChar(unsigned char ch)
  77          {
  78   1              SBUF = ch;
  79   1              while(TI == 0);
  80   1              TI = 0;
  81   1      }
  82          
  83          /*
  84           * 发送字符串
  85          */
  86          void SendString(char *str)
  87          {
  88   1              while(*str)
  89   1              {
  90   2                      SendChar(*str);
  91   2                      str++;
  92   2              }
  93   1      }
  94          
  95          /*
  96           *      判断是否接收到数据,如果没有返回0,如果有,返回数据长度
  97           */
  98          unsigned char IsUartReceived(void)
  99          {
 100   1              unsigned char num;
 101   1              
 102   1              EA = 0;                                                 // 关中断
 103   1              if(bufwptr == bufrptr)
 104   1                      num = 0;
 105   1              else if(bufwptr > bufrptr)
 106   1                      num = (bufwptr-bufrptr);
 107   1              else // if(bufwptr < bufrptr) 
 108   1                      num = (UARTBUFFLEN-bufwptr+bufrptr);
 109   1              EA = 1;
 110   1              return num;
 111   1      }
 112          
 113          /*
 114           *      从缓冲区中读一个字节数据
 115           *      返回剩下的字节数
 116           */
 117          unsigned char ReadChar(unsigned char idata *buf)
C51 COMPILER V7.06   UART                                                                  10/18/2008 15:01:24 PAGE 3   

 118          {
 119   1              unsigned char ch, num;
 120   1      
 121   1              EA = 0;
 122   1              if(bufwptr == bufrptr)
 123   1              {
 124   2                      *buf = 0;
 125   2                      num = 0;
 126   2              }
 127   1              else if(bufwptr > bufrptr)
 128   1              {
 129   2                      ch = uartbuff[bufrptr];
 130   2                      *buf = ch;
 131   2                      bufrptr++;
 132   2                      num = (bufwptr-bufrptr);
 133   2              }
 134   1              else    // if(bufwptr < bufrptr) 
 135   1              {
 136   2                      ch = uartbuff[bufrptr];
 137   2                      *buf = ch;
 138   2                      bufrptr++;
 139   2                      if(bufrptr == UARTBUFFLEN)
 140   2                              bufrptr = 0;
 141   2                      num = (UARTBUFFLEN-bufrptr+bufwptr);
 142   2              }
 143   1      
 144   1              EA = 1;
 145   1              return num;
 146   1      }
 147          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    238    ----
   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 + -