本设计是51单片机的电子钟万年历LCD1602显示(proteus仿真+程序+报告+器件清单)
仿真图proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
编号C0002
资料文件下载链接: 链接:https://pan.baidu.com/s/1zOUBtNeHJ4PJWoHHbXx_Ew?pwd=gcn0 提取码:gcn0
主要功能:
1、采用LCD1602液晶屏显示,DS1302记录日历和时间。
2、按键设置日期、时间、闹钟。
3、当实际的时间达到设定的闹钟时,蜂鸣器报警。
仿真图(提供源文件):
程序(提供源文件源码):
#include//调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 bit flag_200ms ; bit flag_100ms ; sbit beep = P3^7; //蜂鸣器定义 bit flag_beep_en; uint clock_value; //用作闹钟用的 uchar menu_1,menu_2; uchar key_time,flag_value; bit key_500ms ; #include "ds1302.h" #include "lcd1602.h" void delay_1ms(uint q) { uint i,j; for(i=0;i if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); switch(week) { case 1:write_data('S');//星期数为7时,显示 write_data('U'); write_data('N'); break; case 2:write_data('M');//星期数据为1时显示 write_data('O'); write_data('N'); break; case 3:write_data('T');//星期数据为2时显示 write_data('U'); write_data('E'); break; case 4:write_data('W');//星期数据为3是显示 write_data('E'); write_data('D'); break; case 5:write_data('T');//星期数据为4时显示 write_data('H'); write_data('U'); break; case 6:write_data('F');//星期数据为5时显示 write_data('R'); write_data('I'); break; case 7:write_data('S');//星期数据为6时显示 write_data('T'); write_data('A'); break; } } void init_1602_ds1302() { write_sfm2_ds1302(1,1,shi); //显示时 write_sfm2_ds1302(1,4,fen); //显示分 write_sfm2_ds1302(1,7,miao); //显示秒 write_week(2,12,week); write_sfm2_ds1302(2,2,nian); //显示年 write_sfm2_ds1302(2,5,yue); //显示月 write_sfm2_ds1302(2,8,ri); //显示日 } void init_time0() { EA = 1; //开总中断 TMOD = 0x01; //定时器0、工作方式1 TH0 = 0x3C; TL0 = 0xB0; //50ms ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 } void menu_dis() { static uchar mm,value; if(flag_100ms == 1) //100ms执行一次 { flag_100ms = 0; if(open1 == 1) //如果闹钟打开 { if((miao == 0) && (fen == fen1) && (shi == shi1)) { flag_beep_en = 1; //有报警 打开蜂鸣器响的标志位 } if(flag_beep_en == 1) //闹钟以被打开 { clock_value++; if(clock_value <= 30) beep = ~beep; //蜂鸣器叫3秒 else if(clock_value > 30) { beep = 1; //蜂鸣器停1秒 if(clock_value > 40) { clock_value = 0; } } // 1 分钟后自动关闭闹钟 value ++; if(value >= 10) { value = 0; mm++; if(mm >= 60) { mm = 0; flag_beep_en = 0; beep = 1; } } } } } } uchar key_can; //按键值 void key() //独立按键程序 { static uchar key_new; key_can = 20; //按键值还原 P3 |= 0x78; //对应的按键IO口输出为1 if((P3 & 0x78) != 0x78) //按键按下 { delay_1ms(1); //按键消抖动 if(((P3 & 0x78) != 0x78) && (key_new == 1)) { //确认是按键按下 key_new = 0; switch(P3 & 0x78) { case 0x70: key_can = 4; break; //得到按键值 case 0x68: key_can = 3; break; //得到按键值 case 0x58: key_can = 2; break; //得到按键值 case 0x38: key_can = 1; break; //得到按键值 } } } else key_new = 1; } void key_with() { if(key_can == 1) //设置键 { menu_1++; if(menu_1 == 1) //设置时间 { menu_2 = 1; write_string(1,0," : : W: "); write_string(2,0," 20 - - "); } if(menu_1 == 2) //设置闹钟 { menu_2 = 1; write_string(1,0," set clock "); write_string(2,0," Y 00:00 "); } if(menu_1 > 2) //回到正常显示 { menu_1 = 0; write_guanbiao(1,2,0); //关闭光标 init_1602_dis_csf(); //初始化液晶显示 } } if(key_can == 2) //选择键 { flag_200ms = 1; if(menu_1 == 1) //设置时间 { menu_2 ++; if(menu_2 > 7) menu_2 = 1; } if(menu_1 == 2) //设置闹钟 { menu_2 ++; if(menu_2 > 3) menu_2 = 1; } } if(menu_1 == 1) { if(menu_2 == 1) //设置时 { if(key_can == 3) //加 { shi+=0x01; if((shi & 0x0f) >= 0x0a) shi = (shi & 0xf0) + 0x10; if(shi >= 0x24) shi = 0; } if(key_can == 4) //减 { if(shi == 0x00) shi = 0x24; if((shi & 0x0f) == 0x00) shi = (shi | 0x0a) - 0x10; shi -- ; } } if(menu_2 == 2) //设置分 { if(key_can == 3) //加 { fen+=0x01; if((fen & 0x0f) >= 0x0a) fen = (fen & 0xf0) + 0x10; if(fen >= 0x60) fen = 0; } if(key_can == 4) //减 { if(fen == 0x00) fen = 0x5a; if((fen & 0x0f) == 0x00) fen = (fen | 0x0a) - 0x10; fen -- ; } } if(menu_2 == 3) //设置秒 { if(key_can == 3) //加 { miao+=0x01; if((miao & 0x0f) >= 0x0a) miao = (miao & 0xf0) + 0x10; if(miao >= 0x60) miao = 0; } if(key_can == 4) //减 { if(miao == 0x00) miao = 0x5a; if((miao & 0x0f) == 0x00) miao = (miao | 0x0a) - 0x10; miao -- ; } } if(menu_2 == 4) //设置星期 { if(key_can == 3) //加 { week+=0x01; if((week & 0x0f) >= 0x0a) week = (week & 0xf0) + 0x10; if(week >= 0x08) week = 1; } if(key_can == 4) //减 { if(week == 0x01) week = 0x08; if((week & 0x0f) == 0x00) week = (week | 0x0a) - 0x10; week -- ; } } if(menu_2 == 5) //设置年 { if(key_can == 3) //加 { nian+=0x01; if((nian & 0x0f) >= 0x0a) nian = (nian & 0xf0) + 0x10; if(nian >= 0x9a) nian = 1; } if(key_can == 4) //减 { if(nian == 0x01) nian = 0x9a; if((nian & 0x0f) == 0x00) nian = (nian | 0x0a) - 0x10; nian -- ; } } if(menu_2 == 6) //设置月 { if(key_can == 3) //加 { yue+=0x01; if((yue & 0x0f) >= 0x0a) yue = (yue & 0xf0) + 0x10; if(yue >= 0x13) yue = 1; } if(key_can == 4) //减 { if(yue == 0x01) yue = 0x13; if((yue & 0x0f) == 0x00) yue = (yue | 0x0a) - 0x10; yue -- ; } } if(menu_2 == 7) //设置日 { if(key_can == 3) //加 { ri+=0x01; if((ri & 0x0f) >= 0x0a) ri = (ri & 0xf0) + 0x10; if(ri >= 0x32) ri = 0; } if(key_can == 4) //减 { if(ri == 0x01) ri = 0x32; if((ri & 0x0f) == 0x00) ri = (ri | 0x0a) - 0x10; ri -- ; } } write_sfm2_ds1302(1,2,shi); //显示时 write_sfm2_ds1302(1,5,fen); //显示分 write_sfm2_ds1302(1,8,miao); //显示秒 write_sfm1(1,14,week); //显示星期 write_sfm2_ds1302(2,3,nian); //显示年 write_sfm2_ds1302(2,6,yue); //显示月 write_sfm2_ds1302(2,9,ri); //显示日 switch(menu_2) // 光标显示 { case 1: write_guanbiao(1,2,1); break; case 2: write_guanbiao(1,5,1); break; case 3: write_guanbiao(1,8,1); break; case 4: write_guanbiao(1,14,1); break; case 5: write_guanbiao(2,3,1); break; case 6: write_guanbiao(2,6,1); break; case 7: write_guanbiao(2,9,1); break; } write_time(); //把时间写进去 } if(menu_1 == 2) { if(menu_2 == 1) //设置闹钟开关 { if(key_can == 3) { open1 = 1; //闹钟开 } if(key_can == 4) { open1 = 0; //闹钟关 } } if(menu_2 == 2) //设置闹钟时 { if(key_can == 3) //加 { shi1+=0x01; if((shi1 & 0x0f) >= 0x0a) shi1 = (shi1 & 0xf0) + 0x10; if(shi1 >= 0x24) shi1 = 0; } if(key_can == 4) //减 { if(shi1 == 0x00) shi1 = 0x5a; if((shi1 & 0x0f) == 0x00) shi1 = (shi1 | 0x0a) - 0x10; shi1 -- ; } } if(menu_2 == 3) //设置秒 { if(key_can == 3) //加 { fen1+=0x01; if((fen1 & 0x0f) >= 0x0a) fen1 = (fen1 & 0xf0) + 0x10; if(fen1 >= 0x60) fen1 = 0; } if(key_can == 4) //减 { if(fen1 == 0x00) fen1 = 0x5a; if((fen1 & 0x0f) == 0x00) fen1 = (fen1 | 0x0a) - 0x10; fen1 -- ; } } if(open1 == 1) write_string(2,4,"Y"); else write_string(2,4,"N"); write_sfm2_ds1302(2,7,shi1); //显示闹钟时 write_sfm2_ds1302(2,10,fen1); //显示闹钟分 switch(menu_2) // 光标显示 { case 1: write_guanbiao(2,4,1); break; case 2: write_guanbiao(2,7,1); break; case 3: write_guanbiao(2,10,1); break; } } } void main() { beep = 0; //开机叫一声 delay_1ms(150); P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1 init_time0(); //初始化定时器 //init_ds1302(); //ds1302初始化 init_1602(); //lcd1602初始化 init_1602_dis_csf(); //lcd1602初始化显示 while(1) { key(); //按键程序 if(key_can < 10) { if(flag_beep_en == 0) //只有闹钟关了的时候才能进入设置 key_with(); else { flag_beep_en = 0; //按下任意键可关闭闹钟 beep = 1; clock_value = 0; read_time(); } } if(flag_200ms == 1) { flag_200ms = 0; if(menu_1 == 0) { read_time(); //读时间 init_1602_ds1302(); //显示时钟 } } menu_dis(); //闹钟报警函数 delay_1ms(1); } } void time0() interrupt 1 { static uchar value; TH0 = 0x3C; TL0 = 0xB0; //50ms value ++; if((value % 2) == 0) //100ms flag_100ms = 1; if(value >= 6) //200ms { value = 0; flag_200ms = 1; } }
设计说明书



