📄 main.lst
字号:
C51 COMPILER V7.01 MAIN 06/06/2004 21:51:20 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //**********************************************************************
2 //功能 : 定时器中断服务程序的安装及计数器的生成
3 //作者 : lihj
4 //创建日期 : 2004-06-05
5 //版本 : V1.0
6 //修改记录 :
7 //***********************************************************************
8 #include "REG51.h"
9
10 #ifndef TRUE
11 #define TRUE 0
12 #define FALSE 1
13 #endif
14
15 //系统宏定义
16 #define XTAL 12000000 //系统晶振
17 #define TIME_BASE 10 //时间基准, 以1ms为单位
18
19 //全局变量声明
20 int g_wTimerIniValue; //定时器初始化值
21 int g_w10msCounter=0; //10ms系统时钟基准
22 int g_w100msCounter=0; //100ms计数器
23 int g_w1sCounter=0; //1s计数器
24 int g_w10sCounter=0; //10s计数器
25 char g_byUpdateCountFlag=0; //更新标志
26
27 //函数声明
28 char TimerIni(char); //初始化定时器函数
29 char UpdateCounter(int, int*); //计数器生成函数
30
31 //主循环
32 void main(void)
33 {
34 1 //初始化定时器
35 1 g_wTimerIniValue = 65535 - ((XTAL/12)/1000)*TIME_BASE + 1;
36 1 //初值=65536 - 定时时间长度
37 1 TimerIni(0); //将定时器0初始化成10ms定时器
38 1
39 1 EA = 1; //总中断使能
40 1
41 1 while(1) //主循环体
42 1 {
43 2 if(g_byUpdateCountFlag)
44 2 {
45 3 g_byUpdateCountFlag = 0;
46 3 //更新计数器
47 3 UpdateCounter(10, &g_w100msCounter);
48 3 UpdateCounter(100, &g_w1sCounter);
49 3 UpdateCounter(1000, &g_w10sCounter);
50 3 }
51 2 }
52 1 }
53
54 //定时器初始化函数
55 //参数说明 : n, 定时器序号
C51 COMPILER V7.01 MAIN 06/06/2004 21:51:20 PAGE 2
56 // ini, 定时器初值, 单位是1ms
57 char TimerIni(char n)
58 {
59 1 if(n == 0) //使用定时器0
60 1 {
61 2 TMOD = 0X01; //定时器0工作方式1(16位定时器)
62 2 TH0 = g_wTimerIniValue >> 8; //定时器赋初始值
63 2 TL0 = g_wTimerIniValue;
64 2 ET0 = 1; //允许定时器中断
65 2 TR0 = 1; //启动计数
66 2 }
67 1 else if(n == 1) //使用定时器1
68 1 {
69 2 TMOD = 0x10; //工作方式1
70 2 TH1 = g_wTimerIniValue >> 8; //定时器赋初值
71 2 TL1 = g_wTimerIniValue;
72 2 ET1 = 1; //允许定时器中断
73 2 TR1 = 1; //启动计数
74 2 }
75 1 else
76 1 {
77 2 return FALSE;
78 2 }
79 1
80 1 return TRUE;
81 1 }
82
83 //计数器生成函数
84 //传入参数 : count, 多少ms计数器,单位1ms
85 // : *pCounter, 指向需要更新的计数器
86 char UpdateCounter(int count, int *pCounter)
87 {
88 1 //计数器长度限幅
89 1 //更长时间的计数器需要更改时间基准
90 1 if(count > 65536/TIME_BASE)
91 1 {
92 2 return FALSE;
93 2 }
94 1
95 1 if((g_w10msCounter != 0) && (g_w10msCounter%count == 0))
96 1 {
97 2 (*pCounter) ++;
98 2 }
99 1
100 1 return TRUE;
101 1 }
102
103 //定时器0中断服务程序
104 //interrupt关键字后的数字指向中断向量号
105 //using关键字后的数字表示该中断函数使用第几组寄存器
106 void Timer0Int(void) interrupt 1 using 1
107 {
108 1 TL0 += g_wTimerIniValue;
109 1 TH0 += g_wTimerIniValue>>8; //恢复定时器初值
110 1
111 1 g_w10msCounter ++; //10ms计数器累加
112 1 if(g_w10msCounter >= 60000)
113 1 {
114 2 g_w10msCounter -= 60000;
115 2 }
116 1
117 1 g_byUpdateCountFlag = 1; //更新其它计数器
C51 COMPILER V7.01 MAIN 06/06/2004 21:51:20 PAGE 3
118 1 }
119
120
121
122
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 256 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 3
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 + -