📄 diometer.lst
字号:
C51 COMPILER V8.08 DIOMETER 11/07/2008 11:30:45 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DIOMETER
OBJECT MODULE PLACED IN diometer.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE diometer.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //
2 //数码管采用共阴
3 //P2作为数码管的段选输入
4 //p1作为数码管的位选,采用低四位
5 //
6 //采用11.0592mhz的晶振
7 //时钟采用计时器0
8 //初始值为19465,也就是20次溢出为1秒
9 //
10 //红外对管低电平有效
11 //采用边沿触发
12 //触发后延时4ms检测若有则说明成功
13 //
14 //红外采用外部中断0
15 //按键采用外部中断1
16 //
17 #include <reg52.h>
18
19 int distance=0;
20 char hour=0;
21 char minute=0;
22 char second=0;
23 //char sec=0;
24 char timenumber = 0;
25 //
26 //共阴七段数码管的显示参数
27 //
28 //code char Ascii[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f};
29 code char Ascii[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
30 //
31 //显示的控制位
32 //0表示distance
33 //1表示time
34 //
35 char mod=0;
36 //
37 //秒钟的辅助进位
38 //
39 char count=0;
40
41 //
42 //延时的子程序
43 //
44 void delay(unsigned char a)
45 {
46 1 while(a--)
47 1 {
48 2 }
49 1 }
50
51 void delay_2(int m) //延时程序,延时m*0.5毫秒
52 {
53 1 unsigned int i;
54 1 unsigned int j;
55 1 for (i = 0; i < m; i++)
C51 COMPILER V8.08 DIOMETER 11/07/2008 11:30:45 PAGE 2
56 1 {
57 2 for (j = 0; j < 500; j++){}
58 2 }
59 1 }
60
61 //
62 //
63 //
64 void ShowSpeed()
65 {
66 1 int speed=distance*2/(second+minute*60+hour*24);
67 1
68 1 P1=0xff;
69 1 P2 = 0x00;
70 1 P2=Ascii[speed / 1000]& 0x7f;
71 1 P1=0xfe;
72 1 delay_2(1);
73 1 P1=0xff;
74 1
75 1 P2 = 0x00;
76 1 speed=speed % 1000;
77 1 P2=Ascii[speed / 100];
78 1 P1=0xfd;
79 1 delay_2(1);
80 1 P1=0xff;
81 1
82 1 P2 = 0x00;
83 1 speed=speed % 100;
84 1 //
85 1 //显示闪烁
86 1 //
87 1 P2=Ascii[speed /10] ;
88 1 P1=0xfb;
89 1 delay_2(1);
90 1 P1=0xff;
91 1
92 1 P2 = 0x00;
93 1 speed=speed%10;
94 1 P2=Ascii[speed];
95 1 P1=0xf7;
96 1 delay_2(1);
97 1 P1=0xff;
98 1 }
99
100 //
101 //显示里程
102 //
103 void ShowDistance()
104 {
105 1
106 1 int tmp=distance*2%10000;
107 1
108 1 P1=0xff;
109 1 P2 = 0x00;
110 1 P2=Ascii[tmp / 1000];
111 1 P1=0xfe;
112 1 delay_2(1);
113 1 P1=0xff;
114 1
115 1 P2 = 0x00;
116 1 tmp=tmp % 1000;
117 1 P2=Ascii[tmp / 100]& 0x7f;
C51 COMPILER V8.08 DIOMETER 11/07/2008 11:30:45 PAGE 3
118 1 P1=0xfd;
119 1 delay_2(1);
120 1 P1=0xff;
121 1
122 1 P2 = 0xff;
123 1 tmp=tmp % 100;
124 1 //
125 1 //显示闪烁
126 1 //
127 1 P2=Ascii[tmp /10] ;
128 1 P1=0xfb;
129 1 delay_2(1);
130 1 P1=0xff;
131 1
132 1 P2 = 0xff;
133 1 tmp=tmp%10;
134 1 P2=Ascii[tmp];
135 1 P1=0xf7;
136 1 delay_2(1);
137 1 P1=0xff;
138 1 }
139
140 //
141 //显示时间
142 //
143 void ShowTime()
144 {
145 1 P1=0xff;
146 1 P2 = 0x00;
147 1 P2=Ascii[hour / 10];
148 1 P1=0xfe;
149 1 delay_2(1);
150 1 P1=0xff;
151 1
152 1 P2 = 0x00;
153 1 P2=Ascii[hour % 10];
154 1 P1=0xfd;
155 1 delay_2(1);
156 1 P1=0xff;
157 1
158 1 P2 = 0x00;
159 1 P2=Ascii[minute / 10] & 0x7f;
160 1 P1=0xfb;
161 1 delay_2(1);
162 1 P1=0xff;
163 1 //
164 1 //显示闪烁
165 1 //
166 1
167 1 P2 = 0x00;
168 1 P2=Ascii[minute % 10] ;
169 1 P1=0xf7;
170 1 delay_2(1);
171 1 P1=0xff;
172 1 }
173
174 //
175 //显示秒钟
176 //
177 void ShowSecond()
178 {
179 1 P1=0xff;
C51 COMPILER V8.08 DIOMETER 11/07/2008 11:30:45 PAGE 4
180 1 P2 = 0x00;
181 1 P2=Ascii[minute / 10];
182 1 P1=0xfe;
183 1 delay_2(1);
184 1 P1=0xff;
185 1
186 1 //
187 1 //显示闪烁
188 1 //
189 1 P2 = 0x00;
190 1 P2=Ascii[minute % 10];
191 1 P1=0xfd;
192 1 delay_2(1);
193 1 P1=0xff;
194 1
195 1 P2 = 0x00;
196 1 P2=Ascii[second / 10];
197 1 P1=0xfb;
198 1 delay_2(1);
199 1 P1=0xff;
200 1
201 1 P2 = 0x00;
202 1 P2=Ascii[second % 10] & 0x7f;
203 1 P1=0xf7;
204 1 delay_2(1);
205 1 P1=0xff;
206 1 }
207 //
208 //定时器0的中断服务器
209 //
210 void Timer0() interrupt 1
211 {
212 1 EA=0;
213 1 TH0=0x4c;
214 1 TL0=0x09; //tmp->timenumber
215 1 if(timenumber==19)
216 1 {
217 2 timenumber=0;
218 2 if(second==59)
219 2 {
220 3 second=0;
221 3 if(minute==59)
222 3 {
223 4 minute=0;
224 4 if(hour==99)
225 4 {
226 5 hour=0;
227 5 }
228 4 else
229 4 {
230 5 hour++;
231 5 }
232 4 }
233 3 else
234 3 {
235 4 minute++;
236 4 }
237 3 }
238 2 else
239 2 {
240 3 second++;
241 3 }
C51 COMPILER V8.08 DIOMETER 11/07/2008 11:30:45 PAGE 5
242 2 //sec++;
243 2 }
244 1 else
245 1 {
246 2 timenumber++;
247 2 }
248 1 EA=1;
249 1 }
250
251 //
252 //外部中断0的中断服务程序
253 //该中断来源于一个按钮
254 //用以控制显示的切换
255 //
256 void Int1() interrupt 2
257 {
258 1 EX1=0;
259 1 EA=0;
260 1 TR1=1;
261 1 if(mod==3)
262 1 {
263 2 mod=0;
264 2 }
265 1 else
266 1 {
267 2 mod++;
268 2 }
269 1 P1=0xff;
270 1 delay_2(50);
271 1 EA=1;
272 1 }
273
274 //
275 //外部中断1的中断服务程序
276 //用来检测红外对管
277 //
278 void Int0() interrupt 0
279 {
280 1 unsigned char tmp=15;
281 1 EA=0;
282 1 //
283 1 //延时4ms
284 1 //
285 1 while(tmp--)
286 1 {
287 2 delay(255);
288 2 }
289 1 if(!(P3 & 0x04))
290 1 {
291 2 distance++;
292 2 }
293 1 EA=1;
294 1 }
295
296 //
297 //计时器1用来按键防抖
298 //重设时钟,开放按键中断
299 //
300 void Timer1() interrupt 3
301 {
302 1 EA=0;
303 1 TR1=0;
C51 COMPILER V8.08 DIOMETER 11/07/2008 11:30:45 PAGE 6
304 1 TH1=0xdb;
305 1 TL1=0x9f;
306 1 EX1=1;
307 1 EA=1;
308 1 }
309
310 main()
311 {
312 1 // x
313 1 //初始化部分
314 1 //
315 1 //采用16位定时器模式
316 1 //中断为边沿触发
317 1 //
318 1 // P1=0xff;
319 1 // P2=0x00;
320 1 TMOD=0x11;
321 1 TCON=0x15;
322 1 TH0=0x4c;
323 1 TL0=0x09;
324 1 TH1=0xdb;
325 1 TL1=0x9f;
326 1 TR1=0;
327 1 //
328 1 //开放定时器0和外部中断0和1的中断
329 1 //
330 1 IE=0x8f;
331 1 //
332 1 //主程序部分
333 1 //主要是显示模块
334 1 //
335 1 while(1)
336 1 {
337 2 switch(mod)
338 2 {
339 3 case 0:
340 3 ShowSecond();
341 3 break;
342 3 case 1:
343 3 ShowTime();
344 3 break;
345 3 case 2:
346 3 ShowDistance();
347 3 break ;
348 3 case 3:
349 3 ShowSpeed();
350 3 break;;
351 3 default:
352 3 ShowDistance();
353 3 break;
354 3 }
355 2 }
356 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1051 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 4
IDATA SIZE = ---- ----
C51 COMPILER V8.08 DIOMETER 11/07/2008 11:30:45 PAGE 7
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 + -