📄 timer2.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 + -