前言

时隔多日想必没人看这篇文章的

毕竟这东西超老的说= ̄ω ̄=

简易的小时钟

本篇章所使用的是借来的四位数码管单片机

用作各位的期末项目想必是绰绰有余

咱就不用VScode编译了,咱用Keil uVision5

芯片是咱的老牌STC89C52RC

代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
/*

く__,.ヘヽ. / ,ー、 〉
\ ', !-─‐-i / /´
/`ー' L//`ヽ、
/ /, /| , , ',
イ / /-‐/ i L_ ハ ヽ! i
レ ヘ 7イ`ト レ'ァ-ト、!ハ| |
!,/7 '0' ´0iソ| |
|.从" _ ,,,, / |./ |
レ'| i>.、,,__ _,.イ / .i |
レ'| | / k_7_/レ'ヽ, ハ. |
| |/i 〈|/ i ,.ヘ | i |
.|/ / i: ヘ! \ |
kヽ>、ハ _,.ヘ、 /、!
!'〈//`T´', \ `'7'ーr'
レ'ヽL__|___i,___,ンレ|ノ
ト-,/ |___./
'ー' !_,.:

四位数码管STC89C52RC单片机实现简易时钟外加闹钟功能
Four digital tube STC89C52RC microcontroller to achieve a simple clock plus alarm clock function
创建于2023/6/15 14:13
Created on 2023/6/15 14:13
*/
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

//定义数码管的端口
sbit D1 = P2^0;
sbit D2 = P2^1;
sbit D3 = P2^2;
sbit D4 = P2^3;
//如果D1 = 0则选中
//如果D1 = 1则不选中


//定义按键的端口
sbit K3 = P3^5; //切换显示时间和设置时间和设置闹钟的时间
sbit K4 = P3^4; //切换小时和分钟的时间设置
sbit K5 = P3^3; //当设置时钟的时间、设置闹钟的时间,用来增加时间、可减少小时和分钟通过K4切换
sbit K6 = P3^2; //当设置时钟的时间、设置闹钟的时间,用来减少时间、可减少小时和分钟通过K4切换

//判断按钮是否按下
int K3UPdown;
int K4UPdown;
int K5UPdown;
int K6UPdown;

// 设置默认时间
//12:00:00
u8 hour = 12;
u8 minute = 0;

// 设置默认闹钟时间
//12:01:00
u8 bellhour = 12;
u8 bellminute = 1;
u8 bellsecond = 0;

//默认显示时钟
u8 timekey = 0;

