📄 timer.lst
字号:
C51 COMPILER V7.07 TIMER 12/06/2003 18:49:09 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN timer.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE source\timer.c LARGE BROWSE ORDER NOAREGS DEBUG OBJECTEXTEND PRINT(.\timer.
-lst) OBJECT(timer.obj)
stmt level source
1 //////////////////////////////////////////////
2 // timer.c //
3 // 1毫秒系统时钟 //
4 // 自定义时间长度中断调用 //
5 // 预定义时间长度中断调用 //
6 // design by: 刘俐训 //
7 //////////////////////////////////////////////
8
9 #include<reg52.h>
10 #include"timer.h"
11 #include <c51rx2.h>
12
13 #ifndef enable
#define enable() EA=1
#define disable() EA=0
#endif
17
18 #ifndef CLK
#define CLK
#define CLK11M0592 0
#define CLK12M0000 1
#define CLK14M7456 3
#define CLK24M0000 2
#endif
25
26 #ifndef BZFRQ
#define BZFRQ
#define BZFRQ2K 0
#define BZFRQ4K 1
#endif
31
32 #ifndef NULL
#define NULL (void *)0
#endif
35
36 #define USER_TIMER TL0
37 #define SYS_TIMER TH0
38 #define TF_USER TF0
39 #define TF_SYS TF1
40
41 unsigned int data MS; //整型,长时间
42 unsigned char data MSbyte; //字节型,外部调用时提高速度
43
44 static unsigned char SysClk;
45 static unsigned char data UserLoop;
46 static unsigned char data UserReload;
47 static unsigned char data SysLoop = 3;
48 static unsigned char data SysReload = 104;
49 static bit UserTimerMode = 0;
50
51 static unsigned int data bztime;
52 static bit bzstart;
53 /*
54 unsigned char TimerGetMSbyte(void)
C51 COMPILER V7.07 TIMER 12/06/2003 18:49:09 PAGE 2
55 {
56 static unsigned char data loops=0;
57 if(!TF_SYS) return MSbyte;
58 TF_SYS = 0;
59 loops++;
60 if(loops<=SysLoop) return MSbyte;
61 TH0 += SysReload; //重装TH0
62 loops=0;
63 MSbyte++;
64 return MSbyte;
65 }
66 */
67 void IntUserTimer(void) interrupt TF0_VECTOR using 2
68 {
69 1 static unsigned char data loops=0;
70 1 loops++;
71 1 if(loops<=UserLoop) return;
72 1 TL0 += UserReload; //重装TL0
73 1 loops=0;
74 1
75 1 #ifdef BUZZER
76 1 #ifdef FRQBUZZER
if(bzstart)
BUZZER = ~BUZZER;
else
#endif
81 1 #endif
82 1 if(UserTimerMode)
83 1 TimerEvent();
84 1 }
85
86 void IntSysTimer( void ) interrupt TF1_VECTOR using 1
87 {
88 1 static unsigned char data loops=0;
89 1 loops++;
90 1 if(loops<=SysLoop) return;
91 1 TH0 += SysReload; //重装TH0
92 1 loops=0;
93 1 MS++;
94 1 MSbyte++;
95 1
96 1 SysTimerEvent();//调用户程序
97 1
98 1 if(bzstart)
99 1 {
100 2 if(bztime)
101 2 bztime --;
102 2 else
103 2 buzzerstop();
104 2 }
105 1 }
106
107 bit InitTimer( unsigned char clk ) //use TH0
108 {
109 1 if((TMOD & 0xf0) != 0x03)
110 1 {
111 2 TMOD &= 0xf0;
112 2 TMOD |= 0x03; //方式3,两个8位定时器
113 2 }
114 1 SysClk=clk;
115 1 switch(clk)
116 1 {
C51 COMPILER V7.07 TIMER 12/06/2003 18:49:09 PAGE 3
117 2 case CLK11M0592: // for 6clk/cyl, double
118 2 SysLoop=7;
119 2 SysReload=206; //256-153+1 //3*256+153=11059200/12000
120 2 break;
121 2 case CLK12M0000:
122 2 SysLoop=3;
123 2 SysReload=25; //256-232+1 //3*256+232=12000000/12000
124 2 break;
125 2 case CLK14M7456: // for 6clk/cyl, double
126 2 SysLoop=9;
127 2 SysReload=103; //256-205+1 //3*256+205=14745600/12000
128 2 break;
129 2 case CLK24M0000:
130 2 SysLoop=7;
131 2 SysReload=49; //256-208+1 //7*256+208=24000000/12000
132 2 break;
133 2 default:
134 2 return 0;
135 2 }
136 1 PT1=0;
137 1
138 1 #ifdef C51RX2
139 1 IPH = IP; ////////////////////////////////////
140 1 PT1 = 1; // 优先级1
141 1 #endif
142 1
143 1 TH0=SysReload; // reset system timer
144 1 TR1=1; // TH0 run
145 1 enable(); // enable global interrupt
146 1 ET1=1; // enable TH0 interrupt
147 1
148 1 return 1;
149 1 }
150
151 void InitUserTimer( unsigned int cycles, bit flag) //reentrant //use TL0
152 {
153 1 unsigned char i;
154 1 unsigned int tmp;
155 1
156 1 #ifdef FRQBUZZER
bzstart = 0; // stop buzzer for user use timer
#endif
159 1 if(flag == 0)
160 1 {
161 2 UserTimerMode = 0;
162 2 TL0 = 0 - cycles; // RESET TL0
163 2 TF0 = 0; // 防止意外中断
164 2 TR0 = 1; // user timer run
165 2 ET0 = 0; // disable interrupt
166 2 }
167 1 else
168 1 {
169 2 UserTimerMode = 1;
170 2 tmp=cycles; //cycles
171 2 for(i=0;tmp>256;i++) tmp -= 256;
172 2 UserLoop=i;
173 2 UserReload=1-tmp; //(unsigned char)(256-tmp+1);
174 2
175 2 PT0=1; // 高优先级
176 2 #ifdef C51RX2
177 2 IPH = IP; ////////////////////////////////////
178 2 #endif // 优先级 3
C51 COMPILER V7.07 TIMER 12/06/2003 18:49:09 PAGE 4
179 2
180 2 TL0=UserReload; // reset user timer
181 2 TR0=1; // start user timer
182 2 TF0=0; // 防止意外中断
183 2 ET0=1; // enable interrupt
184 2 enable();
185 2 }
186 1 }
187
188 void delay( unsigned int time )
189 {
190 1 unsigned int data tmp;
191 1 tmp = MS;
192 1 while(MS - tmp < time)
193 1 {
194 2 //ResetWDT(); // reset watchdog
195 2 }
196 1 }
197
198 void dummy(void){} // 空操作
199
200 #ifdef BUZZER
201 #ifdef FRQBUZZER
void buzzer(unsigned char bzfrq, unsigned int time)
{
switch(bzfrq)
{
case BZFRQ2K:
switch(SysClk)
{
case CLK11M0592:
InitUserTimer(461, 1);
break;
case CLK14M7456:
InitUserTimer(614, 1);
break;
case CLK12M0000:
InitUserTimer(500, 1);
break;
default:
break;
}
break;
case BZFRQ4K:
switch(SysClk)
{
case CLK11M0592:
InitUserTimer(230, 1);
break;
case CLK14M7456:
InitUserTimer(307, 1);
break;
case CLK12M0000:
InitUserTimer(250, 1);
break;
default:
break;
}
break;
default:
C51 COMPILER V7.07 TIMER 12/06/2003 18:49:09 PAGE 5
break;
}
bztime = time;
bzstart = 1;
}
void buzzerstop(void)
{
DiUserTimer();
bzstart = 0;
bztime = 0;
BUZZER = 1;
}
#else
255 void buzzer(unsigned int time)
256 {
257 1 bztime = time;
258 1 bzstart = 1;
259 1 BUZZER = 0;
260 1 }
261
262 void buzzerstop(void)
263 {
264 1 bztime = 0;
265 1 bzstart = 0;
266 1 BUZZER = 1;
267 1 }
268 #endif //def frqbuzzer
269 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 319 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 1 ----
PDATA SIZE = ---- ----
DATA SIZE = 11 2
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -