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

📄 timer2.lst

📁 太欣单片机STK6031的测试程序
💻 LST
字号:
C51 COMPILER V8.08   TIMER2                                                                10/25/2007 11:42:08 PAGE 1   


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

line level    source

   1          
   2          #include "STK6031.h"
   3          
   4          //********************************************************************************
   5          //定义数据类型
   6          typedef unsigned char uint8;
   7          typedef unsigned int  uint16;
   8          typedef unsigned long uint32;
   9          
  10          sbit P4_0 = P4^0;
  11          
  12          //以下宏定义用来选择TIMER2 工作方式
  13          
  14          #define CAP_RL   1
  15          
  16          /*
  17          ********************************************************************************  
  18          *       函 数 名:InitMCU
  19          *       功能描述:初始化MCU,其中包括初始化各I/O口,CHIPCON,
  20                                        CKCON
  21          *       输    入: 无
  22          *       返    回: 无
  23          ********************************************************************************
  24          */      
  25          
  26          void InitMcu(void)
  27          {
  28   1              P0              = 0xFF;      //初始化各I/O 口
  29   1              P1              = 0xFF;
  30   1              P2              = 0xFF;
  31   1              P3              = 0xFF;
  32   1              P4              = 0x0F;
  33   1      
  34   1              CHIPCON = 0x1A;  // 设置CPUCLK=XTAL1/3,允许访问片内AUX 存储器,禁止ALE 输出,允许低电压复位
  35   1              CKCON = 0x39;  // 设置TIMER0,TIMER1,TIMER2 的计数频率为CPUCLK/4, 设置MOVX 指令访问外部AUX 存储器的时间为3
             - 个机器周期
  36   1              
  37   1      }
  38          
  39          
  40          #if CAP_RL
  41          
  42          sbit P1_1 = P1^1;
  43          
  44          uint16 Capturebuf[2];  
  45          uint8 Eventtimes=0;    
  46          uint8 Timesbuf[2];      
  47          uint8 I=0;                  
  48          uint32 Dtime;
  49          
  50          
  51          /*
  52          ********************************************************************************
  53          *       函 数 名: Delay
  54          *       功能描述: 延时函数,延时的间隔是1ms
C51 COMPILER V8.08   TIMER2                                                                10/25/2007 11:42:08 PAGE 2   

  55          *       输    入: Time  :控制延时的间隔
  56          *       返    回: 无
  57          ********************************************************************************
  58          */
  59          
  60          void Delay(uint16 Time)
  61          {
  62   1              uint8 i;
  63   1      
  64   1      //      需要执行2000个指令周期
  65   1              while(Time--)  {
  66   2                      i = 199;
  67   2                      while(i--);   //这一段将执行10个指令周期
  68   2                      }
  69   1      }
  70          
  71          
  72          /*
  73          ********************************************************************************  
  74          *       函 数 名:
  75          *       功能描述:定时/ 计数器T2 程序,中断方式
  76          *       输    入: 无
  77          *       返    回: 无
  78          ********************************************************************************
  79          */
  80          
  81          //TIMER2 工作在允许捕获功能的定时模式,用来计算T2EX 脚输入脉冲周期
  82          //设晶振为24M
  83          //T2EX 脚脉冲周期计算公式0.5us*[65536*(Timesbuf[1]-Timesbuf[0])+Capturebuf[1]-Capturebuf[0]]
  84          
  85          void TM2CPtimer(void)
  86          {                                       
  87   1              EXEN2 = 1;  // T2 允许外部中断
  88   1              C_T2 = 0;  // T2 工作在定时模式
  89   1              CP_RL2 = 1;  //  T2 工作在捕获模式
  90   1              ET2 = 1;  // 允许T2 中断
  91   1              EA = 1;  // CPU 开中断
  92   1              TR2 = 1;      //  开启TIMER2,开始定时
  93   1      
  94   1      // 下面指令用来模拟外部的输入脉冲       
  95   1              Delay(1);
  96   1              P1_1 = 0;
  97   1              Delay(20);
  98   1              P1_1 = 1;
  99   1              Delay(20);
 100   1              P1_1 = 0;
 101   1              Delay(1);
 102   1              
 103   1              Dtime = ((65536*(Timesbuf[1]-Timesbuf[0])+Capturebuf[1]-Capturebuf[0])/2000);
 104   1              TR2 = 0;
 105   1              ET2 = 0;
 106   1              
 107   1              while(1)
 108   1                      {
 109   2                              Delay(Dtime);
 110   2                              P4_0 = ~P4_0;
 111   2                      }
 112   1              
 113   1      }
 114          
 115          //中断程序5,定时中断2
 116          
C51 COMPILER V8.08   TIMER2                                                                10/25/2007 11:42:08 PAGE 3   

 117          void ISR_T2(void) interrupt INTERRUPT_TIMER2
 118          {      
 119   1              if(TF2)    //  如果中断是溢出引起的则溢出次数+ 1
 120   1                      {
 121   2                      Eventtimes++;
 122   2                      TF2 = 0;          // 清除TF2 溢出标志位 
 123   2                      }
 124   1              if(EXF2)  // 如果中断是T2EX 脚下降沿信号触发的,则把当前捕获的结果存入寄存器
 125   1                      {
 126   2                      EXF2 = 0;   // 清除外部中断标志
 127   2                      if(I<2)      // 该条件是为限制多于两次捕获而设
 128   2                              {
 129   3                              Capturebuf[I] = ((uint16)RCAP2H<<8) + RCAP2L;  // 把当前捕获的结果存入寄存器
 130   3                              Timesbuf[I] = Eventtimes;  // 把溢出次数存入寄存器
 131   3                              I++;   //指向下一个地址
 132   3                              }
 133   2                      } 
 134   1      }       
 135          
 136          void main(void)
 137          {
 138   1              InitMcu();
 139   1              TM2CPtimer();
 140   1      }
 141          
 142          
 143          #else
              
              
              //TIMER2 工作在不受T2EX 脚影响的自动装载初值模式
              //设晶振为24M,需要定时时间为 5ms
              
              void main(void)
              {                       
                      InitMcu();
                      EXEN2 = 0;  // T2 禁止外部中断
                      C_T2 = 0;  // T2 工作在定时模式
                      CP_RL2 = 0;  //  T2 工作在自动装载模式
                      TH2 = 0xD8;  // 装入16 位计数初值,要产生10ms的定时需要计数10000次
                      TL2 = 0xF0;  //  65536-10000=55536=D8F0H
                      RCAP2H = 0xD8;   //  装载着TH2的初值,当溢出后自动向TH2 装载该初值
                      RCAP2L =  0xF0;   //  装载着TL2的初值,当溢出后自动向TL2 装载该初值
                      ET2 = 1;  // 允许T2 中断
                      EA = 1;  // CPU 开中断
                      TR2 = 1;      //  开启TIMER2,开始定时
                      while(1);  //等待中断
              }
              
              //中断程序5,定时中断2
              
              void ISR_T2(void) interrupt INTERRUPT_TIMER2
              {      
                      TF2 = 0;   //  清除溢出标志位TF2
                      P4_0 = ~P4_0;
              }       
              
              #endif
 174          
 175          


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V8.08   TIMER2                                                                10/25/2007 11:42:08 PAGE 4   

   CODE SIZE        =    291    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12    ----
   IDATA SIZE       =   ----    ----
   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 + -