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

📄 testcom.lst

📁 Keil C 51单片机串口通信程序, 通过该程序可以了解和使用单片机串口通信
💻 LST
字号:
C51 COMPILER V6.23a  TESTCOM                                                               04/26/2006 10:11:10 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE TESTCOM
OBJECT MODULE PLACED IN TESTCOM.OBJ
COMPILER INVOKED BY: E:\Keil C V6.23\C51\BIN\C51.EXE TESTCOM.C

stmt level    source

   1          #include <CPU.H>
   2          
   3          // 类型定义
   4          #define BYTE unsigned char
   5          #define UINT unsigned int
   6          #define BOOL unsigned int
   7          #define ULNG unsigned long
   8          
   9          ///////////////////
  10          // 硬件引脚功能定义 //
  11          ///////////////////
  12          sbit bCSX = P1^4; // p1.4(PLCC44-P6)为程序运行指示,低电平亮;
  13          
  14          ////////////
  15          // 时钟计数 //
  16          ////////////
  17          BYTE ucMsCount;     // 用于1ms计时(受GPS脉冲控制)
  18          UINT uiMsNow;       // 当前毫秒数(受GPS脉冲控制)
  19          bit  b250MsPassed;  // 已经过了250毫秒, LED-RUN
  20          bit  bOneSecPassed; // 已经过了1秒
  21          BYTE ucSecCount;    // 用于1s计时(受GPS脉冲控制)
  22          bit  bOneMinPassed; // 每分钟,重新初始化一次串口,以提高可靠性
  23          
  24          // 中断服务初始化
  25          void vInterruptInitialize()
  26          {
  27   1              // =====================================================
  28   1              // IE:中断允许寄存器;复位后:IE = 0x00;1允许,0-禁止;
  29   1              // =====================================================
  30   1              //   D7    D6    D5    D4    D3    D2    D1    D0
  31   1              // -----------------------------------------------------
  32   1              //   EA          ET2   ES    ET1   EX1   ET0   EX0
  33   1              // -----------------------------------------------------
  34   1              //  EX0,EX1:外部中断0、1的中断允许位;
  35   1              //  ET0,ET1:定时器/计数器0、1(T/C0,T/C1)溢出中断允许位;
  36   1              //  ES:串口中断允许位;
  37   1              //  ET2:定时器/计数器2(T/C2)溢出中断允许位;
  38   1              //  EA:CPU总的中断允许;
  39   1              // -----------------------------------------------------
  40   1      
  41   1              // =================================================
  42   1              // IP:中断优先级寄存器;复位后:IP = 0x00;1→高,0→低;
  43   1              // =================================================
  44   1              //   D7    D6    D5    D4    D3    D2    D1    D0
  45   1              // -------------------------------------------------
  46   1              //               PT2   PS    PT1   PX1   PT0   PX0
  47   1              // -------------------------------------------------
  48   1              // PX0,PX1:外部中断0、1中断优先级控制位;
  49   1              // PT0,PT1:定时器/计数器0、1中断优先级控制位;
  50   1              // PS:串口中断优先级控制位;
  51   1              // PT2:定时器/计数器2(T/C2)中断优先级控制位;
  52   1              // -------------------------------------------------
  53   1      
  54   1              // ======================================================
  55   1              // TCON:定时器/计数器控制寄存器;复位后:TCON = 0x00
C51 COMPILER V6.23a  TESTCOM                                                               04/26/2006 10:11:10 PAGE 2   

  56   1              // ======================================================
  57   1              //   D7    D6    D5    D4    D3    D2    D1    D0
  58   1              // --------------------------------------------------------
  59   1              //   TF1   TR1   TF0   TR0   IE1   IT1   IE0   IT0
  60   1              // --------------------------------------------------------
  61   1              // TF1,TF0:定时器x溢出中断标志,当定时器x溢出时由内部硬件至置位,
  62   1              //          当CPU转向中断服务程序时,由内部硬件清除;
  63   1              // TR1,TR0:定时器运行控制位,由软件置位、清除来控制定时器开启、关闭;
  64   1              // IE1,IE0:外部触发中断请求标志;
  65   1              // IT1,IT0:外部中断触发方式,1-下降沿触发;0-低电平触发;
  66   1              // --------------------------------------------------------
  67   1      
  68   1              EA = 0;  // 中断允许总控制
  69   1      
  70   1              EX0 = 0; // 外部中断0允许
  71   1              EX1 = 0; // 外部中断1允许
  72   1              IT0 = 0; // 外部中断0外下降沿有效
  73   1              IT1 = 0; // 外部中断1外下降沿有效
  74   1              PS = 1;  // 串口中断优先级高
  75   1              ES = 1;  // 串口中断使能
  76   1              PX0 = 0; // 外部中断0优先级低
  77   1              PX1 = 0; // 外部中断1优先级低
  78   1              ET1 = 0; // 定时器1禁止中断
  79   1      
  80   1              // =================================================
  81   1              // TMOD: 定时器工作方式控制寄存器,复位后TMOD = 0x00
  82   1              // =================================================
  83   1              //  D7   D6   D5   D4   D3   D2   D1   D0
  84   1              // -------------------+---------------------------
  85   1              //  GATE C//T M1   M0 | GATE C//T M1   M0
  86   1              // -------------------+---------------------------
  87   1              // ------ 定时器1 -----+--- 定时器0 ---------------
  88   1              // M1、M0:工作方式设置;
  89   1              //       00-13位计数器;
  90   1              //       01-16位计数器;
  91   1              //       10-可自动再装入的8位计数器(从THx中自动装到TLx中);
  92   1              //       11-把定时器分为两个8为的计数器或关闭定时器1;
  93   1              // C//T:1-计数器功能,0-定时器功能;
  94   1              // GATE:选通控制;1-同时/INTx为高电平且TRx为1时选通定时器x;
  95   1              //       0-每当TRx为1时就选通定时器x;
  96   1              // -----------------------------------------------------
  97   1      
  98   1          // 定时器/计数器0初始化
  99   1              TMOD = (TMOD & 0xF0) | 0x2; // T0工作于:10-可自动再装入的8位计数器(从THx中自动装到TLx中);
 100   1              // 22.1184MHz / 12分频 = 计数频率为1.8432MHz,100个us的设置
 101   1              // (2^8 - TL) / (1.8432 * 10^6) = 10^(-4) ==> TL ≈ 72
 102   1              TH0 = TL0 = 72;
 103   1              ET0 = 1; // 定时器0允许中断
 104   1              TR0 = 1; // T0使能
 105   1      
 106   1              EA = 1;  // 中断允许总控制
 107   1      }
 108          
 109          // 串口初始化
 110          #define cnBaudRate  19200 // 19200bps、8、N、1
 111          #define cnFosc   22118400 // 当前晶振: 22.1184MHz
 112          
 113          bit bComSendBufEmpty; // 串口的发送缓冲区空的标志: 用于启动TI
 114          
 115          void vSerialInitialize()
 116          {
 117   1              // =====================================================================
C51 COMPILER V6.23a  TESTCOM                                                               04/26/2006 10:11:10 PAGE 3   

 118   1              // SCON:串口控制寄存器;复位后:SCON = 0x00;
 119   1              // =====================================================================
 120   1              //   D7    D6    D5    D4    D3    D2    D1    D0
 121   1              // ---------------------------------------------------------------------
 122   1              //   SM0   SM1   SM2   REN   TB8   RB8   TI    RI
 123   1              // ---------------------------------------------------------------------
 124   1              // SM1.SM0串口工作方式控制:
 125   1              //      00-同步移位寄存器fosc/12;移位寄存器工作方式;
 126   1              //      01-异步收发,由定时器控制;8位数据位的UART工作方式;
 127   1              //      10-异步收发,fosc/32或fosc/64;9位数据位的UART工作方式;
 128   1              //      11-异步收发,由定时器控制;9位数据位的UART工作方式;
 129   1              //   波特率:
 130   1              //      00-同步fosc/12;
 131   1              //      01.03-异步,
 132   1              //         1. 16位定时器1的溢出中断,2^SMOD * 定时器1的溢出率 / 32;例,要
 133   1              //            取得110bps,定时器1的溢出率为32*110=3520,定时器1是加1定时器,
 134   1              //            每12个振荡周期加1,因此当fosc=12MHz时,定时器每隔284us中断一次:
 135   1              //              fosc / (12 * 3520) = 12 * 10^6 / (12 * 2520) = 284us
 136   1              //            考虑到溢出中断后CPU响应中断以及进行TH、TL的软件重装需要时间,
 137   1              //            因此扣除8个us,则定时器1在装入后定时276us发生一次中断,可以计算
 138   1              //            得到TH1=FEH、TL1=EBH。
 139   1              //                           常用波特率与其他参数的选取关系
 140   1              //            --------------------------------------------------------------
 141   1              //              串口     波特率    fosc=6MHz     fosc=12MHz   fosc=11.0592Hz
 142   1              //             工作方式         SMOD TMOD TH1  SMOD TMOD TH1  SMOD TMOD TH1
 143   1              //            --------------------------------------------------------------
 144   1              //              方式0      1M                    x   x   x
 145   1              //            --------------------------------------------------------------
 146   1              //              方式2     375k                   1   x   x
 147   1              //                      187.5k   1    x   x      0   x   x
 148   1              //            --------------------------------------------------------------
 149   1              //                       62.5k                   1   20  FF
 150   1              //                       19.2k                                  1  20  FD
 151   1              //                        9.6k                                  0  20  FD
 152   1              //                        4.8k                   1   20  F3     0  20  FA
 153   1              //              方式1     2.4k    1   20   F3    0   20  F3     0  20  F4
 154   1              //                或      1.2k    1   20   E6    0   20  E6     0  20  E8
 155   1              //              方式3      600    1   20   CC    0   20  CC     0  20  D0
 156   1              //                         300    0   20   CC    0   20  98     0  20  A0
 157   1              //                       137.5    1   20   1D    0   20  1D     0  20  2E
 158   1              //                         110    0   20   72    0   10  FEEB   0  10 FEFF
 159   1              //            --------------------------------------------------------------
 160   1              //         2. 自动重载方式的定时器2,TMOD=0010xxxx,则2^SMOD * fosc / (32 * 12 * (256 - TH1));
 161   1              //         3. SMOD为PCON的最高位;
 162   1              //      02-异步,fosc/32或fosc/64;
 163   1              // SM2:多机通信控制为:1-收到第9位(RB8)为1,RI置1;0-接收到字符RI就置1;方式0时,SM2应为0;
 164   1              // REN:串口接收允许位:1-允许;0-禁止;
 165   1              // TB8:方式2和3时为发送的第9位数据,由软件置位或清零;可以作为奇偶校验位,或多机通信中表示地址或数据(1/
             -0);
 166   1              // RB8:方式2和3时为接收到的第9位数据,作为奇偶校验位,或多机通信的地址或数据(1/0);方式1时,为接收到的

⌨️ 快捷键说明

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