//小时和分分钟的切换状态
u8 Statukey = 0; //Statukey = 0 小时设置、Statukey = 1 分钟设置
//定义蜂鸣器的端口
sbit beep = P3^6;
//0~9的段码
u8 code table[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //0~9的段码 共阳极数码管
u8 code tablecode[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};//0~9的段码 共阳极数码管带小数点
u8 second;
u8 key=0;

// 1ms*1000=1s
void delay1ms(u16 t)
{
u16 i,j;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}

void ExitInit() //定时器初始化
{
TMOD =0X01;
ET0=1;
EA=1;
second=0; //秒数计时
TH0=0xFC;
TL0=0x18;
P3=0xff;
P0=0x00;
}

void Display() //数码管显示
{
//切换显示时间设置或者闹钟设置
//如果key = 0则显示时间设置,key = 1则显示闹钟设置
if(timekey == 0 || timekey == 1){ //切换显示时间或者时间设置
//显示时间设置
D1 = 0; D2 = 1; D3 = 1; D4 = 1; //选中第一个数码管
P0 = table[hour / 10]; //显示s的十位
delay1ms(3);
D1 = 1; D2 = 0; D3 = 1; D4 = 1;
P0 = tablecode[hour % 10];
delay1ms(3);
D1 = 1; D2 = 1; D3 = 0; D4 = 1;
P0 = table[minute / 10]; //显示s的十位
delay1ms(3);
D1 = 1; D2 = 1; D3 = 1; D4 = 0;
P0 = table[minute % 10];
delay1ms(3);
}

// 闹钟设置
if (timekey==2) //闹钟设置
{
D1 = 0; D2 = 1; D3 = 1; D4 = 1; //选中第一个数码管
P0 = table[bellhour / 10]; //显示s的十位
delay1ms(3);
D1 = 1; D2 = 0; D3 = 1; D4 = 1;
P0 = tablecode[bellhour % 10];
delay1ms(3);
D1 = 1; D2 = 1; D3 = 0; D4 = 1;
P0 = table[bellminute / 10]; //显示s的十位
delay1ms(3);
D1 = 1; D2 = 1; D3 = 1; D4 = 0;
P0 = table[bellminute % 10];
delay1ms(3);
}


}
void Timer0() interrupt 1 //定时器0中断函数 检查是否到达闹钟时间
{
static u16 timer;
TH0=0XFC;
TL0=0X18;
timer++;
//1ms*1000=1s
if(timer==1000)
{
timer=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void main()
{
int timex;
ExitInit();
TR0 = 1;
while(1)
{
if (hour == bellhour && minute == bellminute && second == bellsecond)
{
for(timex=0;timex<3;timex++)
{
beep = 0;
delay1ms(1);
beep = 1;
delay1ms(1);
}
}
// 如果计时器开启则进行以下判断
if(timekey==0)
{
TR0 = 1;
}
if(timekey==1 || timekey==2)
{
// 停止计时
TR0 = 0;
//归零
second = 0;
}

Display(); //数码管显示

//切换显示时间或者时间设置或者闹钟设置
//timekey = 0 显示时间 timekey = 1 时间设置 timekey = 2 闹钟设置
//当进入时间设置或者闹钟设置时,timekey = 1或者timekey = 2 则归零秒数计时并暂停
if (K3 == 0) //切换显示时间和设置时间和设置闹钟的时间
{
delay1ms(5);
if (K3 == 0)
{
if (K3UPdown == 0)
{
key++;
K3UPdown = 1;
if (key == 3)
{
key = 0;
}
if (key == 0)
{
timekey = 0;
}
if (key == 1)
{
timekey = 1;
}
if (key == 2)
{
timekey = 2;
}
}
}
}
if(K3UPdown == 1)//恢复按键状态
{
if (K3 == 1)
{
delay1ms(5);
if (K3 == 1)
{
K3UPdown = 0;
}
}
}


//切换小时和分钟的时间设置
if (K4 == 0)
{
delay1ms(5);
if (K4 == 0)
{
if (K4UPdown == 0)
{
Statukey++;
K4UPdown = 1;
if (Statukey == 2)
{
Statukey = 0;
}
}
}
}
if(K4UPdown == 1) //恢复按键状态
{
if (K4 == 1)
{
delay1ms(5);
if (K4 == 1)
{
K4UPdown = 0;
}
}
}
//K5用来增加时间、小时和分钟通过K4切换
if(K5 == 0)
{
delay1ms(5);
if (K5 == 0)
{
if (K5UPdown == 0)
{
K5UPdown = 1;
if (timekey == 1)
{
if (Statukey == 0)
{
hour++;
if (hour == 24)
{
hour = 0;
}
}
if (Statukey == 1)
{
minute++;
if (minute == 60)
{
minute = 0;
}
}
}
if(timekey == 2)
{
if (Statukey == 0)
{
bellhour++;
if (bellhour == 24)
{
bellhour = 0;
}
}
if (Statukey == 1)
{
bellminute++;
if (bellminute == 60)
{
bellminute = 0;
}
}
}
}
//当设置时钟的时间、设置闹钟的时间,用来增加时间、可减少小时和分钟通过K4切换

}
}
if(K5UPdown == 1) //恢复按键状态
{
if (K5 == 1)
{
delay1ms(5);
if (K5 == 1)
{
K5UPdown = 0;
}
}
}
if(K6 == 0)
{
delay1ms(5);
if(K6 == 0)
{
if (K6UPdown == 0)
{
K6UPdown = 1;
//当设置时钟的时间、设置闹钟的时间,用来减少时间、可减少小时和分钟通过K4切换
if (timekey == 1)
{
if (Statukey == 0)
{
hour--;
Display(); //数码管显示
if (hour == 255)
{
hour = 23;
}
}
if (Statukey == 1)
{
minute--;
if (minute == 255)
{
minute = 59;
}
}
}
if(timekey == 2)
{
if (Statukey == 0)
{
bellhour--;
if (bellhour == 255)
{
bellhour = 23;
}
}
if (Statukey == 1)
{
bellminute--;
if (bellminute == 255)
{
bellminute = 59;
}
}
}
}
}
}
if(K6UPdown == 1) //恢复按键状态
{
if (K6 == 1)
{
delay1ms(5);
if (K6 == 1)
{
K6UPdown = 0;
}
}
}
}
}
//Path: SASO-STATIC-API/C/时钟.c
// Compare this snippet from C/按键计时.c:
// Author: Syayuri
// E-mail: syayuri@outlook.jp

非常简单的小东西,您学废了咩?
(。・∀・)ノまた会いましょう