基于c51功能最全的电子钟程序lcd1602_第1页
基于c51功能最全的电子钟程序lcd1602_第2页
基于c51功能最全的电子钟程序lcd1602_第3页
基于c51功能最全的电子钟程序lcd1602_第4页
基于c51功能最全的电子钟程序lcd1602_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、功能最全的电子钟【单片机】c51数字时钟(带年月日显示)摘要:本设计以单片机为核心,lcd1602显示。采用独立键盘输入能任意修改当前时间日期和设定闹钟时间。具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能主程序:/* lcd1602电子钟 */# include <reg52.h># include "lcd16024.h"sbit key1 = p20;/调整sbit key2 = p21;/加1sbit key3 = p22;/减1sbit speaker = p23;/蜂鸣器sbit key4 = p24;/闹钟设计bit cal_year =

2、1;/进入判断闰年标志位bit leap_year;/闰年标志位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" /时分秒格式

3、uint8 daystr1="2013-07-29 "/闹钟年月日格式uint8 timestr1="21:30:59 n" /闹钟时分秒格式uint8 numweek = 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;/闹钟分ch

4、ar hour1 = 23;/闹钟时uint8 day1 = 30;/闹钟日uint8 month1 = 9;/闹钟月uint16 year1 = 2013;/闹钟年uint8 weekdata1;/闹钟星期标记uint8 number = 0;/定时uint8 weekdata;/星期标记uint8 speaker_num; /整点报时次数uint8 scan_key(void);/函数声名 /* 更新lcd时间分离读取 */void timechange()/时分秒timestr7 = sec%10+'0'timestr6 = sec/10+'0'times

5、tr4 = min%10+'0'timestr3 = min/10+'0'timestr1 = hour%10+'0'timestr0 = hour/10+'0'/年月日daystr9 = day%10+'0'daystr8 = day/10+'0'daystr6 = month%10+'0'daystr5 = month/10+'0'daystr3 = year%10+'0'daystr2 = year/10%10+'0'daystr

6、1 = 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'timestr10 = hou

7、r1/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+&

8、#39;0'/* 初始化系统定时器0 */void systimer0_init(void)tmod |=0x01;/设置为1时用或(|)tmod &=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)

9、;lcd_write_command(0x0f);while(!key4);while(a)if(0 = key4)delay1ms(5);if(0 = key4)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

10、(!key1);if(number = 1)lcd_write_command(0xc0+9);lcd_write_command(0x0f);if(number = 2)lcd_write_command(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

11、;while(!key2);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); if(0 = key3) /闹钟秒减1的设置 delay1ms(5);if(0 = key3) sec1-; if(sec1 < 0)sec1 = 59;while(!key3);timestr17 = sec1%10+'0'timestr16 = s

12、ec1/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的设置 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)

13、;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 = min1%10+'0'timestr13 = min1/10+'0'lcd_write_char(5,1,timestr13);lcd_write_char(6,1,timestr14);lcd_write_command(0xc0+6);

14、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);lcd_write_char(3,1,timestr11);lcd_write_command(0xc0+3); if(0 = key3) /闹钟时减1的设置 delay1ms(5);if(0 =

15、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;lcd_write_command(0x0c);break;lcd_write_command(0x0c);while(!key4);/* 判断按键进入

16、时间调整 */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(!key1);tr0 = 0;if(number = 2)lcd_write_command(0xc0+6);lcd_write_command(0x0f);i

17、f(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(0x80+5);lcd_write_command(0x0f);if(number = 7)lcd_write_command(0xc0+14);lcd

18、_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_char(8,1,timestr6);lcd_write_char(9,1,timestr7);lcd_write_com

19、mand(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;case 2: if(0 = key2) /分加1的设置 delay1m

20、s(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 = min%10+'0&

21、#39;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_wri

22、te_char(2,1,timestr0);lcd_write_char(3,1,timestr1);lcd_write_command(0xc0+3); if(0 = key3) /时减1的设置 delay1ms(5);if(0 = key3)while(!key3); hour-; if(hour < 0)hour = 23;timestr1 = hour%10+'0'timestr0 = hour/10+'0'lcd_write_char(2,1,timestr0);lcd_write_char(3,1,timestr1);lcd_write_com

23、mand(0xc0+3); break;case 4: if(0 = key2) /日加1的设置 delay1ms(5);if(0 = key2)while(!key2);calculate = 1; if(calculate = 1)if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)day+;if(day > 31)day=1; if(month=4|month=6|month=9|month=11) day+; if(day > 30)day=1; if(month = 2) cal_year = 1;wh

24、ile(cal_year = 1) leap_year = (year % 4 = 0 && year % 100 != 0)|(year % 400 = 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,dayst

25、r9);lcd_write_command(0x80+11); if(0 = key3) /日减1的设置 delay1ms(5);if(0 = key3)while(!key3);calculate = 1; if(calculate = 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;whil

26、e(cal_year = 1) leap_year = (year % 4 = 0 && year % 100 != 0)|(year % 400 = 0);cal_year = 0;if(leap_year=1) day-;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_

27、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 = 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的设置 delay1m

28、s(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,daystr6);lcd_write_command(0x80+8); break;case 6: if(0 = key2) /年加1的设置 delay1ms(5);if(0 = key2)while(!key2); year+; daystr3 = year

29、%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_char(5,0,daystr3);lcd_write_command(0x80+5);if (0 = key3) /年减1的设置 delay1ms(5);if(0 = key3)while

30、(!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,daystr2);lcd_write_char(5,0,daystr3);lcd_write_command(0x80+

31、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 = 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)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论