// 硬件:DS1302、按键、LCD1602、无源蜂鸣器
// 1、具有万年历功能的数字时钟 (本世纪100年通用),能够正确的显示年、月、日、时、分、秒
// 2、按键设置时间(校时)
// 3、24小时内至少可设置3个闹钟,并具有不同的闹钟铃声。每个闹钟可以选择启用或者不启用。
// 4、具有秒表功能(计时精度0.1秒)
// 5、其它与数字时钟相关的功能扩展(整点报时、闹钟时间掉电保存功能AT24C02、)
//按键1 可以设置时间切换,秒表下是开始
//按键2 可以设置时间切换,秒表下是暂停
//按键3 可以设置闹钟切换,秒表下是复位
//按键4 可以设置闹钟切换
//按键5 +
//按键6 -
//按键7 直接回到主页面
//按键8 进入秒表
主页面:
闹钟0设置:
闹钟1设置:
闹钟2设置:
秒表:
部分源码:
cvoid main() {
char miaoa = 0;
char ifg = 0;
unsigned char keyvl = 0;
LCD_init();
x24c02_init();
ds1302_init();
// LCD_write_str(1, 1, "2223123");
get_time(&rtctime); /* 调用取时间函数 */
ifg = 0;
if (rtctime.nian > 99)
ifg = 1;
if (rtctime.yue > 12)
ifg = 1;
if (rtctime.ri > 31)
ifg = 1;
if (rtctime.zhou > 7)
ifg = 1;
if (rtctime.shi > 23)
ifg = 1;
if (rtctime.fen > 59)
ifg = 1;
if (rtctime.miao > 59)
ifg = 1;
if (ifg == 1) /* 如果时间有问题 就初始化时间 */
{
rtctime.nian = 20;
rtctime.yue = 10;
rtctime.ri = 10;
rtctime.zhou = getWeekdayByYearday(rtctime.nian + 2000, rtctime.yue, rtctime.ri);
rtctime.shi = 7;
rtctime.fen = 59;
rtctime.miao = 58;
set_time(&rtctime);
}
read_alarm();
ifg = 0;
if ((ALARMtime.shi > 23) || (ALARMtime.shi < 0))
ifg = 1;
if ((ALARMtime.fen > 59) || (ALARMtime.fen < 0))
ifg = 1;
if ((ALARMtime.miao > 59) || (ALARMtime.miao < 0))
ifg = 1;
if ((ALARMtime1.shi > 23) || (ALARMtime1.shi < 0))
ifg = 1;
if ((ALARMtime1.fen > 59) || (ALARMtime1.fen < 0))
ifg = 1;
if ((ALARMtime1.miao > 59) || (ALARMtime1.miao < 0))
ifg = 1;
if ((ALARMtime2.shi > 23) || (ALARMtime2.shi < 0))
ifg = 1;
if ((ALARMtime2.fen > 59) || (ALARMtime2.fen < 0))
ifg = 1;
if ((ALARMtime2.miao > 59) || (ALARMtime2.miao < 0))
ifg = 1;
if (ifg == 1) /* 如果时间有问题 就初始化 闹钟 */
{
ALARMtime.shi = 10;
ALARMtime.fen = 0;
ALARMtime.miao = 0;
ALARMtime1.shi = 10;
ALARMtime1.fen = 5;
ALARMtime1.miao = 0;
ALARMtime2.shi = 10;
ALARMtime2.fen = 10;
ALARMtime2.miao = 0;
write_alarm();
}
init_timer0();
init_timer1();
while (1) {
delay_ms(10);
keyvl = getkey();
if (keyvl) {
user_pro_key(keyvl);
while (getkey())
;
}
if (set == 0) {
get_time(&rtctime); /* 调用取时间函数 */
if (miaoa != rtctime.miao) {
miaoa = rtctime.miao;
user_lcd_display(); /* 刷新显示 */
user_zheng_con(); /* 整点报时控制 */
user_alarm_con(); /* 闹钟控制 */
}
}
if (naozhong_music) {
music_beep(naozhong_music);
}
if (set == 19) {
if (TR0 == 1) {
/* 秒表 unsigned char num=0,ms100=0,second100=0,minute100=0; */
memset(xianshi, 0, sizeof(xianshi)); /* 清空 */
sprintf(xianshi, "%02d:%02d:%01d", (int)minute100, (int)second100, (int)ms100); /* 装填 */
LCD_write_str(0, 1, xianshi);
}
}
}
}
void T0_time0(void) interrupt 1 {
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
num2++;
if (num2 == 2) /* 1秒 */
{
num2 = 0;
ms100++;
if (ms100 == 10) {
ms100 = 0;
second100++;
if (second100 == 60) {
second100 = 0;
minute100++;
}
}
}
}
全部代码见:dt4.8tupian.net/2/28880a11b7000.pg3
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!