本设计是51单片机的电子钟万年历LCD1602显示(proteus仿真+程序+报告+器件清单)
仿真图proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
编号C0002

资料文件下载链接:
//https://docs.qq.com/doc/DS1NveWlLc0VXbGlI

主要功能:
1、采用LCD1602液晶屏显示,DS1302记录日历和时间。
2、按键设置日期、时间、闹钟。
3、当实际的时间达到设定的闹钟时,蜂鸣器报警。

仿真图(提供源文件):

程序(提供源文件源码):

#include <reg52.h>          //调用单片机头文件
#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"
/******************1ms 延时函数*******************/
void delay_1ms(uint q)
{uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);
}
/******************写星期函数*******************/
void write_week(uchar hang,uchar add,uchar week)//写星期函数
{if(hang==1)   write_com(0x80+add);elsewrite_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);     //显示日
}
/*************定时器0初始化程序***************/
void init_time0()
{EA   = 1;       //开总中断TMOD = 0X01;     //定时器0、工作方式1TH0 = 0X3C;TL0 = 0XB0;     //50msET0  = 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口输出为1if((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口初始化为1init_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);}
}/**************定时器0中断程序*****************/
void time0() interrupt 1
{            static uchar value;TH0 = 0X3C;TL0 = 0XB0;       //50msvalue ++;       if((value % 2) == 0)    //100ms  flag_100ms = 1;   if(value >= 6)          //200ms{value = 0;flag_200ms = 1;}
}


设计说明书

1课题设计制作要求
本文介绍了基于STC89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、时间处理模块和调整设置模块四个模块组成。系统以STC89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时等多种功能。万年历采用直观的数字显示,数据显示采用1602A液晶显示模块,可以在LCD上同时显示年、月、日、周、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。
2 系统方案设计
2.1系统设计框图

图2.1 系统框图

2.2 电子时钟工作流程
1、采用DS1302记录日历和时间。
2、按键设置时间、闹钟。
3、当实际的时间达到设定的闹钟时,蜂鸣器报警。
2.3 电源模块
单片机外围电路,包括单片机最小系统、液晶显示、按键电路、蜂鸣器控制电路以及DS1302采集时间日历都需要进行供电,本系统设计采用USB供电。
2.4 显示部分
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。显示字母和数字比较方便,控制简单,成本较低。我们设计的系统需要显示更多的信息,所以考虑显示功能更好的液晶显示,要求能显示更多的数据,增强显示信息的可读性,看起来方便。本设计采用1602液晶显示器来显示数据。
2.5 DS1302电路
方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.
由于DS1302时钟芯片计数时间精度高,而且具有闰年补偿功能等优点,故采用方案二。
2.6 报警输出控制
方案一:采用有源蜂鸣器。有源蜂鸣器工作的理想信号是直流电,通常标示为VDC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从面实出磁场交变,带动钼片振动发音。但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
方案二:采用无源蜂鸣器。无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给预直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。
本系统最后选取的是操作方便,信号输入固定的有源蜂鸣器。

基于51单片机的电子钟万年历LCD1602显示相关推荐

  1. 基于51单片机驱动ADXL346 (LCD1602显示)

    基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...

  2. 基于51单片机驱动MPU6050模块(LCD1602显示)

    @TOC 一.简介 MPU-6050集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用IIC接口连接一个第三方的数字传感器.MPU-6050对陀螺仪和加速度计分 ...

  3. 基于51单片机+红外遥控解码+LCD1602显示

    红外遥控解码(NEC) 基本介绍 什么是红外线? 红外线系统的组成 发射管和接收管 红外遥控发射(载波频率) 重要介绍 NEC协议 数据格式(必看) 位定义(必看) 编写程序思路(2种) 方式一 方式 ...

  4. 基于51单片机的电子万年历的设计-源代码

    电子万年历的设计目录 电子万年历的设计 电子万年历的系统整体设计框图 所需要的元件 DS18B20模块 DS18B20的特点 DS18B20内部结构 DS18B20管脚排列 DS1302模块 SPI时 ...

  5. 基于51单片机的电子万年历设计

    基于51单片机的电子万年历 1)LCD1602显示时间.日期.星期.温度 2)按键可调整时间日期星期 3)整点报时 4)DS1302时钟芯片 5)DS18B20温度传感器 6)闹钟功能 7)判断闰年 ...

  6. 【002】基于51单片机的电子万年历proteus仿真设计

    一.资料内容(私信获取) (1).基于51单片机的电子万年历proteus仿真设计一份: (2).基于51单片机的电子万年历proteus仿真设计keli源代码一份: (3).基于51单片机的电子万年 ...

  7. 简易电子钟c语言程序,(最新整理)基于51单片机的电子钟C语言程序

    <(最新整理)基于51单片机的电子钟C语言程序>由会员分享,可在线阅读,更多相关<(最新整理)基于51单片机的电子钟C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.完整) ...

  8. 【Proteus仿真】51单片机汇编实现DS18B20+LCD1602显示

    [Proteus仿真]51单片机汇编实现DS18B20+LCD1602显示 Proteus仿真 汇编代码(.asm) ;**************************************** ...

  9. 万年历设计单片机c语言,基于51单片机的电子万年历的设计

    基于51单片机的电子万年历的设计(论文9400字) 功能要求 1. 万年历能用数码管显示阳历年.月.日.星期.[小]时.分.秒并设置指定时间的闹铃. 2. 数字式温度计要求测温范围-50~100°C, ...

最新文章

  1. 接口测试工具postman安装及使用
  2. java at发短信_发送短信(1)
  3. tomcat的缺少tcnative-1.dll的解决
  4. java outlook 发送邮件_基于java使用JavaMail发送邮件
  5. 【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)
  6. Canvas-drawImage 绘制图片模糊问题
  7. 军事卫星行业调研报告 - 市场现状分析与发展前景预测
  8. Dubbo zookeeper 初探【转】
  9. SpringBoot 修改仓库
  10. 学习汇编对编程有什么帮助?如何学习
  11. 公网部署freeswitch1.8.6后,终端注册成功后,在fs_cli控制台执行originate user/1000 echo,呼通1000的SIP终端后,终端讲话没有收到fs的回声解决方法
  12. 为什么特斯拉Q2业绩能超预期?
  13. HTML5期末大作业:动漫网站设计——福五鼠动漫(6页)带轮播特效 高质量代码 HTML+CSS+JavaScript 毕设网页设计HTML
  14. 【045】国家标准全文公开系统-GB和GB/T国家标准库
  15. php文件怎么打开?怎么打开PHP文件?
  16. 区块链中的“链上”和“链下”
  17. 跆拳道培训机构如何用抖音快手做推广
  18. MFC绘制双有理Bezier曲面
  19. linux中安装redis报错
  20. WCF 绑定(Binding)

热门文章

  1. 棋盘(Checkerboard)算法
  2. SQL Server 2005无日志文件附加数据库
  3. tadb.exe、sjk_daemon.exe导致 adb.exe启动失败
  4. BG2RHE - 树莓派3B+外置wifi解决金属外壳屏蔽问题
  5. android 设置文本加粗,如何在Android中将文本更改为粗体?
  6. 基础算法题:723. PUM
  7. IntelliJ IDEA pycharm webstorm 激活
  8. Hbuilder 历次版本更新记录
  9. Consul 踩坑日记,节点id冲突
  10. emmx文件用什么软件打开电脑_我告诉你emmx文件怎么打开