版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、功能最全的电子钟【单片机】c51数字时钟(带年月日显示)摘要:本设计以单片机为核心,lcd1602显示。采用独立键盘输入能任意修改当前时间日期和设定闹钟时间。具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能主程序:/* lcd1602电子钟 */# include # include lcd16024.hsbit key1 = p20;/调整sbit key2 = p21;/加1sbit key3 = p22;/减1sbit speaker = p23;/蜂鸣器sbit key4 = p24;/闹钟设计bit cal_year = 1;/进入判断闰年标志位bit leap_year;/
2、闰年标志位bit calculate = 0;/日加一标记bit run = 0;/闹钟标志bit beep = 0;/整点报时标志/uint8 num = 0;/调整是给的脉冲uint8 code str1 = d: ;uint8 code str2 = t: ;uint8 code str3 = wek;uint8 daystr=2013-07-29 ;/年月日格式uint8 timestr=21:30:59 n; /时分秒格式uint8 daystr1=2013-07-29 ;/闹钟年月日格式uint8 timestr1=21:30:59 n; /闹钟时分秒格式uint8 numweek
3、 = 0;/星期加1标记char week = 1;/星期char sec = 53;/秒char min = 50;/分char hour = 23;/时uint8 day = 30;/ 日uint8 month = 9;/月uint16 year = 2013;/年char week1 = 1;/闹钟星期 char sec1 = 58;/闹钟秒char min1 = 50;/闹钟分char hour1 = 23;/闹钟时uint8 day1 = 30;/闹钟日uint8 month1 = 9;/闹钟月uint16 year1 = 2013;/闹钟年uint8 weekdata1;/闹钟星期
4、标记uint8 number = 0;/定时uint8 weekdata;/星期标记uint8 speaker_num; /整点报时次数uint8 scan_key(void);/函数声名 /* 更新lcd时间分离读取 */void timechange()/时分秒timestr7 = sec%10+0;timestr6 = sec/10+0;timestr4 = min%10+0;timestr3 = min/10+0;timestr1 = hour%10+0;timestr0 = hour/10+0;/年月日daystr9 = day%10+0;daystr8 = day/10+0;day
5、str6 = month%10+0;daystr5 = month/10+0;daystr3 = year%10+0;daystr2 = year/10%10+0;daystr1 = year/100%10+0;daystr0 = year/1000+0;/星期weekdata = week+0;/* 闹钟更新lcd时间分离读取 */void timechange1()/时分秒timestr17 = sec1%10+0;timestr16 = sec1/10+0;timestr14 = min1%10+0;timestr13 = min1/10+0;timestr11 = hour1%10+0
6、;timestr10 = hour1/10+0;/年月日daystr19 = day1%10+0;daystr18 = day1/10+0;daystr16 = month1%10+0;daystr15 = month1/10+0;daystr13 = year1%10+0;daystr12 = year1/10%10+0;daystr11 = year1/100%10+0;daystr10 = year1/1000+0;/星期weekdata1 = week1+0;/* 初始化系统定时器0 */void systimer0_init(void)tmod |=0x01;/设置为1时用或(|)t
7、mod &=0xfd;/设置为0时用与(&) th0 = 0xdc; / 定时10ms tl0 = 0x00;ea = 1;et0=1; tr0=1;ex0 = 1;/* 闹钟时间设置 */void naozhong()uint8 number = 1;uint8 a = 0;uint8 b = 0;if(0 = key4)delay1ms(5);if(0 = key4)a = 1;lcd_write_command(0xc0+9);lcd_write_command(0x0f);while(!key4);while(a)if(0 = key4)delay1ms(5);if(0 = key4)
8、a = 0;run = run;while(!key4); if(run)timestr9 = y;elsetimestr9 = n;if(0 = key1)delay1ms(5);if(0 = key1)b = 1;while(!key1);while(b) if(0 = key1)delay1ms(5);if(0 = key1)number+;if(4 = number)b = 0;while(!key1);if(number = 1)lcd_write_command(0xc0+9);lcd_write_command(0x0f);if(number = 2)lcd_write_comm
9、and(0xc0+6);lcd_write_command(0x0f);if(number = 3)lcd_write_command(0xc0+3);lcd_write_command(0x0f); switch(number) case 1: if(0 = key2) /闹钟秒加1的设置 delay1ms(5);if(0 = key2) sec1+; if(60 = sec1)sec1 = 0;while(!key2);timestr17 = sec1%10+0;timestr16 = sec1/10+0;lcd_write_char(8,1,timestr16);lcd_write_ch
10、ar(9,1,timestr17);lcd_write_command(0xc0+9); if(0 = key3) /闹钟秒减1的设置 delay1ms(5);if(0 = key3) sec1-; if(sec1 0)sec1 = 59;while(!key3);timestr17 = sec1%10+0;timestr16 = sec1/10+0;lcd_write_char(8,1,timestr16);lcd_write_char(9,1,timestr17);lcd_write_command(0xc0+9); break;case 2: if(0 = key2) /闹钟分加1的设置
11、 delay1ms(5);if(0 = key2) min1+; if(60 = min1)min1 = 0;while(!key2);timestr14 = min1%10+0;timestr13 = min1/10+0;lcd_write_char(5,1,timestr13);lcd_write_char(6,1,timestr14);lcd_write_command(0xc0+6); if(0 = key3) /闹钟分减1的设置 delay1ms(5);if(0 = key3) min1-; if(min1 0)min1 = 59;while(!key3);timestr14 = m
12、in1%10+0;timestr13 = min1/10+0;lcd_write_char(5,1,timestr13);lcd_write_char(6,1,timestr14);lcd_write_command(0xc0+6); break;case 3: if(0 = key2) /闹钟时加1的设置 delay1ms(5);if(0 = key2) hour1+; if(24 = hour1)hour1 = 0;while(!key2);timestr11 = hour1%10+0;timestr10 = hour1/10+0;lcd_write_char(2,1,timestr10)
13、;lcd_write_char(3,1,timestr11);lcd_write_command(0xc0+3); if(0 = key3) /闹钟时减1的设置 delay1ms(5);if(0 = key3) hour1-; if(hour1 0)hour1 = 23;while(!key3);timestr11 = hour1%10+0;timestr10 = hour1/10+0;lcd_write_char(2,1,timestr10);lcd_write_char(3,1,timestr11);lcd_write_command(0xc0+3); break;case 4:b = 0
14、;lcd_write_command(0x0c);break;lcd_write_command(0x0c);while(!key4);/* 判断按键进入时间调整 */uint8 scan_key(void)uint8 number = 1;uint8 a = 0;if(0 = key1)delay1ms(5);if(0 = key1)while(!key1);a = 1;lcd_write_command(0xc0+9);lcd_write_command(0x0f);while(a) if(0 = key1)delay1ms(5);if(0 = key1)number+;while(!ke
15、y1);tr0 = 0;if(number = 2)lcd_write_command(0xc0+6);lcd_write_command(0x0f);if(number = 3)lcd_write_command(0xc0+3);lcd_write_command(0x0f);if(number = 4)lcd_write_command(0x80+11);lcd_write_command(0x0f);if(number = 5)lcd_write_command(0x80+8);lcd_write_command(0x0f);if(number = 6)lcd_write_command
16、(0x80+5);lcd_write_command(0x0f);if(number = 7)lcd_write_command(0xc0+14);lcd_write_command(0x0f);if(8 = number)lcd_write_command(0x0c);a = 0;number = 0; switch(number) case 1: if(0 = key2) /秒加1的设置 delay1ms(5);if(0 = key2)sec+; if(60 = sec)sec = 0;timestr7 = sec%10+0;timestr6 = sec/10+0;lcd_write_ch
17、ar(8,1,timestr6);lcd_write_char(9,1,timestr7);lcd_write_command(0xc0+9);while(!key2); if(0 = key3) /秒减1的设置 delay1ms(5);if(0 = key3) sec-; if(sec 0)sec = 59;timestr7 = sec%10+0;timestr6 = sec/10+0;lcd_write_char(8,1,timestr6);lcd_write_char(9,1,timestr7);lcd_write_command(0xc0+9);while(!key3); break;
18、case 2: if(0 = key2) /分加1的设置 delay1ms(5);if(0 = key2) min+; if(60 = min)min = 0;timestr4 = min%10+0;timestr3 = min/10+0;lcd_write_char(5,1,timestr3);lcd_write_char(6,1,timestr4);lcd_write_command(0xc0+6);while(!key2); if(0 = key3) /分减1的设置 delay1ms(5);if(0 = key3) min-; if(min 0)min = 59;timestr4 = m
19、in%10+0;timestr3 = min/10+0;lcd_write_char(5,1,timestr3);lcd_write_char(6,1,timestr4);lcd_write_command(0xc0+6);while(!key3); break;case 3: if(0 = key2) /时加1的设置 delay1ms(5);if(0 = key2) hour+;while(!key2); if(24 = hour)hour = 0;timestr1 = hour%10+0;timestr0 = hour/10+0;lcd_write_char(2,1,timestr0);l
20、cd_write_char(3,1,timestr1);lcd_write_command(0xc0+3); if(0 = key3) /时减1的设置 delay1ms(5);if(0 = key3)while(!key3); hour-; if(hour 31)day=1; if(month=4|month=6|month=9|month=11) day+; if(day 30)day=1; if(month = 2) cal_year = 1;while(cal_year = 1) leap_year = (year % 4 = 0 & year % 100 != 0)|(year % 4
21、00 = 0);cal_year = 0;if(leap_year=1) day+;if(day 30)day=1; else day+;if(day 29)day=1;calculate = 0;daystr9 = day%10+0;daystr8 = day/10+0;lcd_write_char(10,0,daystr8);lcd_write_char(11,0,daystr9);lcd_write_command(0x80+11); if(0 = key3) /日减1的设置 delay1ms(5);if(0 = key3)while(!key3);calculate = 1; if(c
22、alculate = 1)if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)day-;if(day = 0)day=31; if(month=4|month=6|month=9|month=11) day-; if(day = 0)day=30; if(month = 2) cal_year = 1;while(cal_year = 1) leap_year = (year % 4 = 0 & year % 100 != 0)|(year % 400 = 0);cal_year = 0;if(leap_year=1) da
23、y-;if(day = 0)day=30; else day-;if(day = 0)day=29;calculate = 0;daystr9 = day%10+0;daystr8 = day/10+0;lcd_write_char(10,0,daystr8);lcd_write_char(11,0,daystr9);lcd_write_command(0x80+11); break;case 5: if(0 = key2) /月加1的设置 delay1ms(5);if(0 = key2)while(!key2); month+; if(13 = month)month = 1;daystr6
24、 = month%10+0;daystr5 = month/10+0;lcd_write_char(7,0,daystr5);lcd_write_char(8,0,daystr6);lcd_write_command(0x80+8); if(0 = key3) /月减1的设置 delay1ms(5);if(0 = key3)while(!key3); month-; if(month = 0)month = 12;daystr6 = month%10+0;daystr5 = month/10+0;lcd_write_char(7,0,daystr5);lcd_write_char(8,0,da
25、ystr6);lcd_write_command(0x80+8); break;case 6: if(0 = key2) /年加1的设置 delay1ms(5);if(0 = key2)while(!key2); year+; daystr3 = year%10+0;daystr2 = year/10%10+0;daystr1 = year/100%10+0;daystr0 = year/1000+0;lcd_write_char(2,0,daystr0);lcd_write_char(3,0,daystr1);lcd_write_char(4,0,daystr2);lcd_write_cha
26、r(5,0,daystr3);lcd_write_command(0x80+5);if (0 = key3) /年减1的设置 delay1ms(5);if(0 = key3)while(!key3); year-; if(year = 0)year = 2020;daystr3 = year%10+0;daystr2 = year/10%10+0;daystr1 = year/100%10+0;daystr0 = year/1000+0;lcd_write_char(2,0,daystr0);lcd_write_char(3,0,daystr1);lcd_write_char(4,0,days
27、tr2);lcd_write_char(5,0,daystr3);lcd_write_command(0x80+5); break;case 7: if(0 = key2) /星期加1的设置 delay1ms(5);if(0 = key2)while(!key2); week+; if(7 = week)week = 0;lcd_write_char(14,1,week+0);lcd_write_command(0xc0+14); if (0 = key3) /星期减1的设置 delay1ms(5);if(0 = key3)while(!key3); week-; if(week 0)week
28、 = 6;lcd_write_char(14,1,week+0);lcd_write_command(0xc0+14); break; case 8:tr0 = 1;break; /* 主函数 */void main(void)systimer0_init();lcd_init(); lcd_write_str(0,0,str1);lcd_write_str(0,1,str2);lcd_write_str(13,0,str3);speaker = 0;while (1)timechange();scan_key();naozhong();lcd_write_str(2,0,daystr);lcd_write_str(2,1,timestr);lcd_write_char(14,1,weekdata);if(1 = run
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理本科疼痛护理评估工具
- 2026年助听器 tinnitus掩蔽与耳鸣康复治疗功能集成
- 2026年工业智能算力供给边缘一体机智能网关部署方案
- 2026年增减材复合制造平台设计与工艺衔接
- 2026年消防安全设施培训
- 糖代谢的生化过程和调节
- 2026年糖尿病诊疗规范解读与病例剖析课件
- 2026年食疗艾灸养生调理内分泌课件
- 2026年社区反家暴培训
- 子宫输卵管造影在不孕女性输卵管通畅度评估中的临床实践中国专家共识总结2026
- 护患沟通人文关怀课件
- 2026小红书创作者生态报告
- 新员工职业素养提升培训课程大纲
- 毛概知识点总结全国示范课微课金奖教案(2025-2026学年)
- 物业管理规范-新产业园园区服务标准
- 2026年中国消费新图景报告
- 2026年中国两轮电动车行业发展展望及投资策略报告
- 第4课 安史之乱与唐朝衰亡 说课稿-2024-2025学年统编版(2024)七年级历史下册
- 三国演义经典三顾茅庐剧本
- 北京市房屋修缮工程计价依据-预算消耗量标准古建筑工程(下册)2021
- 2024年医学影像检查技术专升本试题(含参考答案)
评论
0/150
提交评论