📄 main.lst
字号:
C51 COMPILER V7.01 MAIN 06/15/2004 20:36:51 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-15
5 //版本 : V1.0
6 //修改记录 :
7 //***********************************************************************
8 #include "REG51.h"
9 #include "intrins.h" //包含内联函数
10
11 #ifndef TRUE //如果没有定义宏TRUE,那么定义以下宏
12 #define TRUE 0
13 #define FALSE 1
14 #endif //结束条件编译
15
16 //系统宏定义
17 #define XTAL 12000000 //系统晶振
18 #define TIME_BASE 10 //时间基准, 以1ms为单位
19 #define RED_TIME 45 //红灯倒计时时间
20 #define GREEN_TIME 30 //绿灯倒计时时间
21
22 //全局变量声明
23 int g_wTimerIniValue; //定时器初始化值
24 int g_w10msCounter; //10ms系统时钟基准
25 int g_wRedDownCounter; //红灯倒计时计数器
26 int g_wGreenDownCounter; //绿灯倒计时计数器
27 bit g_bUpdateCountFlag; //更新标志
28 sbit g_bRedFlag = P1^0; //假设P1.0口输入红灯计数信号,高电平有效
29 sbit g_bGreenFlag = P1^1; //假设P1.1口输入绿灯计数信号,高电平有效
30
31 //函数声明
32 char TimerIni(char); //初始化定时器函数
33 char UpdateCounter(int, int*); //计数器生成函数
34 void OutputTime(int ); //输出当前计时值
35
36 //主循环
37 void main(void)
38 {
39 1 int cur_counter=60; //当前输出值
40 1
41 1 //初始化全局变量
42 1 g_w10msCounter = 0; //10ms系统时钟基准
43 1 g_wRedDownCounter = RED_TIME; //红灯倒计时计数器
44 1 g_wGreenDownCounter = GREEN_TIME; //绿灯倒计时计数器
45 1 g_bUpdateCountFlag = 0; //更新标志
46 1 g_bRedFlag = 0;
47 1 g_bGreenFlag = 0;
48 1
49 1 g_wTimerIniValue = 65535 - ((XTAL/12)/1000)*TIME_BASE + 1;
50 1 //初值=65536 - 定时时间长度
51 1 TimerIni(0); //将定时器0初始化成10ms定时器
52 1
53 1 EA = 1; //总中断使能
54 1
55 1 while(1) //主循环体
C51 COMPILER V7.01 MAIN 06/15/2004 20:36:51 PAGE 2
56 1 {
57 2 if(_testbit_(g_bUpdateCountFlag))
58 2 {
59 3 //更新红灯计数器
60 3 if(g_bRedFlag)
61 3 {
62 4 //红灯开始计数的时候,初始化绿灯倒计时时间
63 4 g_wGreenDownCounter = GREEN_TIME;
64 4 UpdateCounter(100, &g_wRedDownCounter);
65 4 cur_counter = g_wRedDownCounter;
66 4 }
67 3
68 3 //更新绿灯计数器
69 3 if(g_bGreenFlag)
70 3 {
71 4 //绿灯开始计时的时候,初始化红灯倒计时时间
72 4 g_wRedDownCounter = RED_TIME;
73 4 UpdateCounter(100, &g_wGreenDownCounter);
74 4 cur_counter = g_wGreenDownCounter;
75 4 }
76 3
77 3 //输出当前计时时间
78 3 OutputTime(cur_counter);
79 3 }
80 2 }
81 1 }
82
83 //定时器初始化函数
84 //参数说明 : n, 定时器序号
85 char TimerIni(char n)
86 {
87 1 if(n == 0) //使用定时器0
88 1 {
89 2 TMOD = 0X01; //定时器0工作方式1(16位定时器)
90 2 TH0 = g_wTimerIniValue >> 8; //定时器赋初始值
91 2 TL0 = g_wTimerIniValue;
92 2 ET0 = 1; //允许定时器中断
93 2 TR0 = 1; //启动计数
94 2 }
95 1 else if(n == 1) //使用定时器1
96 1 {
97 2 TMOD = 0x10; //工作方式1
98 2 TH1 = g_wTimerIniValue >> 8; //定时器赋初值
99 2 TL1 = g_wTimerIniValue;
100 2 ET1 = 1; //允许定时器中断
101 2 TR1 = 1; //启动计数
102 2 }
103 1 else
104 1 {
105 2 return FALSE; //返回出错标志
106 2 }
107 1
108 1 return TRUE;
109 1 }
110
111 //计数器生成函数
112 //传入参数 : count, 多少ms计数器,单位1ms
113 // : *pCounter, 指向需要更新的计数器
114 char UpdateCounter(int count, int *pCounter)
115 {
116 1 //计数器长度限幅(600s)
117 1 //更长时间的计数器需要更改时间基准
C51 COMPILER V7.01 MAIN 06/15/2004 20:36:51 PAGE 3
118 1 if(count > 65536/TIME_BASE)
119 1 {
120 2 return FALSE;
121 2 }
122 1
123 1 if(g_w10msCounter%count == 0)
124 1 {
125 2 if(*pCounter == 0) //已经到零了,直接返回
126 2 {
127 3 return TRUE;
128 3 }
129 2
130 2 (*pCounter) --; //向下减一
131 2 }
132 1
133 1 return TRUE;
134 1 }
135
136 //定时器0中断服务程序
137 //interrupt关键字后的数字指向中断向量号
138 //using关键字后的数字表示该中断函数使用第几组寄存器
139 void Timer0Int(void) interrupt 1 using 1
140 {
141 1 TL0 += g_wTimerIniValue;
142 1 TH0 += g_wTimerIniValue>>8; //恢复定时器初值
143 1
144 1 g_w10msCounter ++; //10ms计数器累加
145 1 if(g_w10msCounter >= 60000)
146 1 {
147 2 g_w10msCounter -= 60000;
148 2 }
149 1
150 1 g_bUpdateCountFlag = 1; //更新其它计数器
151 1 }
152
153 //将当前倒计时时间输出到显示界面
154 //预留接口
155 void OutputTime(int count)
156 {
157 1
158 1 }
*** WARNING C280 IN LINE 155 OF MAIN.C: 'count': unreferenced local variable
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 308 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 7
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -